在这种情况下,在 SQL Server 中对三个 nchar 列进行索引的最有效方法是啥?
Posted
技术标签:
【中文标题】在这种情况下,在 SQL Server 中对三个 nchar 列进行索引的最有效方法是啥?【英文标题】:What is the most efficient way to index in SQL Server on three nchar columns in this case?在这种情况下,在 SQL Server 中对三个 nchar 列进行索引的最有效方法是什么? 【发布时间】:2013-06-30 08:33:24 【问题描述】:摘要:
作为业务系统设计的一部分,我正在 SQL Server 2012 中创建一个新表。该表有 3 列(除其他外),类型为 nvarchar
,大小不一,我的 Web 应用程序需要使用单个字符串搜索词查询这 3 列。此表可以包含不超过 100K 的记录。
我想以某种方式在 SQL Server 2012 中对这些列进行索引,以便最有效地获取结果。
我想强调的是,我要问的问题与我的特定案例有关,而不是一般的 SQL 索引问题。尽管它们的答案也可能适用于一般性问题。
上下文
SQL Server 2012 Windows Server 2008表格列定义:
ItemNumber :: nvarchar(10) 制造商 :: nvarchar(20) 说明 :: nvarchar(40)可能的记录数:最多 100K
用例:
最终用户(大约 1000 个)将传递一个字符串来搜索这三列,并且查询需要返回所有行,其中这三列中的任何一列都包含正在搜索的字符串的值(不区分大小写) .
问题:
-
创建索引以使查询以最有效的方式返回数据的最佳方法是什么(快速同时最大限度地减少 SQL Server 资源使用)?
为每列创建索引?
创建一个包含所有 3 列的索引?
对索引启用全文搜索?
什么方法可以充分发挥 SQL Server 2012 的潜力?
【问题讨论】:
我会NOT建议使用char(n)
或nchar(n)
用于超过5 或最大的任何时间。 10 个字符。不要不要使用nchar(20)
或更糟 - nchar(40)
- 这是对空间的大量浪费,这样的设计将永远无法获得良好的性能。对于超过 10 个字符的内容,我会总是建议使用varchar/nvarchar(x)
而不是固定长度的版本.....
最后评论:如果您说三列中的任何一列包含搜索文本,那么您要么需要使用全文搜索,或者然后你正在寻找 ... ItemNumber LIKE '%searchterm%'
匹配将自动确保 没有索引 将永远被使用 --> 你的表现将是糟糕的......
@marc_s 感谢所有有用的 cmets!我更新了帖子中的数据类型。我希望这篇文章的重点是关于在这种情况下的高效索引。
正如我所提到的:如果你想在三列中搜索包含一个搜索表达式,那么你最好选择全文搜索。如果您使用 ... WHERE ItemNumber LIKE '%....%'
进行搜索 - 您确定确定将永远无法使用任何索引,并且您的性能将非常糟糕 - 无论您拥有什么样的索引
【参考方案1】:
正如@marc_s 已经建议的那样,全文搜索是唯一有效的选择。
【讨论】:
以上是关于在这种情况下,在 SQL Server 中对三个 nchar 列进行索引的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章
你将如何在 python 的数组中对这三个区域进行分组/聚类?
如何在 SQL Server 中对 Bit 数据类型进行 PIVOT?