Metaphor Asked: 2016-09-16 08:16:31 +0800 CST2016-09-16 08:16:31 +0800 CST 2016-09-16 08:16:31 +0800 CST 解决 BETWEEN join - eager spool 的性能问题 772 此查询(匿名)执行大约需要 2 分钟。 SELECT ly.Col1 ,sr.Col2 ,sr.Col3 ,sr.Col4 INTO TempDb..TempLYT FROM Tempdb..T1 ly JOIN TempDb..T2 sr on sr.[DateTimeCol] BETWEEN ly.DateTimeStart and ly.DateTimeEnd WHERE sr.Col5 = 1 OR sr.Col5 = 2 是否有一些替代方法可以帮助此查询? 应用 Paul White 建议的索引后,查询计划如下所示: sql-server performance 1 个回答 Voted Best Answer Paul White 2016-09-16T09:03:02+08:002016-09-16T09:03:02+08:00 确保您在 T1 上有一个索引,例如: CREATE INDEX i ON T1 (dtstart, dtend) INCLUDE (col1); 您可能会反转键列,具体取决于哪个对您的数据集更具选择性。 优化器倾向于为其中一个不等式引入一个急切的假脱机,并将第二个不等式留在过滤器中。重现: CREATE TABLE #T1 (col1 integer, dtstart datetime, dtend datetime); CREATE TABLE #T2 (col2 integer, col3 integer, col4 integer, col5 integer, dtcol datetime); UPDATE STATISTICS #T1 WITH ROWCOUNT = 5000; UPDATE STATISTICS #T2 WITH ROWCOUNT = 100000; SELECT T1.col1, T2.col2, T2.col3, T2.col4 FROM #T1 AS T1 JOIN #T2 AS T2 ON T2.dtcol BETWEEN T1.dtstart AND T1.dtend WHERE T2.col5 IN (1, 2) OPTION (QUERYTRACEON 8690); -- No perf spool 随着指数: 自然地,搜索仅针对第一个索引列。第二个是剩余谓词。 通常,间隔查询很难优化。Dejan Sarka 和 Itzik Ben-Gan 对这个话题有一些很好的报道: SQL Server 中的间隔查询第 4 部分- Dejan SQL Server 中的间隔查询- Itzik
确保您在 T1 上有一个索引,例如:
您可能会反转键列,具体取决于哪个对您的数据集更具选择性。
优化器倾向于为其中一个不等式引入一个急切的假脱机,并将第二个不等式留在过滤器中。重现:
随着指数:
自然地,搜索仅针对第一个索引列。第二个是剩余谓词。
通常,间隔查询很难优化。Dejan Sarka 和 Itzik Ben-Gan 对这个话题有一些很好的报道: