我有一个名为SLA_BUSINESS_FACING_SLA的表,其中每个唯一行包含某些属性的ID。它们被称为ASV_ID,Process_ID,SLA_Comp_ID和SLA_Type_ID(列)。我有4个其他表,我需要使用SLA_BUSINESS表中的ID来提取名称。我有两个包含ASV_ID和Process_ID的变量,需要在SLA_BUSINESS中查找ASV_ID和Process_ID匹配的所有行。然后,一旦找到所有匹配的行,请使用ID,并使用其他4个表获取actaul名称。我没有SQL经验,找到一个好的解决方案让我感到困惑。我确实有代码正在运行,但我确信它效率不高:
(SELECT (SELECT component_class FROM SLA_COMP_CLASS WHERE
BUSINESS_FACING_SLA.SLA_Comp_ID = SLA_COMP_CLASS.SLA_Comp_ID) AS Component_Class,
(SELECT CommonName FROM vkd593_COAF_ASVs WHERE
BUSINESS_FACING_SLA.ASV_ID = ASVs.Name) AS ASV,
(SELECT process_name FROM PROCESSES WHERE
BUSINESS_FACING_SLA.PROCESS_ID = PROCESSES.decomp_num) AS Process,
(SELECT component_type FROM SLA_COMP_TYPE WHERE
BUSINESS_FACING_SLA.SLA_Type_ID = SLA_COMP_TYPE.SLA_Type_ID) AS Component_Type
FROM BUSINESS_FACING_SLA
WHERE ASV_ID = 'Blah' AND PROCESS_ID = 'Blah')
任何提供更快,最有效查询的方法?感谢
答案 0 :(得分:2)
您的查询通常与执行left outer join
一样快(替代方法和更传统的方法。
关键是确保索引中的所有列都被索引(where
子句中的列是主键,然后自动发生)。实际上,最好的索引会提到两个列:
SLA_COMP_CLASS(SLA_Comp_ID, component_class)
vkd593_COAF_ASVs(Name, CommonName)
PROCESSES(decomp_num, process_name)
SLA_COMP_TYPE(SLA_Type_ID, component_type)
这些被称为“覆盖索引”,因为查询所需的所有列都在索引中,因此引擎不必在数据页中查找列。
您的外部查询也可以从索引中受益:
BUSINESS_FACING_SLA(ASV_ID, blah_id)
答案 1 :(得分:1)
您正在寻找的是JOIN
关键字 - 使用LEFT(或INNER)JOIN可能会提高您的效果,并且无疑会简化您的查询。
SELECT
SAL_COMP_CLASS.Component_Class,
vkd593_COAF_ASVs.CommonName AS ASV,
PROCESSES.Process_Name AS Process,
SLA_COMP_TYPE.Component_Type
FROM
BUSINESS_FACING_SLA
LEFT JOIN
SLA_COMP_CLASS ON BUSINESS_FACING_SLA.SLA_Comp_ID = SLA_COMP_CLASS.SLA_Comp_ID
LEFT JOIN
vkd593_COAF_ASVs ON BUSINESS_FACING_SLA.ASV_ID = ASVs.Name
LEFT JOIN
PROCESSES ON BUSINESS_FACING_SLA.PROCESS_ID = PROCESSES.decomp_num
LEFT JOIN
SLA_COMP_TYPE ON BUSINESS_FACING_SLA.SLA_Type_ID = SLA_COMP_TYPE.SLA_Type_ID
WHERE ASV_ID = 'Blah' AND PROCESS_ID = 'Blah'