查询与查询 - 为啥这个比另一个快?

     2023-04-14     274

关键词:

【中文标题】查询与查询 - 为啥这个比另一个快?【英文标题】:Query vs query - why is this one quicker than the other?查询与查询 - 为什么这个比另一个快? 【发布时间】:2011-04-07 14:24:59 【问题描述】:

我有以下两个疑问 - 原来是第一个,第二个是我的轻微“升级”。第一个需要将近一秒钟的时间来运行,第二个完成后我的手指才能完全离开刷新按钮。

我的问题:为什么?

第一个和第二个之间的唯一区别是第一个使用合并来获取一个值来比较berp.ID_PART_SESSION,第二个使用联合将两个选择语句放在一起以完成相同的事情。

我仍然认为第一个应该更快(我使用合并的最初原因),因为它似乎应该做更少的工作来获得相同的结果。考虑到我破译执行计划的能力有多弱,有人能解释一下为什么第二个查询比第一个好得多吗?

declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
    AND berp.PRINCIPAL = 1
    AND berp.DELETED = 0
    AND berp.CANCELLED = 0
    AND berp.ID_PART_SESSION = (
        select coalesce(pss.ID_PART_SESSION, psst.ID_PART_SESSION)
        from t_bersp b
        LEFT JOIN T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
        LEFT JOIN T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
        where ID_BERSP = 4040)

declare @animator varchar
SELECT TOP 1 @animator = FULL_NAME
FROM dbo.T_BERP berp
INNER JOIN dbo.T_INTERV i ON i.ID_INTERV = berp.ID_INTERV
WHERE berp.VERSION = 1
    AND berp.PRINCIPAL = 1
    AND berp.DELETED = 0
    AND berp.CANCELLED = 0
    AND berp.ID_PART_SESSION IN (
        select pss.ID_PART_SESSION
        from dbo.t_bersp b
        LEFT JOIN dbo.T_PART_SESSION pss ON b.ID_PART_SESSION = pss.ID_PART_SESSION
        where ID_BERSP = 4040
        union
        select psst.ID_PART_SESSION
        from dbo.t_bersp b
        LEFT JOIN dbo.T_PSS_TEMP psst ON b.ID_PSS_TEMP = psst.ID_PSS_TEMP
        where ID_BERSP = 4040)

【问题讨论】:

每当我需要比较两个查询时,通常是很简单的第一步到see what the execution plan looks like。一旦你有了这个计划,我就会把它添加到你的问题中。 我最初的想法是子查询顶部的= 和底部的IN,但它不相关,所以我认为这不重要...... 您还有一个区别,即第一个查询使用“=”,第二个查询使用“IN”。同样作为一个不相关的警告,使用没有 ORDER BY 的 TOP 1 可能会导致一些非常难以追踪的错误。如果您没有 order by,则返回多条记录的顺序是不确定的。它通常会匹配索引的排序顺序或磁盘上的物理顺序,但不能保证。 @RozWel - 这里有关于=IN 的回声吗? :) 我有执行计划,但它们很大(~450 和~375 行)xml 文件。直接放在那里可以吗?好像找不到文件附件功能... 【参考方案1】:

如果不了解查询中各个表的相对大小和索引,就很难提供明确的答案。一种可能性:如果 t_part_session 和 t_pss_temp 都很大,则查询优化器可能会对您的第一个查询的内部 SELECT 中的两个 LEFT JOIN 做一些低效的事情。

编辑澄清:是的,两个查询中都有 LEFT JOIN,但我的猜测是,将两个查询放在一起(查询 1)可能会对 UNION(查询 2)的性能产生不利影响。抱歉,如果最初不清楚。

此外,我强烈推荐使用诸如 Instant SQL Formatter(与 *** 编辑器中的 图标结合)之类的工具,以使您的问题中的查询更易于阅读:

DECLARE @animator VARCHAR

SELECT TOP 1 @animator = full_name
FROM   t_berp berp
       INNER JOIN dbo.t_interv i
         ON i.id_interv = berp.id_interv
WHERE  berp.version = 1
       AND berp.principal = 1
       AND berp.deleted = 0
       AND berp.cancelled = 0
       AND berp.id_part_session = (SELECT
           Coalesce(pss.id_part_session, psst.id_part_session)
                                   FROM   t_bersp b
                                          LEFT JOIN t_part_session pss
                                            ON b.id_part_session =
                                               pss.id_part_session
                                          LEFT JOIN t_pss_temp psst
                                            ON b.id_pss_temporaire =
                                               psst.id_pss_temporaire
                                   WHERE  id_bersp = 4040)

DECLARE @animator VARCHAR

SELECT TOP 1 @animator = full_name
FROM   dbo.t_berp berp
       INNER JOIN dbo.t_interv i
         ON i.id_interv = berp.id_interv
