首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >为什么当前的DB查询优化技术不支持对计算列的优化?

问为什么当前的DB查询优化技术不支持对计算列的优化?
EN

Stack Overflow用户
提问于 2017-07-13 11:34:38
回答 1查看 37关注 0票数 0

对于下面的查询,我们知道目前的关系数据库系统,无论是MYSQL、SQL Server还是Oracle,即使在column1上建立了索引,也不支持索引查找查询。

代码语言:javascript
复制
select * from table1 where column1+123=1000

我的问题是,为什么目前的QO技术不能进行优化,比如将上面的SQL语句转换为下面的SQL语句?

代码语言:javascript
复制
select * from table1 where column1=877
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2017-07-13 14:16:56

一方面,这个问题会引起这里不鼓励的意见。

另一方面,有一个实际的原因,为什么优化不应该发生,但它需要一个比您提供的用例更复杂的用例。

给定:

应用程序中的SQL语句

代码语言:javascript
复制
select * from table1 where column1 = :val1 and column2 = :val2
select * from table1 where column1 = :val1
select * from table1 where column2 = :val2

表中的索引

代码语言:javascript
复制
I1 on (column1)
I2 on (column2)

第一条语句的执行计划是次优的(对于RDBMS的某些版本),因此选择了一个非常昂贵且相等的行源操作(RSO),其中的子RSO是两个候选索引的索引范围扫描。但是,直到您有一个客户提供了显示问题的数据,您才会看到问题。

第二条语句使用column1索引,通常执行得很好。

第三条语句使用column2索引,通常执行得很好。

第一条语句执行得非常糟糕,以至于联系了供应商。供应商确定了多个解决方案,然后决定修改查询,如下所示:

代码语言:javascript
复制
 select * from table1 where column1+0 = :val1 and column2 = :val2

或者,当列为varchar2时,如下所示:

代码语言:javascript
复制
 select * from table1 where column1||'' = :val1 and column2 = :val2

来排除次优的执行计划。这项技术非常好地实现了规定的目标,我已经看到多家软件供应商使用了它。

如果RDBMS公司很久以前就采用了您所描述的自动化优化,那么软件供应商和开发人员就可以少用一个手动SQL优化工具了。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/45070983

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档