0

我有一个表 A [Schema: key_id, x,y,z,...],它的键 id 列是唯一的,并且增量播种为 1。现在我有一个表 B [schema: key_id, key_idOfA, x,y,z,....],它是具有类似模式的 A 的备份(只有差异表 B 有它自己的key_id,它也保持原始key_id表 A)。

我有一项服务,它根据 where 子句将一些行从 A 传输到 B。我尝试了一次这项服务,通过将行从 A 传输到 B,它运行良好。现在要再次检查此服务,我必须将行 (key_idOfA, x, y,z,...) 从 B 传输回 A。

为了避免丢失表 A 的原始 key_id,我首先使用了

SET IDENTITY_INSERT A ON

并转移了工作正常的行。转移后我使用

SET IDENTITY_INSERT A OFF

现在,当我再次运行该服务时,需要很长时间才能从表 A 中获取几行,这会导致超时。准确地说,在 SQL Server Management Studio 上获取 30,000 行需要 5 分钟。从服务中,查询由于 3 分钟超时而超时。

我知道打开和关闭表的身份插入是一种不好的做法,但这是一个测试床数据库,我永远不会在生产数据库上这样做。

我的问题:

  1. 由于查询花费了这么多时间,索引是否混乱?还是有其他问题?

  2. 我可以采取不同的方法将行传回而不弄乱索引吗?

4

1 回答 1

0

好吧,您可以做些什么来了解为什么它很慢,请查看实际查询计划。在 SSMS 中,这是通过顶部的查询菜单完成的,选择实际查询计划(或 CTRL-M) 之后运行查询时,您会在结果和消息选项卡旁边获得一个额外的选项卡。它被称为执行计划。当你研究它时,你必须从最右边开始。这就是查询开始的地方。寻找高百分比。如果您看到索引扫描或表扫描,它们比索引查找更糟糕,这是一种更快的方法。

如果您发现表/索引扫描的百分比很高,请尝试对索引进行碎片整理。

你可能想看看我写的碎片整理索引的脚本:www.plixa.nl/fragment-an-index

希望它有帮助,如果没有,请告诉我们:)

于 2012-08-03T09:32:11.333 回答