Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/shell/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 用于游标的SQL Server索引_Sql Server_Indexing_Cursor - Fatal编程技术网

Sql server 用于游标的SQL Server索引

Sql server 用于游标的SQL Server索引,sql-server,indexing,cursor,Sql Server,Indexing,Cursor,我有一个有时运行缓慢的应用程序,我认为它与数据库游标有关 没有对应用程序源的任何访问权限,因此我无法控制数据库调用,但数据库是开放的,因此我可以在需要时添加索引 问题是我真的不知道如何用索引加速游标 游标查询很简单,看起来像 SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4 (表包含大约1M行。有时也有一个左连接) 如果我直接在SSMS中运行查询,只需不到一秒钟的时间,但是当从应用程序以游标形式运行查

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

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

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

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

SELECT * FROM table WHERE field1=1 AND field2=2 ORDER BY field3, field4
(表包含大约1M行。有时也有一个左连接)

如果我直接在SSMS中运行查询,只需不到一秒钟的时间,但是当从应用程序以游标形式运行查询时,获取第一行(通过sql跟踪验证)可能需要30秒

WHERE和ORDER BY子句中的字段都单独编制索引

我想字段1、字段2、字段3、字段4上的组合索引会使它更快。有没有一种方法可以在不为字段的每个组合和顺序创建索引的情况下加快速度

(重复:我对应用程序访问数据库的方式没有影响。性能只能通过索引进行调整)

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

别误会我的意思——我并没有遵循他的所有规则和建议,但这是一种很容易了解发生了什么、多久发生一次等情况的方法。 一些小时的(典型的!!!)工作量有助于获得一些基本的“感觉”


之后,你可以决定是否实施一些建议。即使你在设计上尽了最大努力——这样的检查看起来是真实的(不总是可预测的),也许你忘记了一些统计数据或不同的索引可能会有所帮助……

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


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

您是否查看了查询执行计划?是否使用任何选项声明游标?i、 例如,您只是在为SELECT声明bob游标。。。或者,您是否明确给出了选项-例如,您已将bob CURSOR声明为静态,对于SELECT。。。(或任何其他选项组合-动态、快进、键集等)未选中光标选项,因为我无法更改它们。光标选项对调整索引真的很重要吗?我已经查看了查询的执行计划,但由于查询本身运行速度很快,所以它没有说太多。我如何看待游标的执行计划?今天我遇到了一个类似的问题,追溯到一个可复制的bug。我已经安装了Tuning Advisor,但尚未使用它。我假设这个过程是同时执行备份和启动sqltrace。