繁体   English   中英

如何提高另一个表中按日期时间字段排序的速度?

[英]How to improve speed sorting by datetime field from another table?

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

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

Products表中的ObjectID已设置为Objects表的外键。 它还具有唯一索引。

ObjectsDateCreated字段也已建立索引。

为什么第二个查询的运行速度慢5倍,只是因为我是从另一个表中按DateTime字段排序的? 我知道,以int排序将意味着更快,尤其是在将其聚集时,但是我并不期望两者之间的差异如此之大。

有什么建议吗? 我正在使用SQL Server 2016。

要真正了解正在发生的事情,您需要查看执行计划。 但是,结果不足为奇。

第一个查询更快,因为-大概-查询可以使用表上的索引来order by 如果id是主键,我将不会感到惊讶,从而使订购更加高效。

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM