为啥目前的数据库查询优化技术不支持计算列的优化?

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 优化工具了。

【讨论】:

以上是关于为啥目前的数据库查询优化技术不支持计算列的优化?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 Cassandra 内部不支持聚合?

dbt - jinja - bigquery - 查询优化

数据库查询优化技术

Mysql查询优化从入门到跑路数据库查询优化技术总揽

MySQL优化COUNT()查询

MySQL大数据量分页查询方法及其优化