记一次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;
哈哈,同事写出来的,我调整了下,看来自己真的老了,只想着能完成任务就行了,以后还得多学习学习。
分享到:
相关推荐
在 Oracle PL/SQL 中, UNION ALL 和 ORDER BY 的使用需要遵循一定的规则和限制。本文将详细介绍 UNION ALL 和 ORDER BY 的用法,并通过实例解释其应用场景。 UNION ALL 的用法 UNION ALL 用于合并两个或多个 ...
- 当使用 `UNION` 或 `UNION ALL` 时,Oracle 数据库需要对结果进行排序以去除重复的行(对于 `UNION`),这可能会增加查询的时间。因此,在不需要去重的情况下,使用 `UNION ALL` 可能会更快。 - 为了提高查询...
- **推荐方案**:使用UNION ALL代替UNION,以避免不必要的排序和去重操作。 #### 三、SQL编写技巧 ##### 1. SQL格式统一 - **好处**:虽然不同的SQL写法最终会被Oracle解析成相同的执行计划,但保持SQL格式一致有...
2. 注意 union 和 union all 的区别:union 比 union all 多做了一步 distinct 操作,能用 union all 的情况下尽量不用 union。 3. 查询时尽量不要返回不需要的行、列:在多表连接查询时,尽量改成连接查询,少用子...
- **使用UNION-ALL替代UNION**:无排序需求时,UNION-ALL更快。 - **避免不必要的排序和昂贵操作**:DISTINCT、UNION、MINUS、INTERSECT、ORDER BY等操作会消耗大量资源。 4. **表设计和其他优化** - **冗余与非...
推荐使用UNION ALL代替,除非确实需要去重。 10. **合理使用LIKE操作符**: - LIKE操作符配合通配符可以实现灵活查询,但过度使用可能导致性能问题。应尽量限制通配符的使用,特别是在查询前缀时,可考虑前缀索...
2. **使用右连接**:在某些情况下,使用右连接(RIGHT JOIN)而不是左连接(LEFT JOIN)可以提高查询速度,特别是在处理具有大量数据的表时更为明显。 - 示例:`SELECT * FROM T1 RIGHT JOIN T2 ON T1.ID = T2.ID...
2. **查询优化**:重构查询语句,避免使用可能导致全表扫描的查询条件,如`SELECT * FROM table_name WHERE column_name LIKE '%search_string%'`这类模糊匹配查询。 3. **统计信息更新**:定期更新表的统计信息,...
在 SQL 相关方面,需要注意 Oracle 的 From 子句表的顺序,Where 子句表达式的顺序,避免使用 ‘*’,使用 Truncate 代替 Delete,使用索引尽量减少对表的查询,避免使用右匹配或者中间匹配的模糊查询,并注意使用 ...
- Toad和PL/SQL Developer等工具能帮助分析SQL性能和索引使用情况。 - 可以使用 Hint 强制优化,但通常应谨慎,避免过度干预。 - 对于仅存储"是/否"信息的字段,不建议建立常规索引,可以考虑位图索引。 - 当...
在合并多个查询结果时,我们通常会使用 `UNION` 或 `UNION ALL`。其中 `UNION` 会在返回结果前进行排序并去除重复记录,这可能会消耗大量的计算资源。相比之下,`UNION ALL` 不会对结果进行排序或去重,因此执行效率...
- **查询重构**:避免在JOIN条件中使用非索引列,减少索引失效情况。 - **物化视图**:对于固定的复杂查询,创建物化视图可提前计算结果,提高查询速度。 - **索引覆盖**:确保查询所需的所有列都在索引中,以...
7. SQL语法优化:避免使用子查询、嵌套循环和不必要的连接,尽可能使用连接运算符(如UNION ALL而非UNION)和集合函数,可以减少计算开销。 8. 版本控制和历史数据管理:在处理历史数据时,时间相关的表设计(如...
5. **集合操作优化**:UNION、UNION ALL、INTERSECT和MINUS的使用场景和性能差异,以及如何选择合适的方法进行数据合并。 6. **分页查询优化**:ROWNUM、ROWNUMBER()、FETCH NEXT和OFFSET/FETCH等方法在分页查询中...
- **使用UNION ALL代替UNION**:UNION会去重,可能导致排序,UNION ALL则不进行这些操作。 4. **索引策略** - **创建合适索引**:针对经常出现在WHERE子句中的列创建索引。 - **复合索引**:根据查询条件选择...
- **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. ...
- **合理分配大小**:根据数据库的业务需求和历史使用情况,预估临时表空间的大小,避免频繁扩展。 - **创建多个临时表空间**:分散用户负载,减少资源争抢。 - **设置pga_aggregate_target**:调整PGA(程序全局...
- **UNION与UNION-ALL**:UNION-ALL不会去除重复行,因此在不需要去重的情况下使用UNION-ALL可以提高性能。 #### 三十七、使用提示(Hints) - **查询提示**:通过使用查询提示来指导优化器的行为,可以提高查询效率...
- **建议**:通过组合使用多个`AND`条件或者使用`UNION ALL`来代替复杂的`OR`条件,以提高查询效率。 8. **减少嵌套查询的使用**: - 嵌套查询通常比简单的查询更复杂,也更耗费资源。 - **建议**:尽可能地将...