Sql server SQL Server索引在多个;比如@filter+';%'&引用;过滤器

Sql server SQL Server索引在多个;比如@filter+';%'&引用;过滤器,sql-server,Sql Server,当创建类过滤器时(我使用的是StartsWith logic,而不是Contains),我需要对索引做一些特殊的处理,还是只创建标准的非聚集索引 查询: SELECT * FROM Contact WHERE AccountUID = @AccountUID AND (FirstName LIKE @Filter + '%' OR LastName LIKE @Filter + '%' OR Company LIKE @Filter + '%') 拟议指数: CREATE NONCLUSTER

当创建类过滤器时(我使用的是StartsWith logic,而不是Contains),我需要对索引做一些特殊的处理,还是只创建标准的非聚集索引

查询:

SELECT * FROM Contact WHERE AccountUID = @AccountUID AND (FirstName LIKE @Filter + '%' OR LastName LIKE @Filter + '%' OR Company LIKE @Filter + '%')
拟议指数:

CREATE NONCLUSTERED INDEX [ix_Contact_Search] ON [dbo].[Contact]
(
    [AccountUID] ASC,
    [FirstName] ASC,
    [LastName] ASC,
    [Company] ASC
)

不,你的索引没有什么特别需要做的。您在那里列出的索引看起来将完全支持您的查询

这可能超出了您的问题范围,但这里有一点关于索引和通配符的知识。只要搜索谓词(您在where子句中比较的值)是已知值,就可以使用索引。在您的示例中,您可以像@filter+'%'一样说
,这样就完全可以了,因为它的计算结果是(说)“Hello”+任何东西。索引中的记录看起来像“Hello World”,所以它可以找到它的正确位置


但是,如果以通配符(例如
'%'++@filter++'%'
)开始搜索谓词,则无法使用索引。现在您遇到了一个问题,因为您的字符串可能是“Aardvarkhollo”或“ZebraHello”,它不知道在哪里查找

您真的同时使用同一个变量
@Filter
来搜索
FirstName
LastName
公司
吗?是的,因为这是一般搜索。@Xedni,@MikeCole,给定的索引不包括给定的查询。它包含此查询:
其中AccountUID=@AccountUID和FirstName=@Filter和LastName=@Filter和Company LIKE@Filter+'%'
要包含给定的查询,您需要3个索引:
(AccountUID,FirstName)
(AccountUID,LastName)
。使用原始索引,您将得到索引扫描(即读取所有行),使用三个索引,您将得到三个串联在一起的索引查找。@VladimirBaranov,覆盖查询是一种查询,其中所有正在搜索和检索的列都包含在索引中(无论是键还是通过包含列)。您不需要3个不同的索引,因为SQL只会选择最适合查询的索引,这就是他拥有的索引。除非他有SEAPARTE查找案例来支持您列出的案例,否则他的索引很好。请注意,您的附加索引原语也不会“覆盖”inedx。@Xedni,我检查了SQL Server 2008上的执行计划。对于给定的索引,原始查询使用
索引扫描
,这意味着服务器读取所有行,而不进行搜索。使用三个单独的索引,优化器执行三次
索引搜索
,即搜索。在我的测试数据中,只有100K行具有原始索引,有1199个逻辑读取,三个索引有653个读取@MikeCole,用实际数据尝试两种变体,然后比较执行计划和IO。确保尝试特定搜索,即
@Filter='Vladimir%'
和广泛搜索,即
@Filter='V%'
@Xedni,他实际上有单独的查找案例。他的原始查询使用
,而不是