WHERE  berp.version = 1
       AND berp.principal = 1
       AND berp.deleted = 0
       AND berp.cancelled = 0
       AND berp.id_part_session IN (SELECT pss.id_part_session
                                    FROM   dbo.t_bersp b
                                           LEFT JOIN dbo.t_part_session pss
                                             ON b.id_part_session =
                                                pss.id_part_session
                                    WHERE  id_bersp = 4040
                                    UNION
                                    SELECT psst.id_part_session
                                    FROM   dbo.t_bersp b
                                           LEFT JOIN dbo.t_pss_temp psst
                                             ON b.id_pss_temporaire =
                                                psst.id_pss_temporaire
                                    WHERE  id_bersp = 4040)  

【讨论】:

-1 - LEFT JOINs 也在第二个查询中,所以你的“答案”基本上相当于“我不知道,但请更好地格式化你的代码” 是的,左连接在两个查询中,但我猜测将两个连接在一起可能会对性能产生不利影响。抱歉,如果不清楚。对于它的价值,我同意 Chris 的评论,即执行计划将大大有助于解决这个问题。 抱歉,我曾尝试格式化代码,但我看到它是用反引号来做的,所以我把我的代码用反引号包裹起来,假设这已经足够了。 不用担心,如果我的回答显得傲慢,我很抱歉——显然我没有足够的声誉来直接编辑。只是想帮忙。不确定我是否有资格评论是否可以粘贴执行计划。 :-) 另外,当我从 SQL Formatter 粘贴格式化代码时,预览会损坏它,直到我使用 ,这看起来就像它只是在文本编辑器中缩进了它。 非常感谢。巧合的是,这次谈话现在给了我足够的声誉,我可以对帖子发表评论,而不是通过答案要求澄清。我以前没有那个。 :-)【参考方案2】:

我打赌这是合并声明。我相信 coalesce 最终会在 where 子句之前应用。所以,它实际上是遍历两个表的每个组合,然后过滤那些与 where 子句匹配的表。

【讨论】:

对于 SQL Server 来说,这将是一种非常愚蠢的处理方式......您可能是对的,它可以解释其中的奥秘,但让我感到惊讶的是,可以完成这样一个次优的事情。跨度> 【参考方案3】:

您可以将两个查询放在 SSMS 中的同一个批次中并显示执行计划 - 这不仅可以让您并排查看它们,还可以显示相对成本。

我怀疑 IN (UNION) 意味着第二个可以很容易地并行化。

【讨论】:

嗯,这更令人困惑 - 它告诉我第一个(也是最慢的)查询的成本(相对于批次)为 27%,第二个查询的成本为 73%。 @Alex In Paris 是实际的还是估计的?第二个使用并行性吗?读取的实际统计数据是什么样的? 我选择了“包括实际执行计划”。我没有看到任何地方提到并行。第一个查询有一个带有思考箭头的项目 - 聚集索引扫描,占该查询成本的 42%。 35% 用于聚集索引搜索。第二个查询有一个很大的项目成本:74% 用于 Key Lookup。不确定是否有任何帮助...

sql语句联合查询与视图想比较的话,那个效率快,为啥。

...程的好处是不仅快且更安全,但移植性差。视图可以封装查询的复杂性,就像面向对象里类的概念一样。拓展回答:sql一般指结构化查询的语言特点:一体化:SQL集数据定义DDL、数据操纵DML和数据控制DCL于一体,可以完成数据库... 查看详情

为啥这个查询运行这么慢?

