如何从另一个表中提高datetime字段的速度排序?

时间:2017-11-16 11:40:05

标签: sql sql-server tsql sql-server-2012 sql-server-2016

我有一个包含数十万条记录的产品表。基本的表结构如下:

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。

1 个答案:

答案 0 :(得分:2)

要真正了解正在发生的事情,您需要查看执行计划。但是,结果并不令人惊讶。

第一个查询更快,因为 - 可能 - 查询可以在表上使用order by的索引。如果id是主键,我不会感到惊讶,这使得排序更有效率。

第二个查询较慢,因为order by可能正在进行实际排序。将表连接在一起时经常需要这样做。

Objects(DateCreated, ObjectId)上的索引可能会更有效率。 SQL Server是否决定使用它取决于表的统计信息。