我有这个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
为什么工作这么慢?
答案 0 :(得分:1)
您的问题是此查询中的 LIKE 子句。 LIKE 用于模式匹配,除非您在比较的所有列上都定义了全文索引,否则将不会使用针对这些列创建的任何索引。您应该使用“=”,并确保存在以下索引:
Item.ItemName
ItemParameter.Value
ItemParameter.Name
ItemCustomParameters.Value
ItemCustomParameters.Name
我假设你已经有了索引
ItemCustomParameters.CustomFilterDetailsID
CustomFilterDetails.CustomFilterDetailsID
我认为您 LIKE 包含其值中包含不同情况的匹配项?如果不是这种情况,那么用=替换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
......等等。
然后如上所述将LIKE替换为=并创建索引,它应该可以正常工作,尽管仍然不理想。如果您在此之后仍然遇到性能问题,请考虑使用整数键链接Item,ItemParameter和ItemCustomParaeter表。不知道你的数据库结构,我不能给你更多的信息,但实际上它意味着项目与参数匹配的任务是在创建或分配参数时完成的,而不是每次视图都是调用。
答案 1 :(得分:0)
您无需从视图中调用索引。索引用于对表中的数据进行排序并存储将随时可用的数据。这有助于提高性能。只需创建索引并运行此视图,看看它是否有所作为