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