有效的哈希或代表一组记录的东西
Posted
技术标签:
【中文标题】有效的哈希或代表一组记录的东西【英文标题】:Efficient hash or something which represents a set of records 【发布时间】:2021-09-08 16:52:01 【问题描述】:想象一下 SQL Server 中包含以下列的表(这是一种简化):
ID: int
Dimension1: int
Dimension2: int
Dimension3: string
Dimension4: string
...
Dimension30: string
表可以变得很大(数百万条记录)。我们经常做这样的查询:
select ID from Table where Dimension1 = 1 and Dimension2 = 2
SQL Server 很容易迷失在这样的标准中并选择错误的查询计划 => 性能问题。
我想知道是否有一些智能散列函数或类似的东西可以像这样有效地在表中搜索? IE。因此,当我们想要查找所有符合 Dimension1
和 Dimension2
标准的记录时,我们会过滤一些单一的条件,这样就可以了解要返回的记录。
【问题讨论】:
SQL Server 不容易迷失在这样的琐碎标准中,只是常常别无选择。您是否有涵盖所有combinations 过滤器的索引?是的,you can 存储过滤器值组合的哈希值,但是对于每个可能的组合,它必须是一个单独的列,所以只需有一堆索引。 【参考方案1】:对于这个查询:
select ID from Table where Dimension1 = 1 and Dimension2 = 2
您希望在(Dimension1, Dimension2)
上建立索引。顺序无关紧要,您也可以添加ID
。
我不确定您所说的“迷失在标准中”是什么意思。我很确定 SQL Server 在这种情况下会识别出正确的索引,无论您有多少索引。
您可能有一个更复杂的WHERE
子句。特别是如果它包含更多条件(特别是如果这些条件由 OR
连接),那么索引可能无法正常工作。
我怀疑您的实际 查询 更复杂,而不是 SQL Server 变得“混乱”。
【讨论】:
【参考方案2】:如果您真的经常这样做,并且您有一些可用的内存,并且您能够捕获对 dim1 和 dim2 的所有更改,那么您可以在外部进行。
完全未经测试的代码 C++ 代码
using DimType = int;
using DimVec = std::vector<DimType>;
DimVec dim1, dim2; // prefilled and sorted
using intVit = DimVec ::const_iterator;
// in case we don´t have std::span
using spanV = std::pair<intVit, intVit>;
spanV FindValue(const DimType& vec, DimType value)
// is_sorted(vec)
return std::lower_bound(vec.begin(), vec.end(), value),
std::upper_bound(vec.begin(), vec.end(), value) ;
DimVec Intersection(spanV set1, spanV set2)
// is_sorted(set1) && is_sorted(set2)
DimVec res;
res.resize(std::min(set1.size()), set2.size());
auto last=std::set_intersection (set1.first, set1.second, set2.first, set2.second, res.begin());
v.resize(last-res.begin());
return res;
DimVec Intersection(const DimVec& set1, DimVec& set2, DimType value1, DimType value2)
return Intersection(FindValue(set1, value1), FindValue(set2, value2));
添加模板以进行概括。
FindValue 是 O(lg N),set_intersection 是 O(N)。
【讨论】:
以上是关于有效的哈希或代表一组记录的东西的主要内容,如果未能解决你的问题,请参考以下文章