`
klinmy
  • 浏览: 11720 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

Oracle 查询--避免使用Union All的情况

阅读更多

记一次Oracel的查询调整
 
业务表定义-- 经济特区定义表
 
 
CityConfig (province varchar2(4), city varchar2(4), flag varchar2(1));
 
-- 市级别的每日收支记录
 
BusiStatRpt(province varchar2(4), city varchar2(4), income number(20,2), Expenses number(20,2), recordDate varchar2(8));
 
 
 
业务场景定义:
按省统计一段时间内的数据,其中经济特区的数据按省级进行统计,经济特区的城市配置在CityConfig表中flag = 1。
 
 
写法一:简单直接,不用思考,但在大数据量的情况下查询效率比较低 
 

-- 普通的写法直接Union all 
Select province, '1' kind, sum(income), sum(Expenses) 
  from BusiStatRpt rpt 
where not exists (select * 
          from CityConfig cfg 
         where cfg.province = rpt.province 
           and cfg.city = rpt.city 
           and cfg.flag = '1') 
group by province 
union all 
Select City, '2', kind, sum(income), sum(Expenses) 
  from BusiStatRpt rpt 
where exists (select * 
          from CityConfig cfg 
         where cfg.province = rpt.province 
           and cfg.city = rpt.city 
           and cfg.flag = '1') 
group by province, city; 
 
  

 
 
写法二:采用子查询,对大表只进行了一次扫描,查询效率不错 
  

-- 优点,采用子查询,对大表只进行了一次扫描 
Select dept, sum(income), sum(Expenses) 
  from (select case 
                 when (select flag 
                         from CityConfig cfg 
                        where cfg.province = province 
                          and cfg.city = city) = '1' then 
                  province || '2' || city 
                 else 
                  province || '10000' 
               end dept, 
               sum(income) income, 
               sum(Expenses) Expenses 
          from BusiStatRpt rpt 
         group by province, city) 
group by province; 
  

 
  
哈哈,同事写出来的,我调整了下,看来自己真的老了,只想着能完成任务就行了,以后还得多学习学习。
 

分享到:
评论

相关推荐

    union all与order by用法

    在 Oracle PL/SQL 中, UNION ALL 和 ORDER BY 的使用需要遵循一定的规则和限制。本文将详细介绍 UNION ALL 和 ORDER BY 的用法,并通过实例解释其应用场景。 UNION ALL 的用法 UNION ALL 用于合并两个或多个 ...

    27.Oracle union多表查询1

    - 当使用 `UNION` 或 `UNION ALL` 时,Oracle 数据库需要对结果进行排序以去除重复的行(对于 `UNION`),这可能会增加查询的时间。因此,在不需要去重的情况下,使用 `UNION ALL` 可能会更快。 - 为了提高查询...

    oracle查询语句优化

    - **推荐方案**:使用UNION ALL代替UNION,以避免不必要的排序和去重操作。 #### 三、SQL编写技巧 ##### 1. SQL格式统一 - **好处**:虽然不同的SQL写法最终会被Oracle解析成相同的执行计划,但保持SQL格式一致有...

    Oracle提高查询效率的方法

    2. 注意 union 和 union all 的区别:union 比 union all 多做了一步 distinct 操作,能用 union all 的情况下尽量不用 union。 3. 查询时尽量不要返回不需要的行、列:在多表连接查询时,尽量改成连接查询,少用子...

    oracle性能问题总结

    - **使用UNION-ALL替代UNION**:无排序需求时,UNION-ALL更快。 - **避免不必要的排序和昂贵操作**:DISTINCT、UNION、MINUS、INTERSECT、ORDER BY等操作会消耗大量资源。 4. **表设计和其他优化** - **冗余与非...

    oracle查询优化[文].pdf

    推荐使用UNION ALL代替,除非确实需要去重。 10. **合理使用LIKE操作符**: - LIKE操作符配合通配符可以实现灵活查询,但过度使用可能导致性能问题。应尽量限制通配符的使用,特别是在查询前缀时,可考虑前缀索...

    oracle操作文档

    2. **使用右连接**:在某些情况下,使用右连接(RIGHT JOIN)而不是左连接(LEFT JOIN)可以提高查询速度,特别是在处理具有大量数据的表时更为明显。 - 示例:`SELECT * FROM T1 RIGHT JOIN T2 ON T1.ID = T2.ID...

    浅谈Oracle数据库性能的优化

    2. **查询优化**:重构查询语句,避免使用可能导致全表扫描的查询条件,如`SELECT * FROM table_name WHERE column_name LIKE '%search_string%'`这类模糊匹配查询。 3. **统计信息更新**:定期更新表的统计信息,...

    Oracle性能问题总结

    在 SQL 相关方面,需要注意 Oracle 的 From 子句表的顺序,Where 子句表达式的顺序,避免使用 ‘*’,使用 Truncate 代替 Delete,使用索引尽量减少对表的查询,避免使用右匹配或者中间匹配的模糊查询,并注意使用 ...

    oracle的sql优化

    - Toad和PL/SQL Developer等工具能帮助分析SQL性能和索引使用情况。 - 可以使用 Hint 强制优化,但通常应谨慎,避免过度干预。 - 对于仅存储"是/否"信息的字段,不建议建立常规索引,可以考虑位图索引。 - 当...

    Oracle SQL最佳实践

    在合并多个查询结果时,我们通常会使用 `UNION` 或 `UNION ALL`。其中 `UNION` 会在返回结果前进行排序并去除重复记录,这可能会消耗大量的计算资源。相比之下,`UNION ALL` 不会对结果进行排序或去重,因此执行效率...

    sql优化-oracle数据库.ppt

    - **查询重构**:避免在JOIN条件中使用非索引列,减少索引失效情况。 - **物化视图**:对于固定的复杂查询,创建物化视图可提前计算结果,提高查询速度。 - **索引覆盖**:确保查询所需的所有列都在索引中,以...

    OracleSQL优化-中级篇.rar

    7. SQL语法优化:避免使用子查询、嵌套循环和不必要的连接,尽可能使用连接运算符(如UNION ALL而非UNION)和集合函数,可以减少计算开销。 8. 版本控制和历史数据管理:在处理历史数据时,时间相关的表设计(如...

    Oracle查询优化改写 技巧与案例

    5. **集合操作优化**:UNION、UNION ALL、INTERSECT和MINUS的使用场景和性能差异,以及如何选择合适的方法进行数据合并。 6. **分页查询优化**:ROWNUM、ROWNUMBER()、FETCH NEXT和OFFSET/FETCH等方法在分页查询中...

    SQL优化教程

    - **使用UNION ALL代替UNION**:UNION会去重,可能导致排序,UNION ALL则不进行这些操作。 4. **索引策略** - **创建合适索引**:针对经常出现在WHERE子句中的列创建索引。 - **复合索引**:根据查询条件选择...

    Oracle数据库学习日记-实用性最强的Oracle学习总结.docx

    - **Connect**: 使用 `connect` 命令可以连接到Oracle数据库。语法通常为 `connect username/password@database_name;` - 示例:`connect scott/tiger@orcl;` - **Disconnect**: 使用 `disconnect` 命令可以断开与...

    处理百万级以上的数据提高查询速度的方法

    - **建议**: 避免使用 `IN` 运算符来表达范围查询,可以使用 `BETWEEN` 替代。 - **替代方法**: - 如果是连续的范围,使用 `BETWEEN` 更好。 ```sql SELECT id FROM t WHERE num BETWEEN 1 AND 3; ``` #### 5. ...

    不让临时表空间影响ORACLE数据库性能

    - **合理分配大小**:根据数据库的业务需求和历史使用情况,预估临时表空间的大小,避免频繁扩展。 - **创建多个临时表空间**:分散用户负载,减少资源争抢。 - **设置pga_aggregate_target**:调整PGA(程序全局...

    Oracle SQL性能优化.doc

    - **UNION与UNION-ALL**:UNION-ALL不会去除重复行,因此在不需要去重的情况下使用UNION-ALL可以提高性能。 #### 三十七、使用提示(Hints) - **查询提示**:通过使用查询提示来指导优化器的行为,可以提高查询效率...

    Oracle高效SQL语句原则.txt

    - **建议**:通过组合使用多个`AND`条件或者使用`UNION ALL`来代替复杂的`OR`条件,以提高查询效率。 8. **减少嵌套查询的使用**: - 嵌套查询通常比简单的查询更复杂,也更耗费资源。 - **建议**:尽可能地将...

Global site tag (gtag.js) - Google Analytics