如何解决如何为 OR 操作创建非聚集索引
要求:表 Product
有名称和条形码
查询示例
DECLARE @Filter NVARCHAR(100) = NULL
SET @Filter = '%' + ISNULL(@Filter,'') + '%'
SELECT *
FROM Product
WHERE Name LIKE @Filter
OR Barcode LIKE @Filter
请帮助我提供任何解决方案作为名称和条形码的两个索引分开 或使用一个索引包括名称和条形码
解决方法
您有几个问题需要解决。首先,即使 Name
或 Barcode
上存在索引,您的过滤器表达式也无法从索引中受益(在添加索引的传统意义上),因为该表达式不可 sargable。 Brent Ozar 有一篇很好的文章解释了 Why %string% Is Slow
第二,您不能创建单个索引来覆盖两个单独列上的过滤器,其中每列上的过滤器都是独立的。这意味着您要么使用两个单独的过滤器(例如:您的 OP),要么您的查询仅包含 Name = 'NameValue'
的过滤器,反之亦然。具有以下 where 子句的查询:
WHERE
Name = 'NameValue'
OR
Barcode = 'BarcodeValue'
如果存在单独的索引,其中 Name
是第一个列出的列而 Barcode
是第一个列出的列,则只能为两个过滤器表达式寻找索引。
包含两列的索引主要用于将两列用作过滤器表达式的一部分的过滤器。例如:Name = 'NameValue' AND Barcode = 'BarcodeValue'
。考虑索引中每一列的顺序位置也很重要。例如,假设您创建了这个索引:
CREATE NONCLUSTERED INDEX NCIX_Product_Name_Barcode ON Product (Name,Barcode);
带有过滤表达式 Name = 'NameValue'
的查询仍然可以查找该索引,因为 Name
是索引中的第一列,但是带有过滤表达式 Barcode = 'BarcodeValue'
的查询不能。
在对索引设计做出任何长期决策之前,您应该首先熟悉 Microsoft 在 General Index Design Guidelines 中发布的指南。
最后,如果您确实需要在 Name
或 Barcode
中搜索字符串匹配,您应该查看 Microsoft 关于 full text indexes 的文档,这可能是您的最佳解决方案这种方式的索引搜索。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。