AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 114853
Accepted
Martin Smith
Martin Smith
Asked: 2015-09-13 06:17:29 +0800 CST2015-09-13 06:17:29 +0800 CST 2015-09-13 06:17:29 +0800 CST

为什么这些类似的查询使用不同的优化阶段(事务处理与快速计划)?

  • 772

此连接项中的示例代码

显示一个错误

SELECT COUNT(*)
FROM   dbo.my_splitter_1('2') L1
       INNER JOIN dbo.my_splitter_1('') L2
         ON L1.csv_item = L2.csv_item

返回正确的结果。但以下返回不正确的结果(2014 年使用新的基数估计器)

SELECT
    (SELECT COUNT(*)
    FROM dbo.my_splitter_1('2') L1
     INNER JOIN dbo.my_splitter_1('') L2
        ON L1.csv_item = L2.csv_item)

由于它错误地将 L2 的结果加载到公共子表达式假脱机中,然后重播 L1 结果的结果。

我很好奇为什么两个查询之间的行为会有所不同。Trace Flag 8675 显示有效的进入search(0) - transaction processing,失败的进入search(1) - quick plan。

所以我假设额外转换规则的可用性是行为差异的背后原因(例如,禁用 BuildGbApply 或GenGbApplySimple似乎可以修复它)。

但是为什么针对这些非常相似的查询的两个计划会遇到不同的优化阶段呢?从我读过的内容来看search (0),至少需要三个表,而第一个示例中肯定不满足该条件。

sql-server optimization
  • 1 1 个回答
  • 164 Views

1 个回答

  • Voted
  1. Best Answer
    Paul White
    2015-09-13T14:05:39+08:002015-09-13T14:05:39+08:00

    每个阶段都有进入条件。“至少有三个表引用”是我们在举简单例子时所说的进入条件之一,但不是唯一的。

    一般只允许基本的join 和union 进入search 0;标量子查询、半连接等阻止搜索 0 的条目。这个阶段实际上是针对非常常见的 OLTP 类型的查询形状。探索不常见事物所需的规则并未启用。您的示例查询有一个标量子查询,因此输入失败。

    它还取决于您如何计算表引用。我从来没有用函数深入研究过这个,但逻辑可能正在计算表值函数以及它们产生的表变量。它甚至可以计算函数本身内部的表引用——我不确定;尽管我确实知道功能是全面的艰苦工作。

    的错误GenGbApplySimple是丑陋的。这种计划形状始终是可能的,但由于成本原因而被拒绝,直到更改为 100 行假定表变量基数出现。USE PLAN例如,可以通过提示在 2014 年之前的 CE 上强制使用有问题的计划形状。

    关于新的 Connect 项目与之前报告的问题相同,您是正确的。

    举个例子,以下查询符合搜索 0 的条件:

    DECLARE @T AS table (c1 integer NULL);
    
    SELECT U.c1, rn = ROW_NUMBER() OVER (ORDER BY U.c1) 
    FROM 
    (
        SELECT c1 FROM @T AS T
        UNION
        SELECT c1 FROM @T AS T
        UNION
        SELECT c1 FROM @T AS T
    ) AS U;
    

    做一个小的改变来包含一个标量子查询意味着它直接去搜索 1:

    DECLARE @T AS table (c1 integer NULL);
    
    SELECT U.c1, rn = ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) -- Changed!
    FROM 
    (
        SELECT c1 FROM @T AS T
        UNION
        SELECT c1 FROM @T AS T
        UNION
        SELECT c1 FROM @T AS T
    ) AS U;
    
    • 7

相关问题

  • SQL Server - 使用聚集索引时如何存储数据页

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve