【发布时间】:2019-04-13 21:09:06
【问题描述】:
我对一个表的查询很慢。
SELECT (some columns)
FROM Table
此表有一个 ID (integer, identity (1,1)) 主索引,这是此表上的唯一索引。
查询有一个WHERE 子句:
WHERE Field05 <> 1
AND (Field01 LIKE '%something%' OR Field02 LIKE '%something%' OR
Field03 LIKE'%something%' OR Field04 LIKE'%something%')
-
Field05是bit, not null -
Field01是NVarchar(255) -
Field02是NVarchar(255) -
Field03是Nchar(11) -
Field04是Varchar(50)
执行计划显示“聚集索引扫描”导致执行缓慢。
我尝试添加索引:
CREATE NONCLUSTERED INDEX IX_Aziende_RagSoc ON dbo.Aziende (Field01);
CREATE NONCLUSTERED INDEX IX_Aziende_Nome ON dbo.Aziende (Field02);
CREATE NONCLUSTERED INDEX IX_Aziende_PIVA ON dbo.Aziende (Field03);
CREATE NONCLUSTERED INDEX IX_Aziende_CodFisc ON dbo.Aziende (Field04);
CREATE NONCLUSTERED INDEX IX_Aziende_Eliminata ON dbo.Aziende (Field05);
同样的表现,执行计划再次显示“聚集索引扫描” 我删除了这 5 个索引,只添加了一个索引:
CREATE NONCLUSTERED INDEX IX_Aziende_Ricerca
ON Aziende (Field05)
INCLUDE (Field01, Field02, Field03, Field04)
性能相同,但在这种情况下执行计划会发生变化。
更复杂但总是很慢。
我删除了这个索引并添加了一个不同的索引:
CREATE NONCLUSTERED INDEX IX_Aziende_Ricerca
ON Aziende (Field05,Field01,Field02,Field03,Field04)
相同的性能,在这种情况下,执行计划与之前的情况保持一致。
执行总是很慢。
我没有其他想法......有人可以帮忙吗?
【问题讨论】:
-
使用
LIKE '%something%'和前导%会使这些列上的索引无用 - SQL Server 永远无法在此类比较中使用任何索引。 -
有趣的......和非常糟糕的新......
-
你可以试试
CREATE NONCLUSTERED INDEX IX_Aziende_Ricerca ON Aziende (Field05,Field01,Field02,Field03,Field04) INCLUDE (some columns) WHERE Field05 <> 1,不过这里确实没什么可优化的。
标签: sql sql-server optimization indexing