0

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

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

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

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

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 的组合索引会使其更快。有没有办法在不为每个字段组合和顺序创建索引的情况下加快速度?

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

4

2 回答 2

1

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

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

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

于 2009-09-15T07:59:18.240 回答
0

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

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

于 2009-09-15T08:10:32.657 回答