【问题标题】:Performance between 2 SQL queries [closed]2个SQL查询之间的性能[关闭]
【发布时间】:2022-11-15 22:14:28
【问题描述】:

我想知道这两个查询之间最快(或最有效)的查询在 SQL Server 上给出相同的结果。

我使用了 SQL Server Profiler,但它为 2 个查询(0 秒)提供了相同的结果。

谢谢

查询 1

select a.*,b.*
from a 
left join (query) b on a.id = b.id

where (clause(a)) 
order by a.date1
offset  0 rows fetch next 30 rows only  

查询 2

with b as (query)
select a.*,b.*
from a 
left join b on a.id = b.id

where (clause(a)) 
order by a.date1
offset  0 rows fetch next 30 rows only  

以下是表和变量的定义(查询和子句(a)):

CREATE TABLE a (
    id int NOT NULL PRIMARY KEY,
    last_name varchar(255) NOT NULL,
    first_name varchar(255),
    age int
);



CREATE TABLE a2 (
    id int NOT NULL PRIMARY KEY,
    last_name varchar(255) NOT NULL,
    adress varchar(255),
    height int,
    nationality_id int
);

CREATE TABLE nationality (
    nationality_id int NOT NULL PRIMARY KEY,
     name varchar(255) NOT NULL,
     
);

询问 :

a2 inner join nationality n on a2.nationality_id=n.nationality_id
where n.nationality_id=1

条款(a):

 ( age=30 )

有人能告诉我哪个是最好的查询(就性能而言),为什么?

【问题讨论】:

  • 通用查询,并且没有查询计划和具有所有索引的表,您需要更多信息才能有人回答这个问题
  • 将 suibquery 移动到 CTE 中可能不会对查询计划产生太大影响(或根本不会)。当您运行这些查询时,执行计划是什么样的?

标签: sql sql-server


【解决方案1】:

有人能告诉我哪个是最好的查询(就性能而言),为什么?

它们是等价的。使用更容易阅读和维护的那个。

您的两个查询之间的唯一区别是第一个使用内联子查询,而第二个使用公用表表达式 (CTE)。 SQL Server 内部使用查询优化器找到一个好的和高效的执行计划。由于您的查询都是

  • 非常简单和
  • 语义等价,

我愿意打赌查询优化器将对它们使用完全相同的执行计划。

(使用 SSMS 随时 verify this 并在评论中告诉我们结果。)


推荐延伸阅读:Is there a performance difference between CTE , Sub-Query, Temporary Table or Table Variable?

【讨论】:

  • 非常感谢@Heinzi!我花了一些时间使用 SSMS 来比较 2 个执行计划。它们并不完全相似:相同数量的节点和成本,但不完全相同的执行时间。
猜你喜欢
  • 1970-01-01
  • 2014-01-25
  • 2021-11-24
  • 1970-01-01
  • 2016-03-05
  • 1970-01-01
  • 2021-02-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多