以下查询用于在商业智能仪表板中创建饼图。查询运行并返回正确的数据,但速度非常慢(约36秒)。任何人都可以看到优化此查询的方法吗?
SELECT
Name,
Date,
Severity,
PMissing
FROM
(
SELECT
Name,
Date,
Severity,
PMissing,
DENSE_RANK() OVER (PARTITION BY Name ORDER BY ate DESC) AS Rnk
FROM PctbyP
WHERE (Name like '%front-%'
OR Name like '%back-%'
OR Name like '%ap-%'
OR Name like '%mps-%'
OR Name like '%mg-%')
)t
WHERE rnk=1
AND PMissing != '0'
答案 0 :(得分:3)
在%pattern%形式的text列上执行模式匹配会强制扫描与外部WHERE条件匹配的所有记录(如果Name上有索引,则无论如何都无法使用它)。
我猜测你的WHERE标准不是很有选择性,这意味着正在扫描表中的大量行以查看它们是否符合LIKE标准。
如果我的假设是正确的,那么通过使用全文搜索而不是LIKE,您可能会看到显着的性能提升
http://msdn.microsoft.com/en-us/library/ms142571.aspx
针对大量非结构化文本数据的LIKE查询比针对相同数据的等效全文查询慢得多。对数百万行文本数据的LIKE查询可能需要几分钟才能返回;而对于相同的数据,全文查询只需几秒或更短时间,具体取决于返回的行数。
答案 1 :(得分:1)
创建索引视图:
CREATE VIEW
V_PctbyP_Name
WITH SCHEMABINDING
AS
SELECT Name, COUNT_BIG(*) AS Cnt
FROM dbo.PctbyP
GROUP BY
Name
CREATE UNIQUE CLUSTERED INDEX
UX_V_PctbyP_Name
ON V_PctbyP_Name (Name)
,然后在表格上创建一个索引:
CREATE INDEX
IX_PctbyP_Name_Date
ON PctbyP (Name, [Date])
,然后使用此查询:
SELECT pa.*
FROM V_PctbyP_Name vp
CROSS APPLY
(
SELECT TOP 1 WITH TIES
Name, [Date], Severity, PMissing
FROM PctbyP p
WHERE p.Name = vp.Name
ORDER BY
[Date] DESC
) pa
WHERE (
vp.Name LIKE '%front-%'
OR
vp.Name LIKE '%back-%'
OR
vp.Name LIKE '%ap-%'
OR
vp.Name LIKE '%mps-%'
OR
vp.Name LIKE '%mg-%'
)
AND pa.PMissing <> '0'