表的索引混乱,这导致查询需要很长时间才能获取行



我有一个表a [Schema: key_id, x,y,z,...],其中有一个键id列,它是唯一的,增量种子为1。现在我有一个表B [schema: key_id, key_idOfA, x,y,z,....],它是具有类似模式的a的备份(只有diff表B有自己的key_id,它还保留了表a的原始key_id)。

我有一个服务,它根据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中获取几行需要花费大量时间,这会导致超时。准确地说,在SQLServerManagementStudio上获取30000行需要5分钟。从服务中,由于超时3分钟,查询超时。

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

我的问题:

  1. 索引是不是因为查询花费了太多时间而搞砸了?或者还有其他问题吗?

  2. 我可以采取不同的方法将行转移回来而不打乱索引吗?

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

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

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

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

最新更新