查询组合索引与多个单个索引与全文索引的性能

时间:2009-03-31 18:35:48

标签: sql-server performance indexing sql-server-2000 query-optimization

背景:我有一个包含500万个地址条目的表格,我想搜索不同的字段(客户名称,联系人姓名,邮编,城市,电话......),向上到8个领域。数据非常稳定,每天最多50次更改,因此几乎只有读取权限。

用户不应该提前告诉我他正在搜索什么,我也希望支持组合搜索(搜索术语的AND连接)。例如,“lincoln + lond”应该搜索在任何搜索字段中包含搜索词的所有记录,也包括以任何词开头的条目(例如本例中的“伦敦”)。

问题:现在我需要为此搜索表选择索引策略。 (作为旁注:我正在努力实现亚秒响应时间,最差的响应时间应该是2秒。)在性能方面有什么好处:

  1. 从所有可查询列中删除组合索引(需要其中2个,因为达到了900字节的索引限制)
  2. 在每个可查询列上放置单个索引
  3. 在可查询列上创建全文索引并使用全文查询
  4. 我放弃了第1点,因为它似乎没有任何优势(索引使用将受到限制,并且不会有“索引搜索”,因为并非所有字段都适合单个索引)。

    问题:现在,我应该使用多个单一索引变体,还是应该使用全文索引?是否有任何其他方式来实现上述功能?

4 个答案:

答案 0 :(得分:3)

尝试两者,看看哪个系统更快。数据库优化的硬性和快速规则很少,它实际上取决于您的环境。

答案 1 :(得分:2)

最初,我打算建议使用 FTS ,因为它有很多强大的性能功能。特别是当你处理各种查询时。 (例如,x和y。x NEAR y等)。

但在我开始与FTS的专业人士闲聊之前,我刚检查了你的服务器版本 - > SQL2000。

可怜的事情。那时FTS非常简单,所以坚持使用多个单索引

我们使用Sql2008并且......它摇滚。

哦,顺便问一下。你知道Sql2008(免费版)里面有FTS吗?有可能升级吗?

从sql2000开始 - > sql2008非常值得,如果可以的话。

但是,坚持你的M.S.I.选项。

答案 2 :(得分:1)

我同意Grauenwolf,我想补充一下关于索引的说明。请记住,如果您使用如下语法:

SELECT field1, field2, field3
FROM table
WHERE field1 LIKE '%value%

在搜索 field1 时,无论如何都不会使用任何索引,您必须求助于全文索引。为了完整起见,上述语法返回 field1 包含 value 的所有行(不一定在开头)。 如果您必须搜索“包含”,则全文索引可能更合适。

答案 3 :(得分:1)

回答我自己的问题:

我选择了“多个单一索引”选项。我结束了每个查询列的索引,每个索引只包含列本身。搜索工作非常好,主要是亚秒响应时间。有时它需要2-3秒,但我将它归因于我的数据库服务器(几年前使用3GB Ram和慢速磁盘的笔记本电脑)。

我没有测试全文选项,因为它不再需要(我没有时间去做。)