2011-07-01 175 views
1

我有一个SQL Server 2008 R2数据库表在那里我试图筛选出使用下面的查询SQL Server查询执行速度很慢时比较主键

SELECT a1.Id, a2.Id 
    FROM Addresses a1 
    INNER JOIN Addresses a2 ON a1.PhoneNumber = a2.PhoneNumber 
    WHERE a1.Id < a2.Id 

重复的电话号码和标志他们12K地址记录注意:我知道有另一种方法可以通过使用EXISTS来解决这个问题,但这不是讨论的一部分。

该表在ID字段中具有一个集群索引的主键,碎片级别为0,电话号码字段不为空,并且在12k条记录中有大约130个副本。为了确保它不是服务器或数据库实例问题,我在4个不同的系统上运行它。

执行查询需要几分钟,有时需要几个小时。在尝试几乎所有事情之后,我将其删除了主键,然后在没有它的情况下运行查询,并在1秒内执行。我添加了主键,它仍然在一秒钟内运行。

有没有人有一个想法是什么导致这个问题?

主键是否有可能被破坏?

编辑:我的道歉,我有几个错别字在SQL查询

+1

更改的查询没有按不会改变我的答案 - 这些字段是否被索引? – JNK

回答

3

无数据统计。丢弃和重新创建PK将会放弃新的统计数据。

现在太晚了,但我会建议运行sp_updatestats来查看发生了什么。

如果你的备份和恢复数据库到不同的系统,统计学按照数据

后,我怀疑一个不同的计划过于非索引(我猜)列******中国和CCAPhoneN

+0

+1 - 由于你提出统计数据看起来像是一个可能的嫌疑犯,并且删除/重新创建PK会重建群集和表格。 – JNK

+0

@gbn我有一个可以恢复的备份。我会尝试你的建议。 – Andre

2

我猜有上PhoneNumberPhoneNo没有索引。

要加入这些领域,但如果他们不被索引它迫使表扫描,一个用于查询表中的每个实例,那么很可能做一个哈希匹配找到匹配记录。

下一步 - 获取一个执行计划,看看痛点是什么。

然后,将索引添加到这些字段(假设您看到集群索引扫描)并查看是否修复了它。

我认为你的其他问题是红鲱鱼。 PK可能与它无关,但你可能已经获得了页面缓存(你是否放弃了缓冲区并在运行之间清除缓存?),这使得后者运行得更快。

+0

请参阅上述更正的sql语句。我对这种混乱表示歉意。 – Andre

+0

@Andre - 我做了,但我不认为它改变了这个问题。另请参阅下面的@ gbn的答案。 – JNK

+0

奇怪的是,当我执行没有where语句的查询时,它运行速度非常快。很明显,在这种情况下,我会将所有记录返回 – Andre

相关问题