首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > oracle >

海量数据查询速度优化,该如何解决

2012-02-10 
海量数据查询速度优化SQL codeSELECT *FROM (SELECT CASEWHEN V2.FIELD1 0 THENBELSEREND VFIELD1,C

海量数据查询速度优化

SQL code
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条件的情况下,如何最大地提升此查询的速度?请高手指点

分不多了,下次有分单独开贴给,谢谢了!

[解决办法]
这样的数据量不是很大的,主要查询字段建立索引了吗?具体要看执行计划了。
如果表的嵌套太多的话也会影响查询速度的。
[解决办法]
加索引 建个视图查询试试~~
[解决办法]
看下执行计划,漏建索引的就补上 

数据量不是很大,效率应该还行吧
[解决办法]
创建中间过程临时表,将该大SQL拆分成几个小SQL,通过IO来换取CPU,提升性能
[解决办法]
两种方法:
1、将view1 和 view2 的数据放入中间临时表,然后建立相关索引进行关联查询。
2、增加/* parallel(table_name,8) */ 这样的多线程操作提示
3、直接修改session目前的session多线程操作,然后再查询。
alter session enable parallel query;

[解决办法]
把以下的每一小段都分別寫成函數,然後再調整函數的方式來取得想要的值.

(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

热点排行