2012-03-23 214 views
0

我有这样的SQL视图SQL视图非常缓慢执行

SELECT  
    dbo.CustomFilterDetails.CustomFilterID, 
    dbo.ItemCustomParameters.CustomFilterDetailsID, 
    dbo.Item.ItemID 
FROM   
    dbo.ItemCustomParameters 
INNER JOIN 
    dbo.CustomFilterDetails ON dbo.ItemCustomParameters.CustomFilterDetailsID = dbo.CustomFilterDetails.CustomFilterDetailsID 
INNER JOIN 
    dbo.Item ON dbo.Item.ItemName LIKE dbo.ItemCustomParameters.Value 
INNER JOIN 
    dbo.ItemParameter ON dbo.ItemParameter.ItemID IS NULL 
         OR dbo.ItemParameter.Value LIKE dbo.ItemCustomParameters.Value 
         OR dbo.ItemParameter.Name LIKE dbo.ItemCustomParameters.Name 

为什么如此慢的工作?

+2

喜欢和ORs,也许。或者缺乏索引。 – 2012-03-23 15:09:58

+0

尝试用WHERE子句替换JOIN子句。它应该更快.. – 2012-03-23 15:10:03

+1

Wee需要更多的信息来回答这个问题。表格定义,索引,执行计划等 – Lamak 2012-03-23 15:11:06

回答

0

您不需要从视图中调用索引。索引用于对表格中的数据进行排序并存储它们,这些数据将随时可用。这对提高性能有很大的帮助。只需创建索引并运行此视图并查看它是否有所作用

1

您的问题是此查询中的LIKE子句。 LIKE用于模式匹配,除非您在所有要比较的列上定义了全文索引,否则不会使用针对这些列创建的索引。您应该使用“=”代替,并确保下列指标存在:

Item.ItemName 
ItemParameter.Value 
ItemParameter.Name 
ItemCustomParameters.Value 
ItemCustomParameters.Name 

我假设你已经有

ItemCustomParameters.CustomFilterDetailsID 
CustomFilterDetails.CustomFilterDetailsID 

指标我认为你是LIKE到包括其值在不同情况下的匹配?如果情况并非如此,那么用LI替换LIKE已经解决了你的问题。否则,请对相关字段使用不区分大小写的排序规则。然后,你可以比较不同的使用=的情况下,琴弦不会丢失索引的好处:

ALTER TABLE Item ALTER COLUMN ItemName NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 
ALTER TABLE ItemParameter ALTER COLUMN Name NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 
ALTER TABLE ItemParameter ALTER COLUMN Value NVARCHAR(200) COLLATE LATIN1_GENERAL_CI_AS 

...等

然后更换如上所述=喜欢和创建索引,它应该工作得很好,虽然还不够理想。如果在此之后仍然遇到性能问题,请考虑使用整数键链接Item,ItemParameter和ItemCustomParaeter表。不知道你的数据库结构,我不能给你更多的信息,但实际上这意味着将参数匹配到参数的任务是在创建或分配参数时完成的,而不是每次都是视图调用。