如果在关系型 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(使用前将#替换为@)