3. Overview of SGA
System global area (SGA)
The SGA is a group of shared memory structures, known as SGA components, that contain data and
control information for one Oracle Database instance. The SGA is shared by all server and background
processes. Examples of data stored in the SGA include cached data blocks and shared SQL areas.
资料来源:http://docs.oracle.com/cd/B28359_01/server.111/b28318/memory.htm
10. 用WHERE子句替换HAVING子句
• HAVING中的条件一般用于集合函数的比较,如count(),否则一
般条件应写在WHERE子句中
因为HAVING只会在检索出所有记录后才进行对结果集的过滤,这个处理需要总计或排序
等操作。如果通过WHERE子句限制记录条数,就能减少这个开销。
应用场景举例:4PL监控看板中计算合单量SQL
SELECT G.LSO_FATHER_ID SELECT G.LSO_FATHER_ID
FROM WL_MONITOR_GRAND_ORDER G FROM WL_MONITOR_GRAND_ORDER G
WHERE G.LSO_FATHER_ID != 0 WHERE
AND G.O_PRODUCT_ID = '10000' G.O_PRODUCT_ID = '10000'
AND G.T_PLATFORM_CODE = 'TB' AND G.T_PLATFORM_CODE = 'TB'
AND G.T_SUPPLIER_CHANNEL = 0 AND G.T_SUPPLIER_CHANNEL = 0
AND G.O_GMT_PAY >= '2012-08-01 00:00:00' AND G.O_GMT_PAY >= '2012-08-01 00:00:00'
AND G.O_GMT_PAY <= '2012-08-21 00:00:00' AND G.O_GMT_PAY <= '2012-08-21 00:00:00'
AND G.O_PAY_STATUS != 'TRADE_CLOSED' AND G.O_PAY_STATUS != 'TRADE_CLOSED'
AND G.LSO_IS_DELETED='N' AND G.LSO_IS_DELETED='N'
GROUP BY G.LSO_FATHER_ID GROUP BY G.LSO_FATHER_ID
HAVING COUNT(G.LSO_FATHER_ID)>1 HAVING COUNT(G.LSO_FATHER_ID)>1
AND G.LSO_FATHER_ID != 0
11. EXISTS?IN?
并不是简单的都要使用EXISTS替代IN
in是对外表和内表作Hash Join(哈希连接)
而exist是对外表和内表做了一个Nested loop(嵌套连接)
例如:表A(小表),表B(大表),CC列上有索引
select * from A where cc in (select cc from B) – 低效
A是小表,CC索引优势不明显,B表索引没充分利用
select * from A where exists(select cc from B where cc=A.cc) – 高效
遍历A,但小表次数也少,用到了B表索引
补充点:Not in内外表都做全表扫描,没用到索引,而Not exists子查询仍能用到索引
子句 使用策略
EXISTS 小表大表
IN 大表小表
NOT EXISTS 尽量用
NOT IN 尽量不用
12. 用EXISTS替换DISTINCT
• 一对多表查询时,避免使用DISTINCT,可考虑用EXISTS替
换
应用场景举例:查询所有被用户购买过的4PL-SPU
SQL idb测试用时 比较
select distinct p.id
from wl_product p, wl_logistics_suborder o 性能低
where p.id = o.spu_id
select p.id
from wl_product p
where exists (select 1 性能高
from wl_logistics_suborder o
where o.spu_id = p.id)