在这种情况下,在 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 列进行索引的最有效方法是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在这种特定情况下,SQL Server 会始终短路吗?

你将如何在 python 的数组中对这三个区域进行分组/聚类?

如何在 SQL Server 中对 Bit 数据类型进行 PIVOT?

sql server配置mapper.identity怎么配置

SQL Server merge用法

sql2008连接时候这种情况怎么办