2016-03-01 114 views
0

我需要在存储过程中改进此查询,具有大量数据的性能会破坏应用程序。有什么办法可以让它更快吗?改进存储过程中的查询

我需要从几个表收集某些列在我的应用程序的网络建立一个仪表盘,其他列我收集了其他查询,并通过加入班在我的控制器。

编辑:这个查询是动态事务的一部分,他们可以更改数据库。

SELECT 
    a.fact_num as cotizacion, a.comentario, m.co_cli, k.cli_des, 
    m.co_ven, l.ven_des, m.fec_emis, m.fec_venc, m.campo8, 
    a.reng_num, a.co_art, g.art_des, a.co_alma, b.fact_num as pedido, 
    c.fact_num as factura, d.fact_num as despacho, e.cob_num as cobro, 
    f.fec_venc as fecha_venc, f.fec_emis as fecha_pedido, 
    h.odp_num as ord_produccion, h.co_ced as cedula, i.req_num as requisicion, 
    j.ent_num as cierre 
FROM 
    reng_cac a 
LEFT JOIN 
    cotiz_c m ON a.fact_num = m.fact_num 
LEFT JOIN 
    reng_ped b ON a.co_art = b.co_art AND a.fact_num = b.num_doc AND b.tipo_doc = 'T' 
LEFT JOIN 
    pedidos f ON b.fact_num = f.fact_num 
LEFT JOIN 
    reng_fac c ON b.fact_num = c.num_doc AND a.co_art = c.co_art AND c.tipo_doc = 'P' 
LEFT JOIN 
    reng_ndd d ON c.fact_num = d.num_doc AND a.co_art = d.co_art AND d.tipo_doc = 'F' 
LEFT JOIN 
    reng_cob e ON c.fact_num = e.doc_num AND e.tp_doc_cob = 'FACT' 
LEFT JOIN 
    art g ON a.co_art = g.co_art 
LEFT JOIN 
    spodp h ON b.fact_num = h.doc_ori AND b.co_art = h.co_art 
LEFT JOIN 
    spreqalm i ON h.odp_num = i.odp_num 
LEFT JOIN 
    spcierre j ON h.odp_num = j.odp_num 
LEFT JOIN 
    clientes k ON m.co_cli = k.co_cli 
LEFT JOIN 
    vendedor l ON m.co_ven = l.co_ven 
WHERE 
    a.fact_num BETWEEN '0' AND '999999999' 
    AND m.fec_emis BETWEEN '01/01/2012' AND '30/06/2012' 
    AND m.co_cli BETWEEN '' AND 'þþþþþþþþþþþþþþþþþþþþþþþþþþþþþþ' 
ORDER BY 
    a.fact_num, a.reng_num ASC 
+2

如果你想提高性能,第一步是收集实际/估计的计划:https://msdn.microsoft.com/en-us/library/ms189562.aspx –

+0

你有没有想过使用聚合函数,如总和,最大...与group by子句?如果它适合你的情况。 – Boody

+0

你确定你所有的连接都是'LEFT'和'fact_num'是一个字符串吗? –

回答

0

正如Nick所评论的,您总是需要在执行计划中运行您的查询。有几点你需要考虑。例如,有很多LEFT JOIN s会降低性能。尝试查看是否可以使用INNER JOIN。检查你是否有适当的索引。如果您可以将您的执行计划附加到您的问题,您将得到更多有用的答案。

+0

好吧,让我再次运行执行计划并发布它,但是非常大... –