】为啥这个查询运行这么慢?【英文标题】:Whythisqueryisrunningsoslow?为什么这个查询运行这么慢?【发布时间】:2015-04-1503:57:28【问题描述】:此查询运行速度非常快(SELECTTOP(10)[Extent2].[CompanyId]AS[CompanyId],[Extent1].[Id]AS[Id],[Extent1].[... 查看详情

在 latin1 中查询快,在 utf8 中查询慢 - 为啥?

】在latin1中查询快,在utf8中查询慢-为啥?【英文标题】:Queryfastinlatin1,slowinutf8-why?在latin1中查询快,在utf8中查询慢-为什么?【发布时间】:2011-06-1714:36:48【问题描述】:我有一个类似这样的查询:SELECTDISTINCTtable1.id,longlistoffiel... 查看详情

为啥这个 MySQL 存储函数给出的结果与在查询中进行计算不同?

】为啥这个MySQL存储函数给出的结果与在查询中进行计算不同?【英文标题】:WhydoesthisMySQLstoredfunctiongivedifferentresultsthantodoingthecalculationinthequery?为什么这个MySQL存储函数给出的结果与在查询中进行计算不同?【发布时间】:2011-0... 查看详情

为啥这个 SPARQL 查询缺少这么多结果?

】为啥这个SPARQL查询缺少这么多结果?【英文标题】:WhyisthisSPARQLquerymissingsomanyresults?为什么这个SPARQL查询缺少这么多结果?【发布时间】:2016-05-3113:35:00【问题描述】:(首先,我很抱歉,因为这是一个公然的交叉帖子。我认... 查看详情

mysql为啥查询时有时快,有时慢

...度比不创建索引要快几倍至几十倍。sql语句不够优化。在查询某数据的时候,能不用*就尽量不用,想要哪个字段就查哪个,多余的不要,这样就能达到数据传输精简化,让查询速度也能快上许多。多表联合查询。在大数据量的... 查看详情

为啥 UNION 比 OR 语句快 [重复]

...了这个问题,使用JOINs、使用NOTIN和使用NOTEXISTS。但是,查询最终每次都非常慢。然后我尝试 查看详情

为啥这个查询需要这么长时间?

】为啥这个查询需要这么长时间?【英文标题】:Whydoesthisquerytakesolong?为什么这个查询需要这么长时间?【发布时间】:2010-09-1309:34:02【问题描述】:我有一个复杂的查询需要在MySQL服务器上运行。在我的家庭测试机器上,一个m... 查看详情

为啥这个 firestore 查询需要索引?

】为啥这个firestore查询需要索引?【英文标题】:Whydoesthisfirestorequeryrequireanindex?为什么这个firestore查询需要索引?【发布时间】:2019-05-1608:11:40【问题描述】:我有一个带有相等运算符的where()方法和一个orderBy()方法的查询,但... 查看详情

为啥 mySQL 查询,左连接“明显”比我的内连接快

】为啥mySQL查询,左连接“明显”比我的内连接快【英文标题】:WhyismySQLquery,leftjoin\'considerably\'fasterthanmyinnerjoin为什么mySQL查询,左连接“明显”比我的内连接快【发布时间】:2012-01-0307:37:13【问题描述】:我对此进行了研究,... 查看详情

请问在大数据量查询的时候,sql为啥比excel要快很多呢?谢谢!

我知道这个sql比excel要快很多,但是我想知道原因是什么,谢谢!参考技术Aexcel需要将所有数据加载,然后一条一条筛选,就是用来存放数据的而sql是专门用于统计信息和调用的 查看详情

为啥这个 sql 查询不能准确传递结果?

】为啥这个sql查询不能准确传递结果?【英文标题】:whythissqlquerydoesnotpassresultaccurately?为什么这个sql查询不能准确传递结果?【发布时间】:2013-07-2407:18:14【问题描述】:我希望sum(t1+t2)asd结果使用groupbytblpersonalInfo.applicantID准确... 查看详情

如果查询中的日期时间有时区,MariaDB MySQL 查询要长得多,但如果没有添加时区,则非常快 - 为啥?

】如果查询中的日期时间有时区,MariaDBMySQL查询要长得多,但如果没有添加时区,则非常快-为啥?【英文标题】:MariaDBMySQLqueryismuchlongerifdatetimeinqueryhastimezone,butveryfastifnotimezoneisadded-why?如果查询中的日期时间有时区,MariaDBMySQL... 查看详情

为啥这个 mySQL 查询非常慢?

】为啥这个mySQL查询非常慢?【英文标题】:WhyisthismySQLqueryextremelyslow?为什么这个mySQL查询非常慢?【发布时间】:2013-07-0913:33:24【问题描述】:给定一个名为“orders_products”的mySQL表,其中包含以下相关字段:products_idorders_id两... 查看详情

为啥这个 oracle 查询这么慢?

】为啥这个oracle查询这么慢?【英文标题】:Whyisitsoslowthisoraclequery?为什么这个oracle查询这么慢?【发布时间】:2016-01-0705:36:47【问题描述】:我有一个很大的表,我需要获取满足这些要求的各个行:在第1列和第2列中重复了多... 查看详情

这两个查询为啥以及如何工作

】这两个查询为啥以及如何工作【英文标题】:Whyandhowdothesetwoqueriesbothwork这两个查询为什么以及如何工作【发布时间】:2021-12-2804:26:35【问题描述】:我一直在尝试使用SQLBolts教程学习SQL,对于这个练习,我需要编写一个查询来... 查看详情

为啥这个 MySQL 查询会减慢我的代码速度

】为啥这个MySQL查询会减慢我的代码速度【英文标题】:WhyisthisMySQLqueryslowingdownmycode为什么这个MySQL查询会减慢我的代码速度【发布时间】:2012-04-1314:16:59【问题描述】:目前我有一个在PHP中运行的MySQL查询,在查看结果时我会更... 查看详情

MySQL:为啥这个 SQL 查询不使用索引?

】MySQL:为啥这个SQL查询不使用索引?【英文标题】:MySQL:WhyisthisSQL-querynotusingindex?MySQL:为什么这个SQL查询不使用索引?【发布时间】:2014-12-1718:32:04【问题描述】:我有一个非常简单的SELECT,它使用文件排序并且不使用索引。... 查看详情