2个针对大型SQL Server表执行不同的类似查询

时间:2012-07-24 09:32:25

标签: sql sql-server

我的数据库中有一个包含城市之间距离的大表。这使我的应用程序能够在选择起始城市时查找世界各地的附近城市。

它包含4列:

ID, StartCityID, EndCityID, Distance 

并包含大约1.2亿行。

我已在startcityIDendcityID上设置了索引,两者都设置了索引,startcity + distanceendcity + distance分别设置了索引(这是我的第一次与指数进行实际交易,因此如果我正确地做到这一点,则不能100%确定。

无论如何 - 我做了以下2个查询:

Select distinct StartCityID
From Distances where EndCityID = 23485

Select distinct EndCityID 
From Distances where StartCityID = 20045

它们都返回相同数量的cityID,但最上面的一个需要35秒才能完成,而最后一个会立即返回结果。当我查看索引时,它们似乎设置为以相同的方式提供startCityendCity

任何人都知道他们为什么表现得与众不同?我不知所措......

注意 - 这可能提供更多的洞察力,但需要35秒的时间 - 如果我使用相同的ID立即再次按下执行,它会立即返回结果。

不幸的是,这对我的网站来说还不够好,但它可能是有用的信息。

由于

3 个答案:

答案 0 :(得分:1)

第二个是覆盖索引,因此很快,因为你有startcity和endcity的索引。

endcity上的索引没有覆盖(因为它没有startcity),因此它必须与其他索引连接才能获取数据或者必须进行密钥查找,因此需要时间。此外,它必须执行hash distinct或者使用sor进行区分,而第一个不需要这样做,以及数据按照目标startcity的endcity顺序排序。同样为什么使用distinct会有startcity和endcity的重复数据。如果没有重复数据删除不同。

检查然后计划这些第一个应该是对endcity + distnace索引的索引查找,然后最可能是关键查找它可以是基于endcity的选择性的clustred索引扫描。然后一个hash hash或sort distinct。 / p>

第二个应该只对索引startcity + endcity进行索引搜索。

您已经提到第二次立即返回,因为数据已经在缓存中。因此,请尝试以下

dbcc dropcleanbuffers dbcc freeproccache 然后先运行第二个查询..

注意:请勿在PROD服务器和其他cirtical服务器上使用这些服务器。请在不会影响其他用户的计算机上进行此操作。

答案 1 :(得分:0)

你所要做的就是考虑它......

你的桌子有主键吗?它是什么?这意味着什么(拥有主键)? DISTINCT关键字要求什么?

答案 2 :(得分:0)

尝试此查询(避免使用DISTINCT关键字)

Select StartCityID From Distances  group by StartCityID where EndCityID = 23485

Select EndCityID  From Distances  group by EndCityID  where StartCityID = 20045
相关问题