Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 在Java程序中微调查询时,使用子查询而不是联接会遇到问题 现有查询: 修改的查询:_Sql_Db2 - Fatal编程技术网

Sql 在Java程序中微调查询时,使用子查询而不是联接会遇到问题 现有查询: 修改的查询:

Sql 在Java程序中微调查询时,使用子查询而不是联接会遇到问题 现有查询: 修改的查询:,sql,db2,Sql,Db2,优化查询后,使用精确的结果集,在部署代码后将面临问题。 错误(jspService errorclass java.lang.NullPointerException) 问题是什么?请帮助。我想您的选择…,选择…,有问题。。。。从…起只有当两个子查询返回的结果正好为1或0时,查询才会成功 看看您的初始查询,它看起来非常简单或无辜。不过,您可以优化一些事情 A.C_类?-类似的操作员是危险的。这会影响查询的性能。从程序中输入该查询时,请尝试避免“%”位于字符串开头的构造。 你使用索引吗为I_PLT

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


问题是什么?请帮助。

我想您的选择…,选择…,有问题。。。。从…起只有当两个子查询返回的结果正好为1或0时,查询才会成功

看看您的初始查询,它看起来非常简单或无辜。不过,您可以优化一些事情

A.C_类?-类似的操作员是危险的。这会影响查询的性能。从程序中输入该查询时,请尝试避免“%”位于字符串开头的构造。 你使用索引吗为I_PLT创建一个包含两个值的索引 考虑在表中创建新的列,其中包含了SubjCyTyp、1, 4和SubxOxDeC、81, 1=“W”的值。您将存储冗余数据,但不需要反复计算这些值。您应该为每次插入和更新创建一个触发器,以填充搜索的两列。如果读取的表多于写入的表,这将提高性能。 临时表公共表表达式也可能是一个选项。请参阅下面的查询。免责声明:查询未经过性能和语法正确性测试
看起来您正在尝试使用公共表表达式,但语法不太清楚。根据原始查询的内容,并保持修改后的查询的结构,修改后的查询应该是这样的:

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

幸运的是,这是一个通用表表达式的示例,而不是一个临时表。真正的临时表通常是性能较差的选择,除非它们将在多个语句中使用。抱歉,使用SQL cookbook的名称。然而,你当然是对的,严格来说,这不是一个临时表。一个原因是临时表通常是一个糟糕的选择,而使用CTE的代替。。。在大多数情况下,使用“真实”临时表声明全局临时表对性能有害。如果在不同的后续查询中需要中间结果,例如创建多个报告,那么我只考虑使用这些临时表,因此我不需要多次计算中间数据。然而,我的意思是CTE公共表表达式,在这种情况下可能会有所帮助。我更新了答案以反映正确的术语。您使用的是DB2LUW、I还是z/OS?我基本上是在微调查询以降低成本率和SURATE,这有助于提高性能。但是当我使用执行查询时,成本*比率比前面的增加了。请建议我一个优化的查询。虽然我提到的修改后的查询极大地降低了性能,并且结果集与现有查询相同,但它抛出了一个错误。请对此提出建议。提前谢谢。您的问题没有提到这些字段。您的名字很神秘,我很难确定到底发生了什么,您也没有提到查询的任何要求。您的DB2服务器运行在什么操作系统上,DB2的版本是什么?很抱歉没有提到索引。当前版本是db2v9。我发现问题是由于前两列的结果为空,有人能帮助我如何抑制此空值吗?
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
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
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