【问题标题】:Sql Server 2008 FullText OptimizationSql Server 2008全文优化
【发布时间】:2011-05-29 16:45:57
【问题描述】:

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

从 MyTable 中选择 * where contains(Text, 'house').

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

从 MyTable 中选择 Count(*) where contains(Text, 'house')

显示结果仅需 1 秒。

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

我已经做了什么:

我买了一个 SSD 并将 mdf 和 ldf 都放在这个磁盘上。但是当我执行第一个查询时,我可以看到正在我的 HDD(而不是 SSD)上创建日志和 tmp 数据库。我的 SSD 是 D:,所有临时文件都在 C: 创建。

这是因为 sql 需要这些文件来填充企业管理器结果网格而需要这么长时间吗?我能做些什么来优化数据库吗?我真的需要在 2 秒内运行查询。

【问题讨论】:

  • 是在一台机器上完成所有工作,还是通过网络传输数据?
  • 还有一个问题:这个 14 秒的数字是完成将结果集返回到 SSMS 窗口所需的时间,还是开始在其中显示值所需的时间?
  • 完成将结果集返回到我的 SSMS 所需的时间
  • 一切都在一台机器上完成。

标签: sql-server full-text-search


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    有什么理由需要返回 20,000 条记录吗?您能否在查询中添加分页,以便以 20、100、1000 或小于 20,000 的块返回结果集?无论优化多少,返回这么大的结果集都需要时间。

    【讨论】:

    • 我想我可以使用 1000 个块。
    • 我尝试了选择前 1000 名,但花了 4 秒......它仍然很慢。
    • 1000 条记录仍然很多,具体取决于表中的数据。假设每行有 1000 个字符的文本。每行大约 1 KB 的文本。仅对于列,1000 行将是 1MB。我不知道你的数据是什么样的,但可能就是这样。您是否在网格中向用户显示这些数据?如果是这种情况,那么将结果限制为每页 20 个是有意义的……但我不知道您的具体情况是什么,所以这可能不合适。
    • 我没有在网格中显示它们。我正在使用它来填充其他表。真的很难向你解释,但我需要所有的搜索结果。
    【解决方案3】:

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

    请记住,当您执行 SELECT * 时,您还会在网格结果中包含 Text 列本身。尝试仅选择除 Text 列之外的列,您可能会看到执行时间下降到更接近 SELECT COUNT(*) 查询的执行时间。您可能还希望在选择列表中包含 DATALENGTH(Text)。

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

    【讨论】:

      【解决方案4】:

      我同意克里斯蒂安的观点。您的问题在于结果的呈现。尝试输出到 Text 而不是 Grid 以消除部分开销。

      【讨论】:

      • 你知道这个问题已经超过 4 年了,对吧?
      猜你喜欢
      • 1970-01-01
      • 2011-05-06
      • 1970-01-01
      • 2010-11-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-01
      • 1970-01-01
      相关资源
      最近更新 更多