海量数据查询速度优化

tanghuawei 2011-08-16 10:29:18
SELECT *
FROM (SELECT CASE
WHEN V2.FIELD1 > 0 THEN
'B'
ELSE
'R'
END VFIELD1,
CASE
WHEN V2.FIELD2 > 0 THEN
'B'
ELSE
'R'
END VFIELD2,
V2.FIELD3 || '''' || V2.FIELD4 ||
V2.FIELD5 AS CTMODEL,
(SELECT rtrim(LIST(DISTINCT FIELD6 || '/'), '/')
FROM TABLE2
WHERE ID = V2.ID) FIELD6LIST,
(SELECT rtrim(LIST(DISTINCT FIELD7 || '/'), '/')
FROM TABLE3
WHERE ID = V2.ID) FIELD7LIST,
(SELECT T4.STATE
FROM TABLE4 T4
WHERE T4.CNO = V2.CINNO) INSTATE,
(SELECT T4.STATE
FROM TABLE4 T4
WHERE T4.CNO = V2.COUTNO) OUTSTATE,
(SELECT CASE
WHEN COUNT(*) > 0 THEN
'Y'
ELSE
'N'
END
FROM TABLE5 T5
LEFT JOIN TABLE6 PARTITION(PARTCUR) T6
ON T5.MID = T6.MID
LEFT JOIN TABLE7 T7
ON T7.JCODE = T6.JCODE
WHERE T5.ID = V2.ID
AND T6.JCODE = 'C1'
and rownum = 1) ISMID,
(SELECT CASE
WHEN COUNT(*) > 0 THEN
'Y'
ELSE
'N'
END
FROM TABLE5 T5
LEFT JOIN TABLE6 PARTITION(PARTCUR) T6
ON T5.MID = T6.MID
LEFT JOIN TABLE7 T7
ON T7.JCODE = T6.JCODE
WHERE T5.ID = V2.ID
AND T6.JCODE = 'C2'
AND ROWNUM = 1) ISTOP,
(SELECT CASE
WHEN COUNT(V1.VID) > 0 THEN
'Y'
ELSE
'N'
END
FROM VIEW1 V1
WHERE V1.ID = V2.ID
AND V1.TYPE = 'T') ISPREE
FROM VIEW2 V2) TB


VIEW2大概有100多万条记录,VIEW1大概30W条记录,其他表不多,在不带任何where条件的情况下,如何最大地提升此查询的速度?请高手指点

分不多了,下次有分单独开贴给,谢谢了!
...全文
264 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
tiangtangcao 2011-09-20
  • 打赏
  • 举报
回复
根据以上的语句,可做以下的查询优化(数据量不是很大):
(1)将view1 和view2建成物化视图,增量刷新
(2)建立索引,通过查询执行计划,确定所建立的索引能用上。

提示:在sql中尽量少用函数,函数在执行计划中无法体现。
北极海hein 2011-09-14
  • 打赏
  • 举报
回复
把以下的每一小段都分別寫成函數,然後再調整函數的方式來取得想要的值.

(SELECT rtrim(LIST(DISTINCT FIELD6 || '/'), '/')
FROM TABLE2
WHERE ID = V2.ID) FIELD6LIST,
(SELECT rtrim(LIST(DISTINCT FIELD7 || '/'), '/')
FROM TABLE3
WHERE ID = V2.ID) FIELD7LIST,
(SELECT T4.STATE
FROM TABLE4 T4
WHERE T4.CNO = V2.CINNO) INSTATE,
(SELECT T4.STATE
FROM TABLE4 T4
WHERE T4.CNO = V2.COUTNO) OUTSTATE,
(SELECT CASE
WHEN COUNT(*) > 0 THEN
'Y'
ELSE
'N'
END
FROM TABLE5 T5
LEFT JOIN TABLE6 PARTITION(PARTCUR) T6
ON T5.MID = T6.MID
LEFT JOIN TABLE7 T7
ON T7.JCODE = T6.JCODE
WHERE T5.ID = V2.ID
AND T6.JCODE = 'C1'
and rownum = 1) ISMID,
(SELECT CASE
WHEN COUNT(*) > 0 THEN
'Y'
ELSE
'N'
END
FROM TABLE5 T5
LEFT JOIN TABLE6 PARTITION(PARTCUR) T6
ON T5.MID = T6.MID
LEFT JOIN TABLE7 T7
ON T7.JCODE = T6.JCODE
WHERE T5.ID = V2.ID
AND T6.JCODE = 'C2'
AND ROWNUM = 1) ISTOP,
(SELECT CASE
WHEN COUNT(V1.VID) > 0 THEN
'Y'
ELSE
'N'
END
FROM VIEW1 V1
WHERE V1.ID = V2.ID
AND V1.TYPE = 'T') ISPREE
BenChiM888 2011-08-26
  • 打赏
  • 举报
回复
两种方法:
1、将view1 和 view2 的数据放入中间临时表,然后建立相关索引进行关联查询。
2、增加/* parallel(table_name,8) */ 这样的多线程操作提示
3、直接修改session目前的session多线程操作,然后再查询。
alter session enable parallel query;
weiranth 2011-08-26
  • 打赏
  • 举报
回复
有执行计划,可以将执行计划贴出来~~
zengjc 2011-08-23
  • 打赏
  • 举报
回复
创建中间过程临时表,将该大SQL拆分成几个小SQL,通过IO来换取CPU,提升性能
tanghuawei 2011-08-16
  • 打赏
  • 举报
回复
我没有完全列出所有的字段,查询的字段大概在50个左右,有些字段建立了索引,但是我每次执行都会超时
Rotel-刘志东 2011-08-16
  • 打赏
  • 举报
回复
这样的数据量不是很大的,主要查询字段建立索引了吗?具体要看执行计划了。
如果表的嵌套太多的话也会影响查询速度的。
hanzs 2011-08-16
  • 打赏
  • 举报
回复
看下执行计划,漏建索引的就补上

数据量不是很大,效率应该还行吧
yjytiantang 2011-08-16
  • 打赏
  • 举报
回复
加索引 建个视图查询试试~~

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