我有一个名为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')有什么方法可以实现更快、最有效的查询?谢谢
发布于 2014-07-22 13:44:58
您的查询通常与执行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)发布于 2014-07-22 13:50:06
您要寻找的是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'https://stackoverflow.com/questions/24888998
复制相似问题