如何仅修改SELECT语句降低含SUM与JOIN的SQL查询成本
原因说明
你观察到两个查询成本完全一致,是因为数据库优化器自动做了连接消除优化:
- 你的业务中CARS表的
C_ORDERKEY是指向ORDERS表O_ORDERKEY的外键,且O_ORDERKEY是ORDERS表的主键/存在唯一约束 - 原查询中完全没有使用ORDERS表的任何字段,也不会因为JOIN过滤或新增数据行
所以优化器在生成执行计划时直接删掉了ORDERS表的关联逻辑,两个SQL实际执行的操作完全相同,执行计划和成本自然没有差异。
仅修改SELECT语句的优化方案
当前执行计划的瓶颈是CARS表的全表扫描,要降低成本只需要让查询走覆盖索引即可:
如果CARS表上已经存在C_QUANTITY列的单列索引,你可以添加优化器提示强制走索引,Oracle写法参考:
SELECT /*+ INDEX(CARS 你的C_QUANTITY列索引名) */ SUM(C_QUANTITY) FROM CARS;
如果还没有对应索引,仅修改查询语句无法降低成本,因为求和操作必须遍历所有C_QUANTITY的值,全表扫描是不可避免的,你需要额外创建C_QUANTITY列的单列索引,优化器会自动选择走索引扫描,成本会远低于全表扫描。
内容的提问来源于stack exchange,提问作者Sunny J
相关产品推荐
相关产品推荐

