2009-02-21 53 views
2

我似乎无法从FullText目录中获得可接受的性能。我们有必要尽快运行100k以上的查询。一些查询使用FREETEXT有些不。这里的一个查询替代MS SQL 2005全文目录

IF EXISTS的例子(从的user_data d选择1其中[email protected]和FREETEXT(*,@activities)SET @匹配= 1

这可以3-15秒之间采取。如果可能,我需要它快得多< 1s

我喜欢全文查询的“灵活性”,因为它可以跨多列进行搜索,而且语法非常直观,我宁可不使用Like声明,因为我们希望能够匹配“Writer”和“Writing”等词。

我试过了一些建议listen d在这里http://msdn.microsoft.com/en-us/library/ms142560(SQL.90).aspx

我们有足够多的内存和CPU,因为我们可以负担得起,但不幸的是,我们无法将目录放在他们自己的磁盘控制器上。

我很沮丧,并准备探索全文查询的其他替代方案。还有什么能让那种“作家”/“写作”类似的比赛?也许甚至使用CLR的东西?

+0

没有确切的硬件和文件/磁盘位置的细节,我怀疑我们可以帮助... – 2009-02-21 01:18:32

+0

你可以根本改变硬件情况吗?向外扩展? – alphadogg 2009-02-21 01:27:45

回答

0

由于FREETEXT的性质,其性能低于使用CONTAINS时的性能,这仅仅是因为它必须考虑所给关键字的不太精确的替代方案。当您指定Write btw时,CONTAINS可以找到写入,我不确定您是否已经检查过CONTAINS是否会执行该操作。

此外,请务必避免SQL中的IF语句,因为它们通常会导致每次查询执行都会执行计划的完整重新编译,这可能会导致您看到的糟糕的性能。我不确定IF语句是如何使用的,因为它可能在更大的一块SQL中。尝试将EXISTS查询与更大的sql片段合并,因为您可以从EXISTS中的SELECT语句内设置@match参数,或者完全摆脱该变量并在更大的查询中使用EXISTS子句作为谓词。

SQL是一种面向集合的语言并被解释。因此,摆脱命令式编程结构并使用sql的本地set-operators通常会更快。