我有一个应用程序,有时运行缓慢,我认为它与数据库游标有关。
没有对应用程序源的任何访问权限,因此我无法控制数据库调用但数据库已打开,因此我可以在需要时添加索引。
问题是我不知道如何加速索引的游标。
游标查询很简单,看起来像
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上的组合索引会使它更快。有没有办法加快速度而不为每个组合和字段顺序创建索引?
(重复一遍:我对应用程序访问数据库的方式没有影响。性能只能通过索引进行调整)
答案 0 :(得分:1)
我总是做的一件事(如果可能的话)我运行数据库调优顾问。
不要误解我的意思 - 我没有遵循他的所有规则和建议,但这是一种简单的方法,可以看到发生了什么,发生的频率等等。 几个小时(典型的!!!)工作量很好地得到一些基本的“感觉”正在发生的事情。
之后你可以决定是否实施一些建议。即使你在设计方面做得最好 - 这样的检查看起来真正发生了什么(并不总是可预测的),也许你会忘记一些统计数据或者不同的指数可能会有所帮助......
答案 1 :(得分:0)
我将查询更改为使用实际列名而不是SELECT *,然后在field1 = 1和field2 = 2上创建覆盖索引。如果可能的话,我会在field3和field4上放置一个聚簇索引。
如果您使用的是SQL 2005+,请尝试查看CTE而不是游标,或者重构查询以使用临时表。