我有以下SQL语句,其性能非常糟糕:
SELECT
frmInstLastModifiedDate AS last_modified
, frmInstID AS proj_id
, frmInstIsApproved
, frmInstStatus AS proj_sts
, (CASE
WHEN frmInstCreator = 294 THEN 'M'
WHEN status = 'f' THEN 'F'
WHEN (frmInstID IN (SELECT shr.frmInstID from tbl_frm_share as shr WHERE shr.shrMember = 294 AND shr.shrType = 'LIKE' AND shr.frmID = inst.frmID)) THEN 'L'
WHEN (frmInstID IN (SELECT shr.frmInstID from tbl_frm_share as shr WHERE shr.shrMember = 294 AND shr.shrType = 'SHARE' AND shr.frmID = inst.frmID)) THEN 'S'
ELSE 'O' END) as proj_grp
, (SELECT lkpCode FROM tbl_frm_lookup WHERE lkpID = (SELECT ansValue FROM tbl_itm_answer WHERE frmInstID = proj_id AND itmID = (select itmID from tbl_frm_item where itmName = 'prjStatus' AND frmID = inst.frmID))) as prjStatus
, (SELECT lkpCode FROM tbl_frm_lookup WHERE lkpID = (SELECT ansValue FROM tbl_itm_answer WHERE frmInstID = proj_id AND itmID = (select itmID from tbl_frm_item where itmName = 'ProjectType' AND frmID = inst.frmID))) as ProjectType
, (SELECT itmID FROM tbl_itm_answer where itmID in (828,829,830,831) and frmInstID = proj_id AND SUBSTRING(ansValue,1,2) = 'on') as primIRWMObj
, (SELECT lkpCode FROM tbl_frm_lookup WHERE lkpID = (SELECT ansValue FROM tbl_itm_answer WHERE frmInstID = proj_id AND itmID = (select itmID from tbl_frm_item where itmName = 'PrjPSubReg'))) as ProjectSubReg
, frmInstCreator AS proj_creatorID
, frmInstCode AS proj_code
FROM tbl_frm_instance inst
WHERE status not like 'd'
HAVING (proj_sts like 'c' AND ('PROJECT PROPONENT' = 'ADMIN' or proj_creatorID = 294 ))
or (proj_sts like 'a')
or (proj_sts like 't' AND proj_creatorID = 294)
OR (proj_grp = 'S')
ORDER BY frmInstCreateDate DESC ;
该语句是根据用户选择的选项动态创建的。我知道嵌套的select语句(如下所示)是问题,但我不知道如何替换它
(SELECT lkpCode FROM tbl_frm_lookup WHERE lkpID = (SELECT ansValue FROM tbl_itm_answer WHERE frmInstID = proj_id AND itmID = (select itmID from tbl_frm_item where itmName = 'prjStatus' AND frmID = inst.frmID))) as prjStatus
任何帮助都会非常感激。
答案 0 :(得分:4)
不要使用nested selects
,写入最慢和数据库脏。最好的方法是使用JOIN
,尽可能使用JOIN
。
如果你想创造性能良好的IS
(这是你的工作,你的名字),那么你必须决定最有效,禁食,最安全的方法,它是JOIN
。
我建议你到处使用JOIN
。
我建议你阅读Understanding the Query Execution Plan。
注意:有时你必须认为“喜欢数据库”不是“喜欢程序”。
答案 1 :(得分:2)
试试这个::
我至少可以做到::
SELECT
frmInstLastModifiedDate AS last_modified
, frmInstID AS proj_id
, frmInstIsApproved
, frmInstStatus AS proj_sts
, (CASE
WHEN frmInstCreator = 294 THEN 'M'
WHEN status = 'f' THEN 'F'
WHEN (frmInstID IN (SELECT shr.frmInstID from tbl_frm_share as shr WHERE shr.shrMember = 294 AND shr.shrType = 'LIKE' AND shr.frmID = inst.frmID)) THEN 'L'
WHEN (frmInstID IN (SELECT shr.frmInstID from tbl_frm_share as shr WHERE shr.shrMember = 294 AND shr.shrType = 'SHARE' AND shr.frmID = inst.frmID)) THEN 'S'
ELSE 'O' END) as proj_grp
,
(SELECT lkpCode
FROM tbl_frm_lookup tfl
inner join tbl_itm_answer tia on (tfl.lkpID= tia.ansValue)
inner join tbl_frm_item tfi on (tia.itmID= tfi.itmID)
WHERE frmInstID = proj_id and itmName = 'prjStatus' AND frmID = inst.frmID) as prjStatus
, frmInstCreator AS proj_creatorID
, frmInstCode AS proj_code