1 messaggio dal 15 settembre 2008
ciao a tutti
sto per mettere mano ad una stored procedure lunga ben 1500 righe per cercare di migliorare i tempi di calcolo; ho visto che ci sono un sacco di cursori, anche innestati, e pensavo di sostituirli perchè ho letto da qualche parte che questi oggetti possono usare molte risorse, anche se alla fine ciascun di questi ha come record una o due righe come risultato della select.
In alcuni casi quindi posso sostituire il cursore con una semplice query del tipo

SELECT TOP 1 @colona = colonnaT FROM Tabella Where ... order by id desc

ma in alcuni casi ho bisogno di gestire un record alla volta di una tabella, esempio:

DECLARE cmpCur CURSOR FOR
SELECT VL.IDNumber, VL.LaidType AS DispType, MT.Manufacturer, MT.WallThickness,
MR.HeatNumber, MR.Length
,VL.WeldID,VL.Component, VL.Extension, VL.Remarks, VL.Remarks2,VL.NDTExtension
FROM dbo.V_LAY_List VL
LEFT JOIN (dbo.MainRegistry MR INNER JOIN dbo.MaterialTypes MT ON MR.Component = MT.Component AND MR.MaterialType = MT.MaterialType)
ON VL.Component = MR.Component AND VL.IDNumber = MR.IDNumber AND VL.Extension = MR.Extension
WHERE VL.Location = @Location AND VL.DocNumber = @DocNumber
ORDER BY VL.LineItem ASC;

e cosi via ...
qui
http://blog.sqlauthority.com/2010/02/16/sql-server-stored-procedure-optimization-tips-best-practices/
si consiglia di usare un ciclo while ma mi sembra abbastanza complicato, che ne dite se usassi una tabella temporanea?? è meglio o peggio? o è meglio una tabella del DB creata al volo e poi rimossa?

altra domanda:
nella mia sp dichiaro tantissime variabili una sotto l'altra, es:
DECLARE @Doc_TotShiftLen DECIMAL(10,3);
DECLARE @Doc_TotSectionLen DECIMAL(10,3);
DECLARE @Doc_TotShiftWelds INTEGER;
DECLARE @Doc_TotSectionWelds INTEGER;
DECLARE @Doc_TotShiftAWelds INTEGER;
DECLARE @Doc_TotSectionAWelds INTEGER;
DECLARE @Doc_TotShiftARWelds INTEGER;
DECLARE @Doc_TotSectionARWelds INTEGER;
DECLARE @Doc_TotShiftCutWelds INTEGER;
DECLARE @Doc_TotSectionCutWelds INTEGER;
DECLARE @Doc_TotShiftComponents INTEGER;
DECLARE @Doc_TotSectionComponents INTEGER;
DECLARE @DOC_TotSubShiftComponents INTEGER;
DECLARE @Doc_TotSubSectionComponents INTEGER;

per ottimizzare è meglio dichiararle in un' unica riga? o è insiginificante?


ciao e grazie
in linea di massima un cursore è meno performante di un ciclo while, quindi se puoi ti consiglio di modificare il codice.

Se però riesci a strutturare la query in modo da non usare un ciclo a favore invece di una tabella temporanea è sempre meglio.

Ad ogni modo, 1500 righe mi sembrano un pò eccessive. Sinceramente ti consiglierei di dividerla in sub-procedures e/o funzioni così da avere prima di tutto un codice più pulito e manutenibile.

Davide Guida
Developer, Data Manager @ Publicis Healthware
http://davideguida.netne.net

Torna al forum | Feed RSS

ASPItalia.com non è responsabile per il contenuto dei messaggi presenti su questo servizio, non avendo nessun controllo sui messaggi postati nei propri forum, che rappresentano l'espressione del pensiero degli autori.
Community
Ultimi messaggi
UTENTI ONLINE
    In primo piano

    I più letti di oggi

    Media
    In evidenza
    MISC