【问题标题】:Query performances by evaluating Execution Plan (Join First Row)通过评估执行计划查询性能(加入第一行)
【发布时间】:2020-11-27 00:33:15
【问题描述】:

我有以下表格:

客户

ID     Name 
============
1      John 
2      Alice
3      Bob

订单

ID     CustomerID   Status
==========================
1001       1          1
1002       2          1
1003       2          2
1004       3          2

我想加入表格,每个客户只显示一个条目(状态最低的那个),即

ID     Name    OrderID 
======================
1      John     1001
2      Alice    1002
3      Bob      1004

感谢this question 的回答,我选择了两个产生相同输出的解决方案:

解决方案 1

SELECT c.id, c.name, o.id FROM customers AS c
INNER JOIN orders AS o ON
c.id =  o.customerid
WHERE o.status = (SELECT MIN(status) FROM orders WHERE customerid = c.id)

解决方案 2

SELECT c.id, c.name, o.id FROM customers as c
INNER JOIN orders AS o ON
o.id = (SELECT TOP 1 id FROM orders WHERE customerid = c.id ORDER BY status)

为了了解哪个运行得更快,我使用了SQL Fiddle View Execution Plan,它给出了以下内容:

解决方案 1

解决方案 2

如何解释这些图表,哪一个执行得更快? 使用 MS SQL Server 2016。

【问题讨论】:

  • 执行计划并没有告诉你它的运行速度。你想要set-statistics-time
  • Dale 是正确的(和/或使用最新版本的 SSMS,其中包括实际执行计划的时间)。但是,我很确定第一个会更快 - 第一个解决方案有 2 个表扫描,而第二个解决方案有 3 个表扫描,其中两个在嵌套循环连接中(例如,它可能运行很多次)。

标签: sql-server performance sqlfiddle


【解决方案1】:

这是我的细分,最后一个是我给你的建议。

查询成本 67%

SELECT c.id, c.name, o.id FROM @Customers AS c
INNER JOIN @Orders AS o ON
c.id =  o.customerid
WHERE o.status = (SELECT MIN(status) FROM @Orders WHERE customerid = c.id)

查询成本 66%

SELECT c.id, c.name, o.id FROM @Customers as c
INNER JOIN @Orders AS o ON
o.id = (SELECT TOP 1 id FROM @Orders WHERE customerid = c.id ORDER BY status)

查询成本 47%

SELECT
  x.CustID,
  x.Name,
  x.OrderID
FROM (SELECT
  C.id CustID,
  c.Name,
  o.ID OrderID,
  o.status,
  ROW_NUMBER() OVER (PARTITION BY c.id ORDER BY o.status) rn
FROM @Customers c
INNER JOIN @Orders o
  ON o.CustomerID    = c.ID) x
WHERE x.rn = 1

【讨论】:

  • 谢谢。但是查询成本是什么意思?占什么的百分比?
  • @kuma 查询成本是优化器认为您的查询需要多长时间(相对于总批处理时间)。优化器尝试通过查看您的查询和数据统计信息来选择最佳查询计划,尝试多个执行计划并选择成本最低的执行计划
  • 抱歉,目前还不清楚这 3 种情况下 100% 代表什么
  • @kuma 我认为你不太懂英语。简而言之,理想的查询性能意味着更少的查询成本。
  • 这与英语无关。由于百分比是相对于批次的,在您的示例中批次是多少?如果批次包含 3 个查询,则它们的查询成本加起来不会达到 100%,因为 it should be
猜你喜欢
  • 2021-06-09
  • 1970-01-01
  • 2015-12-10
  • 2022-01-26
  • 2012-09-02
  • 1970-01-01
  • 1970-01-01
  • 2018-10-07
  • 2020-04-30
相关资源
最近更新 更多