【问题标题】:SQL Server index for cursors游标的 SQL Server 索引
【发布时间】:2009-09-15 07:45:04
【问题描述】:

我有一个有时运行缓慢的应用程序,我认为它与数据库游标有关。

对应用程序源没有任何访问权限,因此我无法控制数据库调用,但数据库已打开,因此我可以在需要的地方添加索引。

问题是我真的不知道如何用索引加速游标。

游标查询很简单,看起来像

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4

(表包含大约 1M 行。有时还有一个左连接)

如果我直接在 SSMS 中运行查询,它需要不到一秒的时间,但是当它从游标中的应用程序运行时,可能需要 30 秒才能获取第一行(使用 sql-trace 验证)。

WHERE 和 ORDER BY 子句中的字段都是单独索引的。

我猜想在 field1,field2,field3,field4 上的组合索引会使其更快。有没有办法在不为每个字段组合和顺序创建索引的情况下加快速度?

(再说一遍:我对应用程序如何访问数据库没有影响。性能只能通过索引来调整)

【问题讨论】:

  • 您查看过查询执行计划吗?
  • 您是否使用任何选项声明您的光标?即,您只是在执行 DECLARE bob CURSOR FOR SELECT ... 还是明确提供选项 - 例如,您有 DECLARE bob CURSOR STATIC、READ_ONLY FOR SELECT ...(或任何其他选项组合 - DYNAMIC、FAST_FORWARD、KEYSET、等等...)
  • 尚未检查光标选项,因为无论如何我都无法更改它们。游标选项对于调整索引真的很重要吗?我查看了查询的执行计划,但由于查询本身运行速度很快,所以并没有说太多。如何查看游标的执行计划?
  • 我今天遇到了类似的问题,追溯到一个可重现的错误。 sqlskills.com/blogs/paul/…

标签: sql-server indexing cursor


【解决方案1】:

我经常做的一件事(如果可能的话)我运行 DB Tuning Advisor。

请不要误会我的意思 - 我没有遵循他的所有规则和建议,但这是查看正在发生的事情、发生的频率等的简单方法。 几个小时的(典型的!!!)工作量很适合获得一些基本的“感觉”。

之后,您可以决定是否实施一些建议。即使您在设计方面尽了最大努力 - 这样的检查会查看实际情况(并不总是可预测的),也许您忘记了一些统计数据或不同的索引可能会有所帮助......

【讨论】:

  • 我已经安装了 Tuning Advisor,但还没有使用它。我假设该过程是进行备份并同时启动 sqltrace。
【解决方案2】:

我会更改查询以使用实际列名而不是 SELECT *,然后在 field1=1 和 field2=2 上创建一个覆盖索引。如果可能的话,我会在 field3 和 field4 上放置一个聚集索引。

如果您使用的是 SQL 2005+,请尝试查看 CTE 而不是游标,或者重构您的查询以使用临时表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-18
    相关资源
    最近更新 更多