2个类似的查询导致完全不同的执行时间。
我有2个类似的表格。它们之间的唯一区别是,一个包含DATE数据类型,另一个包含TINYINT。这是表格的样子。它们是临时表,主键是唯一索引。
CREATE TABLE #Carrier_DOB(
Carrier_Record_ID INT NOT NULL PRIMARY KEY CLUSTERED,
DOB_DT DATE NOT NULL,
Cohort_Person_ID INT NULL
)
CREATE INDEX IX_Carrier_DOB ON #Carrier_DOB(Cohort_Person_ID)
CREATE TABLE #Carrier_Race(
Carrier_Record_ID INT NOT NULL PRIMARY KEY CLUSTERED,
BENE_RACE_CD TINYINT NOT NULL,
Cohort_Person_ID INT NULL
)
CREATE INDEX IX_Carrier_Race ON #Carrier_Race(Cohort_Person_ID)
这是通过sp_spaceused进行的内容:
name rows reserved data index_size unused
#Carrier_DOB 75836908 2038528 KB 2029088 KB 7456 KB 1984 KB
#Carrier_Race 72139975 1647744 KB 1639552 KB 6016 KB 2176 KB
这是我很好奇的查询:
--Query1
SELECT *
INTO #DOB_Differences
FROM #Carrier_DOB
WHERE Cohort_Person_ID IN (
SELECT a.Cohort_Person_ID FROM #Carrier_DOB a
INNER JOIN #Carrier_DOB b
ON b.Cohort_Person_ID = a.Cohort_Person_ID
AND b.DOB_DT <> a.DOB_DT
GROUP BY a.Cohort_Person_ID ) --466464 rows in 19:30
--Query2
SELECT #
INTO #Race_Differences
FROM #Carrier_Race
WHERE Cohort_Person_ID IN (
SELECT a.Cohort_Person_ID FROM #Carrier_Race a
INNER JOIN #Carrier_Race b
ON b.Cohort_Person_ID = a.Cohort_Person_ID
AND b.BENE_RACE_CD <> a.BENE_RACE_CD
GROUP BY a.Cohort_Person_ID ) -- 3476884 rows in 0:13
这两个查询之间的主要区别是,一个正在比较DATE字段,另一个正在比较CHAR(1)。我很惊讶Query1需要19分钟,而Query2仅花费13秒。这正常吗?我通常不处理7500万行表,因此我以前从未注意到过。我没有添加更多索引,因为这只是我过程中的一步。这是查询计划。它们是完全不同的,但是我不明白为什么。这是实际的查询计划以及我添加的索引,如上所述。索引将两个查询的时间缩短为12:24分钟,但是我仍然不明白为什么Query1比Query1慢得多。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
根据计划,似乎发生了什么事,tinyint的行为就像它可以执行哈希联接,而日期却无法执行。这对我来说很有意义,因为tinyint太小了,它基本上是哈希的大小,可以用作本地哈希。我认为这是正在发生的事情。
如果我是对的,则很容易解决,只需在第一个表的日期字段上创建一个非唯一索引即可。应该快很多。
只是指出目标是否是查找具有多个这些值之一的项目,您可以使用分组依据并具有-像这样:
SELECT COUNT(*)
FROM #Carrier_DOB
GROUP BY Cohort_Person_ID
HAVING COUNT(DISTINCT DOB_DT) >
1```