sql - 有效的哈希或代表一组记录的东西
问题描述
想象一下 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 很容易迷失在这样的标准中并选择错误的查询计划 => 性能问题。
我想知道是否有一些智能哈希函数或类似的东西可以像这样有效地在表中搜索?也就是说,当我们想要查找所有带有Dimension1
和Dimension2
标准的记录时,我们过滤一些单一的并且能够理解要返回的记录。
解决方案
如果你真的经常这样做并且你有一些内存可用并且你能够捕捉到对 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)。
推荐阅读
- html - 具有 3 列的引导页面表单输入(对称)
- dynamic - Indesign 中的动态注释
- c - 如何在 Linux(CentOS8) 64bit 上打印 unsigned char 类型指针的值
- flutter - 我是否正确使用了“Isolate”和“CachedNetworkImage”?
- excel - 如何使用 VB6/VBA 更改任何多行控件(如 Listbox、Listview 或 Flexgrid)中选定文本的颜色?
- c++ - 为模板类重载友元运算符>>
- javascript - Javascript - 向集合中的所有对象发送事件
- sql - 在 SQL 中将日期时间转换为日期时,我应该使用 DATE() 还是 CONVERT(date, column)?
- java - Spring Webflux - 基于 TLSv1.2 的 WebClient
- javascript - 使用 NodeJS 服务器时,哪里更适合渲染 HTML?