您的位置:首页 > 数据库

plsql日常整理和sql语句优化

2007-12-04 10:54 656 查看
IF ((tab='AA')) THEN
v_exec_sql :=' create index TEST_IDX1 on aa(ed asc)';
execute immediate v_exec_sql;
ELSIF ((tab= 'AA')and v_dd=20) then
v_exec_sql :=' create index TEST_IDX1200708 on aa_20070820 (ed asc)';
execute immediate v_exec_sql;
end if;

这样在plsql中写不行 ,因为第一个条件满足后,就执行,但是不再看第二个条件怎么样了。

只能这样写
IF ((tab= 'AA')and v_dd=20) then
v_exec_sql :=' create index TEST_IDX1200708 on aa_20070820 (ed asc)';
execute immediate v_exec_sql;

else
v_exec_sql :=' create index TEST_IDX1 on aa(ed asc)';
execute immediate v_exec_sql;
end if;

2
嵌套查询:
[align=left]SELECT C.AREA_ID,C.AREA_NAME,C.TOTAL,C.COUNTS [/align]
[align=left] FROM[/align]
[align=left](SELECT BBB.AREA_ID,BBB.AREA_NAME,BBB.TOTAL,AAA.COUNTS[/align]
[align=left] FROM( SELECT AREA_ID,COUNT(CARD_ID) AS COUNTS FROM ZHCX_VIP_CARD WHERE CREATE_DATE>=TO_DATE('2007-08-21 00:00:00','YYYY-MM-DD hh24:mi:ss') AND CREATE_DATE<=TO_DATE('2007-08-21 23:59:59','YYYY-MM-DD hh24:mi:ss') AND BZ='0' GROUP BY AREA_ID ) AAA  [/align]
[align=left]FULL JOIN (SELECT * FROM ZHCX_VIP_CARD_AREA WHERE BZDATE>='2007') BBB ON AAA.AREA_ID=BBB.AREA_ID ORDER BY AAA.AREA_ID) [/align]
[align=left]C ORDER BY C.AREA_ID[/align]

3.查询很慢的语句:

select c.OBJECT_ID, c.NAME,A.NUM_TYPE,A.COMM_TYPE,
count(*) AS NUM
from JT_ZERO_0707 A,ZHCX_JT_NUMBER_AREA_NEW B ,ML_AREA
C where B.NUM=A.ACC_NBR AND B.ATTRIB_FLAG='3'
AND B.OBJECT_ID='05000006'

AND B.OBJECT_ID=C.OBJECT_ID GROUP BY c.OBJECT_ID, ---ACC_NBR, NUM_TYPE, COMM_TYPE
c.NAME,A.NUM_TYPE,A.COMM_TYPE,C.ORDER_ID ORDER BY --IDX_JT_ZERO_0707
C.ORDER_ID

如下是sql语句优化

[align=left]SELECT ROWNUM,ACCT_ID,ACC_NBR,USER_NAME,ADDRESS,TOTAL_FEE,GROUTH_FEE FROM (SELECT A.ACCT_ID,A.ACC_NBR,C.USER_NAME,C.ADDRESS,A.TOTAL_FEE/100 AS TOTAL_FEE,A.GROUTH_FEE/100 AS GROUTH_FEE FROM JT_ACCT_ITEM_TELEPHONE_0707 A, ZHCX_JT_NUMBER_AREA_ZK C WHERE A.ACC_NBR=C.NUM AND C. ZS_ID='40017' AND C. ATTRIB_FLAG='1' ORDER BY A.TOTAL_FEE ASC ) WHERE ROWNUM <= 10[/align]

优化的语句
下面的还用到了左连接
SELECT/*+ index(A idx_sale_attrib_commun)*/
B.SALES_NAME AS SALE_ID,
(SELECT C.EMPL_NAME FROM DICT_EMPLOYEE C WHERE C.EMPL_ID = B.SALES_NAME) AS SALE_NAME,
A.NUM_TYPE,
A.COMM_TYPE,
COUNT(*) AS NUM
FROM JT_ZERO_0707 A,ZHCX_SALES_MSG B ---- SALE_ID, ATTRIB_FLAG, COMMUN_ID
WHERE A.SALE_ID = B.ID
AND A.ATTRIB_FLAG = 3
AND B.COMMUN_ID = 10225
GROUP BY B.SALES_NAME, A.NUM_TYPE, A.COMM_TYPE

2
SELECT/*+ LEADING(C)*/
C.AREA_ID_97, C.NAME, A.NUM_TYPE, A.COMM_TYPE, COUNT(*) AS NUM
FROM ML_AREA C, JT_ZERO_0707 A
WHERE A.AREA_ID = C.AREA_ID_97
AND A.ATTRIB_FLAG = 3
AND A.AREA_ID = '05000002'
GROUP BY C.AREA_ID_97, C.NAME, A.NUM_TYPE, A.COMM_TYPE, C.ORDER_ID
ORDER BY C.ORDER_ID

3 用到左连接
SELECT A.ACC_NBR,
(SELECT ACCOUNT_ID
FROM ZHCX_JT_NUMBER_AREA_NEW C
WHERE A.ACC_NBR = C.NUM) ACCOUNT_ID,
(SELECT USER_NAME
FROM ZHCX_JT_NUMBER_AREA_NEW C
WHERE A.ACC_NBR = C.NUM) USER_NAME,
(SELECT ADDRESS
FROM ZHCX_JT_NUMBER_AREA_NEW C
WHERE A.ACC_NBR = C.NUM) ADDRESS,
A.NUM_TYPE,
A.COMM_TYPE
FROM JT_ZERO_0707 A
WHERE A.ATTRIB_FLAG = 3
AND A.SALE_ID =
(SELECT ID FROM ZHCX_SALES_MSG WHERE SALES_NAME = '10388')

[align=left]SELECT ACC_NBR,TOTAL_FEE, ACC_ID,USER_NAME,ADDRESS,GROUTH_FEE,GROUTH_FEE_PREYEAR FROM ( SELECT distinct A.ACC_NBR,A.TOTAL_FEE/100 TOTAL_FEE, B.ACC_ID,B.USER_NAME,B.ADDRESS,A.GROUTH_FEE,A.GROUTH_FEE_PREYEAR FROM JT_ACCT_ITEM_TELEPHONE_0707 A,ZHCX_JT_NUMBER_AREA_NEW B WHERE A.MATKETER_ID=15000 AND A.STATE='100' AND A.ACC_NBR=B.NUM ORDER BY A.TOTAL_FEE/100 ASC) WHERE ROWNUM<=10[/align]
[align=left] [/align]
[align=left]SELECT ACC_NBR, ACC_ID,USER_NAME,ADDRESS,TOTAL_FEE,GROUTH_FEE,GROUTH_FEE_PREYEAR FROM (SELECT distinct A.ACC_NBR,B.ACC_ID,B.USER_NAME,B.ADDRESS, A.TOTAL_FEE/100 TOTAL_FEE,A.GROUTH_FEE/100 GROUTH_FEE,A.GROUTH_FEE_PREYEAR/100 GROUTH_FEE_PREYEAR FROM JT_ACCT_ITEM_TELEPHONE_0707 A,ZHCX_JT_NUMBER_AREA_NEW B WHERE A.MATKETER_ID=15000 AND A.STATE='100' AND A.ACC_NBR=B.NUM ORDER BY A.TOTAL_FEE/100 desc ) WHERE ROWNUM<=10[/align]
[align=left] [/align]
[align=left]关于索引问题。[/align]
[align=left] 建索引用到parallel 3 nologging可以节省时间。[/align]
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: