1
11
因为您有两组数据,按相同的值排序。您尝试过合并联接而不是嵌套循环联接吗?
编辑: 这些解释是概念性的。SQL Server可能正在执行比我的示例所显示的更复杂的操作。这种概念上的理解,与通过设置统计命令测量时间和逻辑IO以及检查查询执行计划相匹配,构成了我的查询优化技术(四年以上)的基础。愿它能为你服务,也能为我服务。 安装程序
嵌套环
嵌套循环算法迭代父数据集,然后为每个父数据集搜索子数据集一次,使其开销为:m*log(n) 合并
合并联接算法将父数据集迭代一次,子数据集迭代一次,开销为:m+n。它依赖于要排序的数据。如果您请求对未排序的数据进行合并联接,则会引发一个排序操作!这会将成本增加到(m*log(m))+(n*log(n))+m+n。在某些情况下,甚至可能比嵌套循环更好。 搞砸
哈希连接算法对父数据集和子数据集进行一次迭代,使其开销为:m+n。它依赖一个足够大的卡表来保存父数据集的全部内容。 |
2
6
如果您经常运行这个查询,并且它需要非常快,那么就为它创建一个物化的索引视图。在插入/更新/删除时会有一些开销,但这个查询将是即时的。聚合可以预先计算并存储在索引中,以便在查询执行期间最小化昂贵的计算。 |
3
2
真正的问题是嵌套循环联接。对于地址表中的140万行,您要对可审核表进行索引查找。也就是说,根块、分支块和叶块总共读取4.2米的块。整个索引大概只有5千块左右…它应该进行哈希联接,这样它只读取两个索引一次,并通过它们进行哈希。 如果你认为这些桌子很大,我猜这是在一个没有很多内存的小盒子上。您需要确保分配了足够的内存,以便将整个索引放入内存中,以使哈希连接有效。 |
4
1
auditable.uniqueid是否是对address.uniqueid的外键引用,这意味着auditable中没有地址中不存在的值? 如果是这样,这可能有效,而且可能更快:
注意:这还假定uniqueid在地址表中是唯一的(/primary key),但在可审核表中不是唯一的。 |
5
1
与内部联接相比,该子句的运行成本更低。
这个适合你的需要吗? N.B.guid对于数据库引擎来说非常昂贵。 |
6
0
不确定是否会更快,但您可以尝试以下操作
它应该给您相同的计数,因为unqieid永远不会为空。 |
7
0
我想说的是,在外键上缺少索引。
|
8
0
对于这些大型表,您可能希望对数据进行分区以提高查询性能。此外,如果还没有,请尝试运行优化顾问,查看是否还有其他索引可能对您有利。此外,您最近是否重新组织了集群索引——这是维护包的一部分吗?很多时候,这也会大大提高你的表现。 |
Duvan · 将逗号(,)替换为点(.)[副本] 2 年前 |
Mateen Bagheri · 选择表的计数并选择其自身 2 年前 |
SoT · SQL Server中求和函数的工作方式 2 年前 |
NKAT · 将列值聚合到列表中会产生错误 2 年前 |
deanpillow · 返回两列中有一个匹配值的记录 2 年前 |
snowflakes74 · 在Dapper中异步查询多个结果 2 年前 |