|
|
1
2
基于表名(dim*和fact*),我假设您正在数据仓库模式上进行排序报告。假设是这种情况,那么您可以做的最好的事情是提高性能的是考虑使用CurnSt店索引(和批处理模式执行,这是隐式的,一旦您启用CyrnSt店)。这些索引被严重压缩,通常会在受IO限制的工作负载上显著提高性能。事实表通常是候选的,因为它们最大/通常不适合缓冲池。 SQL 2016以后的所有版本都支持Columnstores,而Enterprise Edition则更快(更并行,更快的内部操作,如使用SIMD指令等)。请注意,它们不直接支持主键,因此这可能会稍微影响表的布局。您可以创建键(在内部作为b-树二级索引),因此如果使用主键,会损失一些节省的空间。通常情况下,事实表+列存储还使用分区来获得另一层过滤,而无需二级索引。 请考虑使用CalnnSt店替换事实表(可能在数据库的副本上进行实验)再次尝试查询。当您查看生成的查询计划时,我建议您也查看操作符是否以批处理模式运行。批处理模式运算符与行模式运算符不同。批处理模式针对现代CPU的体系结构进行了优化,以最小化CPU内外的内存流量。粗略地说,columnstores+批处理模式可能会产生10倍到100倍的差异。 |
|
|
2
0
唯一能帮你的过滤器是“where dim_date”。dimDateId>=X' 这就产生了一个到cte的连接,cte字段由三个表组成,它们相互连接。为了获得最佳性能,我会选择一步一步地告诉sql应该做什么,否则按照最佳计划执行是非常危险的:
通过这种方式,您可以确保在尽可能简单的步骤中直接过滤所需的内容,然后复杂的查询将在预设的行数下工作,因此性能是有保证的,因为应用于几行的非常好或非常差的计划实际上并不重要。 较小的细节:注意“内部连接dim_status”——如果没有FK约束,基数估计器可能会错过估计的返回行,因为无法理解表之间的关系。 我还可以看到优化的尝试,因为过滤器已经上升到cte中。这是一个类似于我提议的计划,但限制较小。使用我的计划将强制对核心根源执行行搜索。 |
|
John D · 需要为NULL或NOT NULL的WHERE子句 1 年前 |
|
Marc Guillot · 记录值时忽略冲突 1 年前 |
|
|
Fachry Dzaky · 正确使用ROW_NUMBER 1 年前 |
|
|
TriumphTruth · 从满足特定条件的数据集中选择1行 1 年前 |