DBMS 优化器 - 最佳执行计划,无论查询的公式如何

2023-12-28

如果在关系型 DBMS 中编写查询 Q,那么无论如何制定 Q,优化器都不会选择最佳的执行方式(取决于多种因素)吗?我对 SQL Server 和 Oracle 很好奇。

例如,设 Q 为:

SELECT * 
FROM t1, t2
WHERE t1.some_column = t2.some_column

如果存在正确的索引(具有正确的选择性),我们应该会看到索引查找后面可能是键查找。我们不会看到叉积后跟执行计划中的选择。

那为什么https://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx https://technet.microsoft.com/en-us/library/ms189575(v=sql.105).aspx指出“在 Transact-SQL 中,包含子查询的语句与不包含子查询的语义等效版本之间通常没有性能差异。但是,在某些必须检查存在性的情况下,联接会产生更好的性能。”如何编写查询 Q,无论 Q 的查询类(SPJ、SPJ + UNION、SPJ + 子查询等),优化器都不会找到最佳的语义等效版本吗?

谢谢你!


无论如何制定 Q,优化器都不会选择最佳的执行方式(取决于多种因素)吗?

我想引用 Itzik Ben-Gan 书中的话:使用窗口函数的 Microsoft SQL Server 2012 高性能 T-SQL http://tsql.solidq.com/books/windowfunctions2012/

有几个原因。

其一,SQL Server 的优化器并不完美。我不想要 听起来不太欣赏——当你想到它的作用时,SQL Server 的优化器确实是一个奇迹。 软件组件可以实现。但事实是它并没有所有可能的优化 其中编码的规则。

第二,优化器必须限制优化所花费的时间;否则,它可能会花费比优化查询更长的时间 优化减少了查询的运行时间。

这种情况可能很荒谬,就像在没有检查所有可能的计划的情况下在几十毫秒内制定一个计划并且运行时间只有几秒钟,但为了减少几秒钟而制定所有可能的计划可能需要一年的时间甚至几个。您可以看到,出于实际原因,优化器需要限制优化所花费的时间。

根据查询中涉及的表的大小等因素,SQL Server 计算两个值:一个是成本考虑 - 埃雷德 够好了 用于查询,另一个是花费的最大时间 停止前的优化。如果达到任一阈值,优化就会停止,SQL Server 使用当时发现的最佳计划。

总而言之,很少有语句被优化,很少没有被优化

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

