2

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

它包含 4 列:

ID, StartCityID, EndCityID, Distance 

并包含大约 1.2 亿行。

我已经在 , 上设置了索引startcityIDendcityID另外一个用于startcity + distance, 和endcity + distance(这是我第一次真正处理索引,所以不能 100% 确定我是否正确执行)。

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

Select distinct StartCityID
From Distances where EndCityID = 23485

Select distinct EndCityID 
From Distances where StartCityID = 20045

它们都返回相同数量的cityID',但顶部的需要 35 秒才能完成,底部的则立即返回结果。当我查看索引时,它们似乎被设置为startCityendCity相同的方式提供服务。

有谁知道为什么他们的行为可能不同?我很茫然...

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

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

谢谢

4

3 回答 3

1

第二个是覆盖索引,因此速度很快,因为您在 startcity 和 endcity 上有索引。

endcity 上的索引没有覆盖(因为它没有 startcity),因此它要么必须与其他索引连接才能获取数据,要么必须进行键查找,因此需要时间。此外,它必须使用不同的哈希或不同的哈希sor,而第一个不需要这样做,并且数据按给定 startcity 的 endcity 顺序排序。另外,为什么要使用 distinct,你会有 startcity 和 endcity 的重复数据。如果没有 dup 数据删除 distinct。

检查然后计划这些第一个应该是在 endcity + distnace 索引上的索引查找,然后很可能是键查找,它也可以是基于 endcity 的选择性的聚集索引扫描。然后是 hash distinct 或 sort distinct 。

第二个应该只有索引 startcity + endcity 上的索引搜索。

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

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

注意:不要在 PROD 服务器和其他 cirtical 服务器上使用这些。在不会影响其他用户的机器上尝试。

于 2012-07-24T09:39:28.093 回答
0

你所要做的就是想一想……

你的表有主键吗?它是什么?这是什么意思(有一个主键)?DISTINCT 关键字要求什么?

于 2012-07-24T09:41:25.007 回答
0

试试这个查询(避免 DISTINCT 关键字)

Select StartCityID From Distances  group by StartCityID where EndCityID = 23485

Select EndCityID  From Distances  group by EndCityID  where StartCityID = 20045
于 2012-07-24T09:45:35.613 回答