【发布时间】:2012-10-30 13:54:01
【问题描述】:
我在本地机器上有两个数据库,连接到localhost。它们每个都有大约 200 万行。我正在执行以下非常简单的连接,并且需要一分钟多的时间才能完成。
select distinct x.patid
from [i 3 sci study].dbo.clm_extract as x
left join [i 3 study].dbo.claims as y on y.patid=x.patid
where y.patid is null
当我查看执行计划时,我看到 join showplan 运算符有这样的说法
与两个表中的实际行数相比,为什么实际行数如此高?
【问题讨论】:
-
每个表实际上有多少行?任何一个表都有关于 patid 的索引吗?
-
每桌 200 万。我没有在 patid 上包含索引,因为 SQL Server 建议的缺失索引包含五个字段
-
所以没有索引,您想知道为什么尝试将一侧的 200 万行匹配到另一侧的 200 万行的查询速度很慢?具有多于一列的索引有什么问题?你的意思是索引有五列,还是直接使用 INCLUDE 来带来五个额外的列?
-
实际上是 7.61 亿行。而且估计要差得多。您的查询有一个更好的模型(尝试不存在),但如果您主要关心的是优化此查询,我会考虑仅在两侧的 patid 列上建立索引(忘记您从 Management Studio 获得的 INLCUDE 废话垃圾索引推荐)。
-
where not exists 将执行时间从 65 秒缩短到 1 秒。
标签: sql sql-server performance tsql