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分钟或更少?
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)
归档时间: |
|
查看次数: |
2479 次 |
最近记录: |