我有一个包含数十万条记录的产品表。基本的表结构如下:
ProductID (int pk) | ObjectID (int fk) | ProductTitle | Price
101 | 5005 | Toothbrush | 1.50
我有另一个对象表,它存储有关不同对象的信息,但主要是他们是由何时创建的。
ObjectID (int pk) | DateCreated (datetime) | UserID
5005 | 2017-11-16 13:00:00 | 50
选择产品的以下查询将在半秒内运行:
SELECT
p.*
FROM
dbo.Products p
ORDER BY
ProductID DESC
以下查询需要大约3.5秒
SELECT
p.*
FROM
dbo.Products p
INNER JOIN
dbo.Objects o ON
o.ObjectID = p.ObjectID
ORDER BY
o.DateCreated DESC
ObjectID
表中的 Products
已设置为Objects
表的外键。它上面还有一个独特的索引。
DateCreated
中的Objects
字段也已被编入索引。
为什么第二个查询运行速度慢5倍只是因为我按另一个表中的DateTime
字段排序?我知道int
的排序意味着更快,特别是当它聚集在一起时,但我并不认为差别很大。
有什么建议吗?我正在使用SQL Server 2016。
答案 0 :(得分:2)
要真正了解正在发生的事情,您需要查看执行计划。但是,结果并不令人惊讶。
第一个查询更快,因为 - 可能 - 查询可以在表上使用order by
的索引。如果id是主键,我不会感到惊讶,这使得排序更有效率。
第二个查询较慢,因为order by
可能正在进行实际排序。将表连接在一起时经常需要这样做。
Objects(DateCreated, ObjectId)
上的索引可能会更有效率。 SQL Server是否决定使用它取决于表的统计信息。