DBMS 优化器 - 最佳执行计划,无论查询的公式如何 的相关文章

  • SQLSTATE[HY000] [2002] 资源暂时不可用 - mysql - innodb 和 pdo

    在我的错误日志中得到大量结果 如下所列 数据库中的所有表都是 innodb 并且就与这些表的任何交互而言 一切都是带有准备好的语句的 pdo 正如我所说 所有错误几乎与下面列出的错误相同 但发生在几个不同的页面上 无论页面如何 错误行始终指
  • SQL Server 支持哈希索引吗?

    所有索引都在SQL Server B Tree中吗 主键和外键肯定应该是基于哈希的索引吗 SQL Server中并非所有索引都是B树索引 SQL Server 2012添加了列存储索引 http msdn microsoft com en
  • PHP DBlib PDO 问题

    我正在尝试通过 php 连接到 MSSQL 服务器 但我的 pdo 连接给我带来了困难和我不太理解的错误 我在下面粘贴的代码一周前运行得很好 突然间它就停止了 没有任何人进行任何更改 我仍然可以连接到服务器并直接从命令行运行查询 但我在 p
  • 为什么查询优化器完全忽略索引视图索引?

    SQL 小提琴 http sqlfiddle com 6 d4496 1 http sqlfiddle com 6 d4496 1 数据是为您的实验预先生成的 有一个明显的表格 CREATE TABLE Entity ID int Clas
  • 与 FOREIGN KEY 约束冲突

    我有两张桌子 学术界 CREATE TABLE dbo R ACADEMIE ID ACADEMIE dbo IDENTIFIANT NOT NULL LC ACADEMIE CODE dbo LIBELLE COURT NOT NULL
  • SQL 插入失败 - 违反主键约束

    我在 SQL Insert 语句中看到一个非常奇怪的问题 我有一个简单的表 带有一个 ID 和 2 个日期时间 请参阅下面的创建脚本 CREATE TABLE dbo DATA POPULATION LOGS ID int IDENTITY
  • 该驱动程序未配置为集成身份验证

    尝试使用以下命令将我的 Java Web 应用程序与 MS SQL 服务器连接sqljdbc41 for jdk 1 8 这是数据库连接代码 Connection connection String url jdbc sqlserver l
  • 在sql server 2008中插入新记录时如何检查数据库中的值是否已存在

    我创建了一个存储过程 用于从表中选择值 如果该值已经存在 那么它将更新该值 但如果不存在 那么它将插入新值 我为此使用了存储过程 如下所示 Create PROCEDURE dbo sp Insert Tid int NULL Quid i
  • 如何将整行(在 SQL 中,而不是 PL/SQL 中)传递给存储函数?

    我遇到以下 非常简单 问题 我想编写一个 Oracle SQL 查询 大致如下 SELECT count MyFunc MyTable FROM MyTable GROUP BY MyFunc MyTable 在 PL SQL 中 可以使用
  • Postgresql 使用 IN 与 NOT IN 时的巨大性能差异

    我有两张桌子 transaksi 和 buku transaksi 大约有 25 万行 buku 大约有 17 万行 两个表都有名为 k999a 的列 并且两个表均不使用索引 现在我检查这两个陈述 声明一 explain select k9
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • 在 Doctrine DQL 中选择 count() ,并使用左连接多对多单向关系,其中用户没有关系特定组

    情况 我尝试在 DQL 中为不属于特定组的用户选择 count 标准ManyToMany之间的单向关系User and Group实体来自FOSUserBundle and SonataUserBundle 系统 Symfony 2 5 D
  • 部署 dacpac 所需的权限

    我正在尝试使用 sqlpackage exe 在租户上部署 dacpac 目前 我正在向将部署此功能的帐户授予 SysAdmin 或 db owner 权限 并且它工作正常 但在生产中 如果目标租户数据库属于其他应用程序 我可能无法获得这些
  • Java 中的 ExecuteUpdate sql 语句不起作用

    我正在学习如何将 SQL 与 Java 结合使用 我已成功安装 JDBC 驱动程序 并且能够从数据库读取记录并将其打印在屏幕上 我的问题发生在尝试执行更新或插入语句时 没有任何反应 这是我的代码 问题所在的方法 public static
  • MySQL 中的 group_concat 性能问题

    我添加了一个group concat到一个查询并杀死了性能 添加之前和之后的解释计划是相同的 所以我对如何优化它感到困惑 这是查询的简化版本 SELECT curRow curRow 1 AS row number docID docTyp
  • 如何在测试期间强制锁定升级(以消除死锁问题)?

    在此发布问题和一个答案 也许有人有更好的答案 编写触发死锁的代码是可能的即使对于单个用户如果开发人员不小心打开了与数据库的第二个连接 而不是重用现有的连接 可能已经有一个打开的事务 某些 O RM 和 LINQ 框架很容易犯这个错误 以下是
  • 在 Sql Server 中启用 DTD 支持

    我有各种 xml 文档需要存储在数据库列中 这些文档包含对 DTD 的引用 并且 SQL Server 不会导入 xml 因为它存在安全风险 如何在数据库上启用 DTD 支持 以便它可以让我插入 xml 内容 你必须CONVERT首先 MS
  • 将 5 gig 文件导入表时出错

    我正在尝试批量插入表 use SalesDWH go BULK INSERT dbo npi FROM S tmp npi csv WITH FIELDTERMINATOR ROWTERMINATOR n lastrow 200 first
  • MySql 复合索引

    我们使用 MySql 作为我们的数据库 以下查询在 mysql 表 大约 2500 万条记录 上运行 我在这里粘贴了两个查询 查询运行得太慢 我想知道更好的复合索引是否可以改善这种情况 你知道最好的综合指数是什么吗 并建议我这些查询是否需要
  • 在 Dockerfile 中切换到 root 用户

    我运行了这个命令 docker pull mcr microsoft com mssql server 2019 latest 然后我创建了一个 dockerfile 来使用此容器映像作为另一个容器的基础映像 escape FROM mcr

随机推荐