【发布时间】:2018-12-07 00:28:52
【问题描述】:
一位同事在使用 Microsoft SQL Server 的企业工作。他们的团队创建了每天执行的存储过程以创建数据提取。基础表很大(有些有数十亿行),因此大多数存储过程的设计是首先它们仅将这些巨大表的相关行提取到临时表中,然后将临时表相互连接并与其他较小的表以创建最终提取。类似的东西:
SELECT COL1, COL2, COL3
INTO #TABLE1
FROM HUGETABLE1
WHERE COL4 IN ('foo', 'bar');
SELECT COL1, COL102, COL103
INTO #TABLE2
FROM HUGETABLE2
WHERE COL14 = 'blah';
SELECT COL1, COL103, COL306
FROM #TABLE1 AS T1
JOIN #TABLE2 AS T2
ON T1.COL1 = T2.COL1
LEFT JOIN SMALLTABLE AS ST
ON T1.COL3 = ST.COL3
ORDER BY T1.COL1;
一般来说,临时表在创建后不会被修改(因此没有后续的 ALTER、UPDATE 或 INSERT 操作)。出于讨论的目的,我们假设临时表仅在以后使用一次(因此只有一个 SELECT 查询会依赖它们)。
这里的问题是:在这些临时表创建之后和在后续查询中使用它们之前对它们进行索引是一个好主意吗?
我的同事认为创建索引将使联接和排序操作更快。但是,我相信总时间会更长,因为创建索引需要时间。换句话说,我假设除了边缘情况(比如临时表本身非常大,或者最终的 SELECT 查询非常复杂),SQL Server 将使用它在临时表上的统计信息来优化最终查询,这样做会有效地索引临时表,因为它认为合适。
换句话说,我习惯于认为创建索引只有在您知道该表经常使用时才有用;存储过程完成后删除的一次性临时表不值得索引。
我们对 SQL Server 优化器的了解都不够,无法知道我们在哪些方面是对的或错的。您能否帮助我们更好地理解我们的哪些假设更接近事实?
【问题讨论】:
标签: sql-server stored-procedures indexing temp-tables