需要在SQL Server中加快此查询

Org*_*cat 1 sql t-sql sql-server performance outer-join

SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
    FROM prodtree_element pe
    LEFT JOIN prodtree_link pl
        ON pe.prodtree_element_id = pl.to_prodtree_node_id
    LEFT JOIN line li
        ON pe.line_code = li.line_code
    INNER JOIN attribute_values av
        ON av.attribute_definition_id = #statusCode# 
    LEFT JOIN attribute_values av2
        ON pe.prodtree_element_id = av.prodtree_element_id
    WHERE pe.prodtree_element_func_type <> 'WIZARD'
        AND pe.prodtree_element_topo_type = 'NODE'
Run Code Online (Sandbox Code Playgroud)

"#statusCode#"是一个静态id,它匹配属性定义表中的id(为了参数,我们假设为22).问题是,查询在任何合理的时间内完成都会遇到很大麻烦.更大的问题是,我有点需要它提前完成,但记录的数量是巨大的,它必须退缩(约30-50,000).我需要来自多个表的数据,这是它开始变慢的地方.这只是我需要的一部分,我还需要一个与当前"prodtree_elment_id"相匹配的整个其他表.

我正在使用ColdFusion,但即使在SQL Server 2005中直接运行查询也会为此查询创建15-30分钟的等待时间(如果它甚至完成).是否有任何可以想象的方法来加快此查询最多花费5分钟或更少?

gbn*_*gbn 9

INNER JOIN attribute_values av
    ON av.attribute_definition_id = #statusCode# 
LEFT JOIN attribute_values av2
    ON pe.prodtree_element_id = av.prodtree_element_id
Run Code Online (Sandbox Code Playgroud)

这就是问题.pe和av之间存在交叉连接,然后是交叉连接上的外连接.你很幸运它只需要30分钟:-)

我想你想要这个:

SELECT pe.prodtree_element_id prodID, pe.prodtree_element_name_s, li.line_name, av2.value
FROM prodtree_element pe
LEFT JOIN prodtree_link pl
    ON pe.prodtree_element_id = pl.to_prodtree_node_id
LEFT JOIN line li
    ON pe.line_code = li.line_code
--replacement
LEFT JOIN
attribute_values av 
         ON pe.prodtree_element_id = av.prodtree_element_id AND
         av.attribute_definition_id = #statusCode# 
--end replacement
WHERE pe.prodtree_element_func_type <> 'WIZARD'
    AND pe.prodtree_element_topo_type = 'NODE'
Run Code Online (Sandbox Code Playgroud)