为啥目前的数据库查询优化技术不支持计算列的优化?
Posted
技术标签:
【中文标题】为啥目前的数据库查询优化技术不支持计算列的优化?【英文标题】:Why the current DB query optimization techniques doesn't support the optimization for the calculated column?为什么目前的数据库查询优化技术不支持计算列的优化? 【发布时间】:2017-12-17 16:00:21 【问题描述】:对于下面的查询,我们目前知道的关系型数据库系统,不管是mysql、SQL Server还是Oracle,都不支持index seek查询,即使column1上建有索引。
select * from table1 where column1+123=1000
我的问题是,为什么目前的 QO 技术没有做优化,比如将上面的 SQL 语句转换为下面的语句?
select * from table1 where column1=877
【问题讨论】:
人们可能很容易问为什么不你将查询优化为select * from table1 where column1=1000-123
?
【参考方案1】:
一方面,这个问题会引起这里不鼓励的意见。
另一方面,不应该进行优化有一个实际原因,但它需要一个比您提供的更复杂的用例。
给定:
应用程序中的 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),因此选择了非常昂贵的 AND-EQUAL 行源操作 (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 优化工具了。
【讨论】:
以上是关于为啥目前的数据库查询优化技术不支持计算列的优化?的主要内容,如果未能解决你的问题,请参考以下文章