开发者社区 问答 正文

DATE和TINYINT之间的性能差异

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慢得多。

展开
收起
祖安文状元 2020-01-05 18:02:18 408 分享 版权
1 条回答
写回答
取消 提交回答
  • 根据计划,似乎发生了什么事,tinyint的行为就像它可以执行哈希联接,而日期却无法执行。这对我来说很有意义,因为tinyint太小了,它基本上是哈希的大小,可以用作本地哈希。我认为这是正在发生的事情。

    如果我是对的,则很容易解决,只需在第一个表的日期字段上创建一个非唯一索引即可。应该快很多。

    只是指出目标是否是查找具有多个这些值之一的项目,您可以使用分组依据并具有-像这样:

    SELECT COUNT(*)
    FROM #Carrier_DOB
    GROUP BY Cohort_Person_ID
    HAVING COUNT(DISTINCT DOB_DT) >
    1```  
    
    2020-01-05 18:02:28
    赞同 展开评论
问答分类:
问答地址: