2016-03-01 73 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

好吧,讓我再次運行執行計劃併發布它,但是非常大... –