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]
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]
相关文章推荐
- 非常好用的sql语句(日常整理)
- SQL语句优化技术分析 整理他人的
- 非常好用的sql语句(日常整理)
- 整理---优化数据库的思想及SQL语句优化的原则
- 整理:sql语句优化之SQL Server
- PLSQL_性能优化工具系列01_PXHCDR.SQL: Parallel Execution Health-Checks and Diagnostics(待整理)
- sql语句优化之SQL Server(详细整理)
- 整理:sql语句优化之SQL Server
- Mysql日常sql语句整理(二)
- 整理---优化数据库的思想及SQL语句优化的原则
- 一条sql语句的优化 (问题整理篇)
- 整理:sql语句优化之SQL Server
- Oracle sql语句日常整理
- Mysql日常sql语句整理(一)
- sql语句优化之SQL Server(详细整理)
- 数据库性能调优——sql语句优化(转载及整理)
- 数据库性能调优——sql语句优化(转载及整理)
- sql语句优化
- [转]SQL语句优化技术分析
- 特殊SQL语句及优化原则