sql 优化 -- sql中的自定函数

Long run sql:

              MERGE INTO INTITMRTNPARAM D
              USING (
                           SELECT A.INRFILENM,A.INRSTAT,A.INRDEPCD,A.INRITMCD,A.INRSUBCD,A.INRSUPCD,A.INRSTOCD
                           FROM INTITMRTNPARAM A,INTITMRTNPARAM B
                           WHERE 1=1
                             AND A.ROWID <> B.ROWID
                             AND A.INRFILENM = B.INRFILENM
                             AND A.INRSTAT   = 0
                             AND B.INRSTAT   = 0
                             AND A.INRFILENM = p_filenm
                             AND B.INRFILENM = p_filenm
                             AND A.INRDEPCD  = B.INRDEPCD
                             AND A.INRITMCD  = B.INRITMCD
                             AND PKCRS.CHECKINCLUDECUSTTYPE(NVL(A.INRSUBCD,'ALL'),NVL(B.INRSUBCD,'ALL')) = 1
                             AND PKCRS.CHECKINCLUDECUSTTYPE(NVL(A.INRSUPCD,'ALL'),NVL(B.INRSUPCD,'ALL')) = 1
                             AND PKCRS.CHECKINCLUDECUSTTYPE(NVL(A.INRSTOCD,'ALL'),NVL(B.INRSTOCD,'ALL')) = 1
                           GROUP BY A.INRFILENM,A.INRSTAT,A.INRDEPCD,A.INRITMCD,A.INRSUBCD,A.INRSUPCD,A.INRSTOCD
                    ) E
              ON  ( D.INRFILENM     = E.INRFILENM
                    AND D.INRSTAT   = E.INRSTAT
                    AND D.INRDEPCD  = E.INRDEPCD
                    AND D.INRITMCD  = E.INRITMCD
                    AND DECODE(TRIM(NVL(D.INRSUBCD,'')),'','NULL',TRIM(D.INRSUBCD)) = DECODE(TRIM(NVL(E.INRSUBCD,'')),'','NULL',TRIM(E.INRSUBCD))
                    AND DECODE(TRIM(NVL(D.INRSUPCD,'')),'','NULL',TRIM(D.INRSUPCD)) = DECODE(TRIM(NVL(E.INRSUPCD,'')),'','NULL',TRIM(E.INRSUPCD))
                    AND DECODE(TRIM(NVL(D.INRSTOCD,'')),'','NULL',TRIM(D.INRSTOCD)) = DECODE(TRIM(NVL(E.INRSTOCD,'')),'','NULL',TRIM(E.INRSTOCD)) )
              WHEN MATCHED THEN
              UPDATE SET  D.INRERRNO  = 2,
                          D.INRERRMES = D.INRERRMES || ', Dupplicate item',
                          D.INRUPD    = p_date,
                          D.INRUSR    = p_user;

Long sql 中调用的function(checkIncludeCustType):

   FUNCTION checkIncludeCustType(p_custType1 PRITSPHDR.TSPHCUSTYPE%TYPE,p_custType2 PRITSPHDR.TSPHCUSTYPE%TYPE) RETURN NUMBER IS
        v_check NUMBER(1);
    BEGIN
        IF p_custType2 IS NULL OR p_custType1 IS NULL THEN
            RETURN 1;
        END IF;
        BEGIN
            SELECT 1
            INTO   v_check
            FROM (SELECT LEVEL,
                         SUBSTR (
                         STRING_TO_TOKENIZE,
                         DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1),
                         INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) - DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)
                         ) AS Token
                    FROM ( SELECT p_custType1||',' AS STRING_TO_TOKENIZE, ',' AS DELIMITER FROM DUAL)
                 CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0
                   ORDER BY LEVEL ASC
                 ) custtype1,
                 (SELECT LEVEL,
                         SUBSTR ( STRING_TO_TOKENIZE,
                                  DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1),
                                  INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) - DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL-1)+1)
                                ) AS Token
                   FROM ( SELECT p_custType2||',' AS STRING_TO_TOKENIZE, ',' AS DELIMITER FROM DUAL)
                CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL)>0
                  ORDER BY LEVEL ASC
                 ) custtype2
           WHERE custtype1.token = custtype2.token
             AND rownum = 1;
        EXCEPTION WHEN NO_DATA_FOUND THEN
          v_check := 0;
        END;
        RETURN v_check;
    END checkIncludeCustType;

