对于下面的查询,我们知道目前的关系数据库系统,无论是MYSQL、SQL Server还是Oracle,即使在column1上建立了索引,也不支持索引查找查询。
select * from table1 where column1+123=1000我的问题是,为什么目前的QO技术不能进行优化,比如将上面的SQL语句转换为下面的SQL语句?
select * from table1 where column1=877发布于 2017-07-13 14:16:56
一方面,这个问题会引起这里不鼓励的意见。
另一方面,有一个实际的原因,为什么优化不应该发生,但它需要一个比您提供的用例更复杂的用例。
给定:
应用程序中的SQL语句
select * from table1 where column1 = :val1 and column2 = :val2
select * from table1 where column1 = :val1
select * from table1 where column2 = :val2表中的索引
I1 on (column1)
I2 on (column2)第一条语句的执行计划是次优的(对于RDBMS的某些版本),因此选择了一个非常昂贵且相等的行源操作(RSO),其中的子RSO是两个候选索引的索引范围扫描。但是,直到您有一个客户提供了显示问题的数据,您才会看到问题。
第二条语句使用column1索引,通常执行得很好。
第三条语句使用column2索引,通常执行得很好。
第一条语句执行得非常糟糕,以至于联系了供应商。供应商确定了多个解决方案,然后决定修改查询,如下所示:
select * from table1 where column1+0 = :val1 and column2 = :val2或者,当列为varchar2时,如下所示:
select * from table1 where column1||'' = :val1 and column2 = :val2来排除次优的执行计划。这项技术非常好地实现了规定的目标,我已经看到多家软件供应商使用了它。
如果RDBMS公司很久以前就采用了您所描述的自动化优化,那么软件供应商和开发人员就可以少用一个手动SQL优化工具了。
https://stackoverflow.com/questions/45070983
复制相似问题