【发布时间】:2015-07-10 16:49:22
【问题描述】:
这是我的查询——最后一个查询是让我感到痛苦的原因: address.postcode 字段是一个varchar(14),可以看到用户发送的输入格式。
DECLARE @ZipCode NVARCHAR(MAX) = ('06409;06471;11763;06443;06371;11949;11946;11742')
IF OBJECT_ID('tempdb..#ZipCodes') IS NOT NULL DROP TABLE #ZipCodes;
CREATE TABLE #ZipCodes (
Zipcode NVARCHAR(6)
)
INSERT INTO #ZipCodes ( Zipcode )
SELECT zip.Token + '%'
FROM DMS.fn_SplitList(@ZipCode, ';') zip
CREATE NONCLUSTERED INDEX [idx_Zip] ON #ZipCodes (Zipcode)
IF OBJECT_ID('tempdb..#ZipCodesConstituents') IS NOT NULL DROP TABLE #ZipCodesConstituents;
CREATE TABLE #ZipCodesConstituents (
ConstituentID UNIQUEIDENTIFIER
, PostCode NVARCHAR(12)
)
CREATE NONCLUSTERED INDEX [idx_ZipCodesConstituents] ON #ZipCodesConstituents (ConstituentID, PostCode)
INSERT INTO #ZipCodesConstituents ( ConstituentID, PostCode )
SELECT a.CONSTITUENTID
, a.POSTCODE
FROM #ZipCodes zip
JOIN DMS.address a
ON a.POSTCODE LIKE zip.Zipcode
where a.ISPRIMARY = 1
我正在尝试附上执行计划——但没有任何运气... 基本上这部分代码的 Est Cost 为 61.9% 排序为 61.5%
【问题讨论】:
-
问题是什么?
-
我想提高性能,但排序导致供过于求。想知道如何摆脱排序或其他优化方式的任何想法。
-
为什么要在插入之前创建索引?我不知道没有执行计划的排序,但是有索引会减慢每次插入的速度,因为系统必须为插入的每一行更新索引。这实际上可能是导致排序的原因,因为 sql 正在寻找一种方法来最小化索引的影响。
-
哇,就是这么简单。排序不见了。谢谢@Randall Matthews!
-
哦,但现在我回到了原来的问题,我对 DMS.ADDRESS 表进行了巨大的索引扫描并提取了 150,485,448 行,但表插入只有 10,313 行。出于某种原因,尽早添加该索引可以防止这种情况发生....基本上,该计划显示使用索引 idx_zip 对#ZipCodes 进行索引扫描 - 并使用索引对 ADDRESS 进行索引扫描,但提取地址中的所有行 - 然后是嵌套循环内连接,然后插入到表中#ZipCodesConstituents --- 有什么想法可以摆脱我的 FAT 箭头?