2010-12-22 98 views
1

我在Sql Server 2008中玩了一点全文索引。我创建了索引,目录并填充了它。 我的表有近400,000条记录。我的全文索引被定义为一个varchar(Max)列(让我们现在称它为Text)。我正在执行以下查询:Sql Server 2008全文优化

select * from MyTable where contains(Text,'house')。

该查询在14秒内返回近20,000条记录。我认为这很慢。但是,当我执行这个查询:从MyTable的

SELECT COUNT(*),其中包含(文字, '房子')

它仅需1秒钟显示结果。

我一直在寻找,并且据我所见,这两个查询的执行计划是相同的。 为什么Sql Server花费太多时间来显示第一个查询结果?

我已经做了:

我买了一个SSD,并把两者MDF和LDF该磁盘上。但是,当我执行第一个查询时,我可以看到日志和tmp数据库正在我的硬盘(不在SSD中)创建。我的SSD是D:并且所有临时文件都在C:上创建。

这是否需要这么久,因为sql需要这些文件来填充企业管理器结果网格?有什么我可以做的优化数据库?我真的需要查询在不到2秒的时间内运行。

+0

一切正在一台机器上完成,还是通过网络传输数据? – 2010-12-22 23:16:29

+0

还有一个问题:那14秒钟的数字是完成将结果集返回给SSMS窗口所需的时间,还是开始显示值的时间? – 2010-12-22 23:18:00

+0

完成将结果集返回给我的SSMS所需的时间 – 2010-12-22 23:41:15

回答

2

您是否真的需要显示所有文本,还是想对结果运行更多查询并进一步缩小范围?我假设大部分时间用于显示结果 - 如果您不需要显示它们或只想显示这些结果的某个子集,则执行时间应该减少。

1

你有什么理由需要返回20,000条记录吗?你能否将分页添加到查询中,以便返回20,100,1000或小于20,000的数据块的结果集?无论您进行多少优化,都需要一段时间才能返回结果集。

1

您的查询的额外时间可能来自Management Studio中的网格填充。

请记住,当您执行SELECT *时,您还在网格结果中包含文本列本身。尝试仅选择除“文本”列以外的列,并且您可能会看到执行时间更接近您的SELECT COUNT(*)查询的执行时间。您可能还想在选择列表中包含DATALENGTH(文本)。

Management Studio中还有一个选项,用于控制检索到网格中的最大字符数。您可以在工具 - >选项 - >查询结果 - >网格结果下找到它。

0

我同意基督教。你的问题在于结果的渲染。尝试输出到文本而不是网格来消除这些开销。