【发布时间】: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