在Java程序中微调查询时,使用SubQuery而不是Join来面对一个问题

时间:2013-11-11 14:51:08

标签: sql db2

现有的查询:

SELECT   
 SUBSTR(B.C_TYP, 1, 4)                        
,SUBSTR(B.X_DESC, 1, 25)                      
,SUBSTR(A.C_TYP, 5, 4)                        
,SUBSTR(A.X_DESC, 1, 25)                      
,SUBSTR(A.X_DESC, 82, 11) FROM     M.MASCTAB A, M.MASCTAB B WHERE    
       A.I_PLT = ?
AND    A.N_TBL = ?                                
AND    A.C_TYP LIKE ?                          
AND    A.I_PLT = B.I_PLT                            
AND    SUBSTR(A.C_TYP, 1, 4) = SUBSTR(B.C_TYP, 1, 4)
AND    SUBSTR(A.X_DESC, 81, 1) = 'W'                
AND    B.N_TBL = 'DEPTC'                            
ORDER    BY A.C_TYP

MODIFIED QUERY:

SELECT 

(SELECT SUBSTR(C_TYP, 1, 4)
FROM M.MASCTAB
WHERE I_PLT = A.I_PLT
AND N_TBL = 'DEPTC'
AND LEFT(C_TYP, 4) = LEFT(A.C_TYP, 4) 
)
,(SELECT SUBSTR(X_DESC, 1, 25) 
FROM M.MASCTAB 
WHERE I_PLT = A.I_PLT 
AND N_TBL = 'DEPTC' 
AND LEFT(C_TYP, 4) = LEFT(A.C_TYP, 4) 
),SUBSTR(A.C_TYP, 5, 4) 
,SUBSTR(A.X_DESC,1, 25) 
,SUBSTR(A.X_DESC, 82, 11) 
FROM M.MASCTAB A
WHERE A.I_PLT = ? 
AND A.N_TBL = ? 
AND A.C_TYP LIKE ? 
AND SUBSTR(A.X_DESC, 81, 1) = 'W' 
ORDER BY A.C_TYP 
WITH UR

优化查询后,使用精确的结果集,在部署代码后面临问题。 错误_jspService错误类java.lang.NullPointerException

会有什么问题?请帮忙。

2 个答案:

答案 0 :(得分:0)

我认为您的select (select ...), (select ...), .... From ....)存在问题。只要您的两个子查询返回1或0个结果,查询就会成功。

查看您的初始查询,它看起来非常简单或无辜。但是,您可以优化一些内容。

  1. A.C_TYP LIKE ? - 类似的操作符很危险。这可以提高查询的性能。从您的程序提供该查询尝试避免'%'位于字符串开头的构造。
  2. 你使用索引吗? - 为I_PLT创建一个,N_TBL(一个包含两个值的索引)
  3. 考虑在表中创建新列,其中包含SUBSTR(C_TYP,1,4)和SUBSTR(X_DESC,81,1)='W'的值。您将存储冗余数据,但不需要反复计算值。您应该为每个插入创建一个触发器,并更新以填充搜索的两列。如果您阅读的内容多于编写表格,则会提高性能。
  4. 临时表公用表表达式也可以是一个选项。看下面的查询。 (免责声明:查询未针对性能和语法的正确性进行测试)

  5. with temp_table as 
       (select C_TYP, X_DESC, I_PLT, N_TBL, SUBSTR(C_TYP, 1, 4) as join_key
          from M.MASCTAB) 
    select B.join_key,
           SUBSTR(B.X_DESC, 1, 25),
           SUBSTR(A.C_TYP, 5, 4),
           SUBSTR(A.X_DESC, 1, 25),
           SUBSTR(A.X_DESC, 82, 11) 
    FROM temp_table A inner join temp_table B on A.join_key=B.join_key
    WHERE  A.I_PLT = ?
    AND    A.N_TBL = ?                                
    AND    A.C_TYP LIKE ?                          
    AND    A.I_PLT = B.I_PLT                            
    AND    SUBSTR(A.X_DESC, 81, 1) = 'W'                
    AND    B.N_TBL = 'DEPTC'                            
    ORDER    BY A.C_TYP
    

答案 1 :(得分:0)

您似乎正在尝试使用公用表表达式,但是语法不完整。根据您的原始查询所说的内容,并保留修改后的查询的结构,看起来您的修改后的查询应该是这样的:

with A as
( SELECT I_PLT
        ,N_TBL
        ,SUBSTR(C_TYP, 1, 4) MAIN_TYPE
        ,SUBSTR(C_TYP, 5, 4) SUB_TYPE
        ,SUBSTR(X_DESC, 1, 25) X_DESC_PT1
        ,SUBSTR(X_DESC,82, 11) X_DESC_PT2
    FROM M.MASCTAB 
    WHERE I_PLT = ? 
      AND N_TBL = ? 
      AND C_TYP LIKE ? 
      AND SUBSTR(A.X_DESC, 81, 1) = 'W' 
), B as 
( SELECT I_PLT
        ,SUBSTR(C_TYP, 1, 4)     MAIN_TYPE
        ,SUBSTR(X_DESC, 1, 25)   DESC_PT1
FROM M.MASCTAB
WHERE N_TBL = 'DEPTC'
) 
SELECT B.MAIN_TYPE
      ,B.DESC_1
      ,A.SUB_TYPE
      ,A.DESC_1
      ,A.DESC_2
  FROM A
  JOIN B
          ON A.I_PLT   = B.I_PLT                            
     AND A.MAIN_TYPE = B.MAIN_TYPE 
  ORDER BY MAIN_TYPE,SUB_TYPE 
WITH UR