Chr*_*ris 6 optimization sql-standard
我最近被一个错误(在我的代码中)所困扰,其中这两个查询的运行时截然不同:
select * from smalltable st
inner join bigtable bt on st.btid = bt.btid
select * from bigtable bt
inner join smalltable st on bt.btid = st.btid
Run Code Online (Sandbox Code Playgroud)
以及单个查询在 where 过滤器中为不同的字符串寻找不同的执行计划。
是否有任何优化的、完全声明性的 SQL 标准实现,以便上述两个查询具有相同的执行计划?
Jus*_*ave 11
任何具有基于成本的优化器的数据库(基本上包括任何企业级数据库)通常会将这两个查询视为相同。但是,没有任何基于成本的优化器是完美的,也不可能是完美的——它们偶尔都会选择一个糟糕的计划。
如果您使用的是基于成本的优化器,并且优化器具有关于表和索引的相当准确的信息(此信息通常是异步收集的,并且通常在其他活动相对较少的晚上/早晨收集),则应该相对清晰(对于某些价值观smalltable和bigtable假设正确的索引),最有效的计划是做一个全表扫描smalltable,然后做索引查找bigtable使用这些行连接条件。如果数据库认为smalltable有 10% 的行bigtable而不是 0.1% 的行bigtable,另一方面,有许多不同的计划需要考虑。随着数据库支持的表数量、谓词数量和访问路径数量的增加,查询计划的潜在数量呈指数增长。但是优化器必须找到最佳计划的时间并没有增加——如果数据库在开始执行查询之前花费几分钟来找出最佳计划,您通常会感到不安。因此,基于成本的优化器永远不会是完美的——它们没有时间充分探索每条路径,并且它们依赖可能过时的统计数据来确定哪些计划是最佳的。然而,大多数时候,当查询没有谓词和简单的连接条件时,他们非常擅长找出连接两个表的最佳方式。
| 归档时间: |
|
| 查看次数: |
161 次 |
| 最近记录: |