优化后:

          UPDATE INTITMRTNCON D
             SET D.INRERRNO = 2, D.INRERRMES = D.INRERRMES || ', Dupplicate item'  , D.INRUPD    = p_date, D.INRUSR    = p_user
           WHERE INRFILENM = p_filenm AND  INRSTAT   = 0
            AND (INRFILENM, INRSTAT, INRDPCD, INRITMCD, NVL(INRSUBCD, 'ALL'),
                  NVL(INRSUPCD, 'ALL')) IN
                 (SELECT INRFILENM, INRSTAT, INRDPCD, INRITMCD, NVL(INRSUBCD, 'ALL'), NVL(INRSUPCD, 'ALL')
                    FROM (SELECT T.INRFILENM, T.INRSTAT, T.INRDPCD, T.INRITMCD, T.INRSUBCD, T.INRSUPCD
                            FROM INTITMRTNCON T
                           WHERE INSTR(nvl(trim(INRSUBCD), 'ALL'), ',') = 0
                             and INSTR(nvl(trim(INRSUPCD), 'ALL'), ',') = 0
                             AND INRFILENM = p_filenm AND  INRSTAT   = 0
                          UNION ALL
                          select a.INRFILENM, a.INRSTAT, a.INRDPCD, a.INRITMCD, a.INRSUBCD, b.INRSUPCD
                            from (SELECT SUBSTR(STRING_TO_TOKENIZE,
                                                DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER,
                                                             1, LEVEL - 1) + 1),
                                                INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) -
                                                DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER,
                                                             1, LEVEL - 1) + 1))
					                     AS INRSUBCD,
                                         V_ROWID, INRFILENM, INRSTAT, INRDPCD, INRITMCD
                                    FROM (SELECT T.INRSUBCD || ',' AS STRING_TO_TOKENIZE,
                                                 ',' AS DELIMITER, T.ROWID V_ROWID,  INRFILENM,
                                                 INRSTAT, INRDPCD, INRITMCD
                                            FROM INTITMRTNCON T
                                           WHERE INRFILENM = p_filenm AND  INRSTAT   = 0 AND (INSTR(INRSUBCD, ',') >= 1
                                              or INSTR(INRSUPCD, ',') >= 1))
                                  CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) > 0) a,
                                 (SELECT SUBSTR(STRING_TO_TOKENIZE,
                                                DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1,  LEVEL - 1) + 1),
                                                INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) -
                                                DECODE(LEVEL, 1, 1, INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL - 1) + 1)) AS INRSUPCD,
                                         V_ROWID, INRFILENM, INRSTAT, INRDPCD, INRITMCD
                                    FROM (SELECT T.INRSUPCD || ',' AS STRING_TO_TOKENIZE, ',' AS DELIMITER,
                                                 T.ROWID V_ROWID, INRFILENM, INRSTAT, INRDPCD, INRITMCD
                                            FROM INTITMRTNCON T
                                           WHERE INRFILENM = p_filenm AND  INRSTAT   = 0 AND (INSTR(INRSUBCD, ',') >= 1
                                              or INSTR(INRSUPCD, ',') >= 1 ))
                                  CONNECT BY INSTR(STRING_TO_TOKENIZE, DELIMITER, 1, LEVEL) > 0) b
                           where a.v_rowid = b.v_rowid)
                   GROUP BY INRFILENM, INRSTAT, INRDPCD, INRITMCD, INRSUBCD, INRSUPCD
                  HAVING COUNT(*) > 1);
时间: 2024-12-24 14:06:13

sql 优化 -- sql中的自定函数的相关文章

[转]Oracle DB 通过SQL 优化管理性能

? 将SQL 优化指导用于: – 确定使用资源最多的 SQL 语句 – 优化使用资源最多的 SQL 语句 ? 使用SQL 访问指导优化工作量 SQL 优化 SQL 优化进程 ? 确定没有很好地优化的SQL 语句. ? 优化各条语句. ? 优化整个应用程序. 一般情况下,效果最明显的优化工作是SQL 优化.没有很好地优化的SQL 会不必要地使用过多资源.这种低效率会降低可伸缩性.使用更多的OS 和数据库资源并增加响应时间.要对没有很好地优化的SQL 语句进行优化,必须先确定这些语句,然后再进行优化

ORACLE常用SQL优化hint语句

在SQL语句优化过程中,我们经常会用到hint,现总结一下在SQL优化过程中常见Oracle HINT的用法: 1. /*+ALL_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳吞吐量,使资源消耗最小化. 例如: SELECT /*+ALL+_ROWS*/ EMP_NO,EMP_NAM,DAT_IN FROM BSEMPMS WHERE EMP_NO=’SCOTT’; 2. /*+FIRST_ROWS*/ 表明对语句块选择基于开销的优化方法,并获得最佳响应时间,使资源消耗最小化.

[SQL优化工具]Quest.Central.For.Databases——SQL Tuning for SQL Server

随着企业数据库的急剧膨胀和日益复杂,DBA为保证数据库性能所付出的努力与日俱增,手工或使用多种无法集成的管理工具,都会给日常管理和维护带来不必要的困难. Quest Central for Databases 是一种集成化.图形化.跨平台的数据库管理解决方案,可以管理异构环境下的 Oracle.DB2 和 SQL server 数据库.Quest Central for Databases 消除了企业IT人员管理多种数据库时面临的技术障碍,提高了IT人员工作效率,改善了数据库性能和数据库应用的可

MySQL中的函数索引(Generated Column)及一次SQL优化

MySQL 中是没有 Oracle 的函数索引功能的,把 MySQL 的 Generated Column 称为"函数索引"并不准确,但可以和函数索引达到同样的效果,也有人把这个特性称为"衍生列". Generated Column 是什么 Generated Column 的值是根据其定义的表达式所计算而来的,下面使用官方文档中的例子做个简单介绍. 有一张表存储直角三角形的三条边长,大家都知道,根据直角三角形的边长公式,斜边的长度可以通过另外两条边长计算得到,这样

浅谈MySQL中优化sql语句查询常用的30种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from

MySQL中优化sql语句查询常用的30种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from

MySQL中优化sql语句查询常用的种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from

浅谈 MySQL 中优化 SQL 语句查询常用的 30 种方法

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放弃使用索引而进行全表扫描. 3.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from

在sql查询中为了提高查询效率,我们常常会采取一些措施对查询语句进行sql优化,下面总结的一些方法,有需要的可以参考参考。

1.对查询进行优化,应尽量避免全表扫描,首先应考虑在 where 及 order by 涉及的列上建立索引. 2.应尽量避免在 where 子句中对字段进行 null 值判断,否则将导致引擎放弃使用索引而进行全表扫描,如: select id from t where num is null 可以在num上设置默认值0,确保表中num列没有null值,然后这样查询: select id from t where num=0 3.应尽量避免在 where 子句中使用!=或<>操作符,否则将引擎放