Καλώς ορίσατε στο dotNETZone.gr - Σύνδεση | Εγγραφή | Βοήθεια
σε

 

Αρχική σελίδα Ιστολόγια Συζητήσεις Εκθέσεις Φωτογραφιών Αρχειοθήκες

Καθυστέρηση εκτέλεσης σε update query

Îåêßíçóå áðü ôï ìÝëïò neoklis. Τελευταία δημοσίευση από το μέλος neoklis στις 15-03-2010, 13:30. Υπάρχουν 10 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  12-03-2010, 11:28 57629

    Καθυστέρηση εκτέλεσης σε update query

    Καλημέρα,

     

    Εκτελώ ένα update query με inner join. O ένας πίνακας έχει 100 εγγραφές και ο άλλος 200. Το πρόβλημα μου είναι ότι ο χρόνος εκτέλεσης του ερωτήματος φτάνει τα 3-4 λεπτά. Χρησιμοποιώντας το Display Estimated Execution Plan παρατήρησα ότι στο plan εμπλέκονται και κάποια views. Σβήνοντας τα view το ερώτημα εκτελέστηκε κανονικότατα χωρίς πρόβλημα, όμως αυτό δεν είναι λύση. Υπάρχει κάτι που μπορώ να κάνω ώστε το query μου να μην αργεί να εκτελεστεί..;

     

    Ευχαριστώ


    Dionisis
  •  12-03-2010, 11:35 57630 σε απάντηση της 57629

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Tongue Tied Λάθος ενότητα... Μπορεί να μεταφερθεί παρακαλώ..στα Πρώτα Βήματα - Βάσεις δεδομένων;

     

    Ευχαριστώ


    Dionisis
  •  12-03-2010, 12:04 57632 σε απάντηση της 57629

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Θα πρέπει να περιγράψεις πιο αναλυτικά το πρόβλημα. Καταρχήν για τι βάση μιλάμε; Και αυτά τα views από που έχουν προκύψει; Ποιός είναι ο κώδικας για το query που κάνει το update;

     


    Vir prudens non contra ventum mingit
  •  12-03-2010, 12:19 57634 σε απάντηση της 57632

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Η βάση είναι σε SQL 2005. Χρησιμοποιώ σαν Front-End Ms Access και το view είναι συνδεδεμένο μέσα στην Access.

     

    Τα κλειδιά και για τους δύο πίνακες είναι Client,Plant,WcID.

     

    UPDATE    RPT.dbo.RPT_WC
    
    SET              WCCostID = UpLoadText.dbo.SRPT_WC.WCCostID, WorkCenter = UpLoadText.dbo.SRPT_WC.WorkCenter, 
    
                          WCDescr = UpLoadText.dbo.SRPT_WC.WCDescr, SAPType = UpLoadText.dbo.SRPT_WC.SAPType, 
    
                          SAPCategory = UpLoadText.dbo.SRPT_WC.SAPCategory, SAPOperType = UpLoadText.dbo.SRPT_WC.SAPOperType, 
    
                          AFinal = UpLoadText.dbo.SRPT_WC.AFinal, SortNo = UpLoadText.dbo.SRPT_WC.SortNo, Cpr = UpLoadText.dbo.SRPT_WC.Cpr, 
    
                          SAPBlock = UpLoadText.dbo.SRPT_WC.SAPBlock
    
    FROM         UpLoadText.dbo.SRPT_WC INNER JOIN
    
                          RPT.dbo.RPT_WC ON UpLoadText.dbo.SRPT_WC.Client = RPT.dbo.RPT_WC.Client AND 
    
                          UpLoadText.dbo.SRPT_WC.Plant = RPT.dbo.RPT_WC.Plant AND UpLoadText.dbo.SRPT_WC.WCID = RPT.dbo.RPT_WC.WCID
    
    WHERE     (NOT (RPT.dbo.RPT_WC.WorkCenter IS NULL))

    Dionisis
  •  12-03-2010, 12:32 57635 σε απάντηση της 57634

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Δηλαδή αν κατάλαβα καλά, κάνεις join έναν πίνακα που είναι στον SQL Server με ένα view που είναι στην Access? Αυτό συνεπάγεται ότι για κάθε μια εγγραφή που προκύπτει από το join, θα ταξιδεύει ο SQL Server (αργά-αργά) over the wire για να βρίσκει τις εγγραφές που ταιριάζουν στην Access (ή το ανάποδο). Τυπικά, indexes δεν θα παίζουν, οπότε γι αυτό έχεις τέτοιο performance. Δοκίμασες να φτιάξεις το view στον SQL Server?

     

     


    Vir prudens non contra ventum mingit
  •  12-03-2010, 13:05 57643 σε απάντηση της 57635

    Απ: Καθυστέρηση εκτέλεσης σε update query

    To view είναι στον SQL Server και το μόνο που κάνω στην Access είναι να διαβάζω το view linked μέσω μίας φόρμας με φίλτρα, αλλά ας ξεχάσουμε για λίγο την Access και ας μέινουμε στον SQL γιατί εκεί έχω το πρόβλημα.

     

    To update που εκτελώ αφορά 2 πίνακες του SQL Server. Είναι δύο τυπικοί πίνακες με τα κλειδιά τους. Ο ένας από τους δύο πίνακες χρησιμοποιείται και σε κάποια views. Όπως είπα και παραπάνω οι πίνακες αυτοί δεν έχουν πολλές εγγραφές, οπότε ένα τυπικό update θα έπρεπε να εκτελείται σε ελάχιστα δευτερόλεπτα. Όμως ο χρόνος εκτέλεσης ανέρχεται στα τρία λεπτά.  Μην μπορώντας να καταλάβω γιατί χρησιμοποίησα το Display Estimated Execution Plan και είδα ότι έχει συμπεριλάβει και δύο views. Μα εγώ λέω, στο query μου χρησιμοποιώ δύο πίνακες και όχι view, που στο καλό τα βρίσκει και τα βάζει μέσα στο plan; Οπότε για να μου φύγει η απορία για το αν τα view είναι η «αιτία» της καθυστέρησης τα έσβησα και το αποτέλεσμα ήταν το προσδοκόμενο, εκτελέστηκε ταχύτατα. Κατά πάσα πιθανότητα την ώρα που εκτελείται το update των πινάκων ο SQL ενημερώνει και τα views για αυτό και καθυστερεί. Αυτό είναι το πρόβλημα μου. Υπάρχει λοιπόν τρόπος χωρίς να σβήσω τα view το update query να εκτελείται γρήγορα ή θα πρέπει να δεχτώ την καθυστέρηση εκτέλεσης του ερωτηματος μου..;


    Dionisis
  •  12-03-2010, 13:26 57644 σε απάντηση της 57643

    Απ: Καθυστέρηση εκτέλεσης σε update query

    ΟΚ, άρα όλα αυτά που περιγράφεις είναι ανεξάρτητα της Access. Τι views είναι αυτά; Μπορείς να δώσεις τον κώδικα; Τυπικά τα views δεν ενημερώνονται εκτός αν είναι indexed. Επίσης θα μπορούσαν να έχουν INSTEAD-OF triggers. Αυτές είναι δύο περιπτώσεις που τα views πιθανά να σου δημιουργούν overhead.

    Επίσης, στο query βλέπω ότι υπάρχει μια βάση RPT και μια UpLoadText, σωστά; Κάνεις cross database join... Τέλος, δύο screenshots του execution plan (όχι του estimate, του πραγματικού καλύτερα) ένα με τα views και ένα χωρίς, θα βοηθούσε πολύ. 

     


    Vir prudens non contra ventum mingit
  •  12-03-2010, 14:50 57648 σε απάντηση της 57644

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Συνημμένα: PlanWithNoViews.JPG

     |Ta views ειναι indexed... O κώδικας από το ένα view και ανεβάζω screenshot από το actual plan τρέχοντας το query χωρίς views..

    SELECT     dbo.RPT_SDI.Client, RTRIM(dbo.RPT_SDI.SD) + '-' + RIGHT('000' + RTRIM(dbo.RPT_SDI.SDi), 3) + '-' + RTRIM(dbo.RPT_SDI.Material) AS SDiKey,
                          RTRIM(dbo.RPT_SDI.SD) + '-' + RIGHT('000' + RTRIM(dbo.RPT_SDI.SDi), 3) + '-' + RTRIM(dbo.RPT_SDI.Material) + '-' + dbo.RPT_OPRI.OperNo AS ID,
                          dbo.RPT_SD.ProgrM, dbo.RPT_SD.BlockStatus, dbo.RPT_SD.SoldID, dbo.RPT_SD.ShipID, dbo.RPT_CUST.Name AS ShipToName,
                          dbo.RPT_CUST.Country AS ShipToCountry, dbo.RPT_SDI.PlanPlant, dbo.RPT_SDI.Plant, dbo.RPT_SDI.SD, dbo.RPT_SDI.SDi,
                          RIGHT('000' + RTRIM(dbo.RPT_SDI.SDi), 3) AS SDi3, dbo.RPT_SDI.Combo, dbo.RPT_SDI.Rejected, dbo.RPT_SDI.RejReason, dbo.RPT_SDI.Material,
                          dbo.RPT_MAT.Description, dbo.RPT_MAT.MatType, dbo.RPT_MAT.MatGroup, dbo.RPT_MAT.MRPC, dbo.REF_MRPWC.PrdGID, dbo.RPT_SDI.QSUn,
                          dbo.RPT_SDI.SUn, dbo.RPT_SDI.QKG, dbo.RPT_SDI.QST, dbo.RPT_SDI.Operkey, dbo.RPT_OPRI.OperPlant, dbo.RPT_OPRI.OperNo,
                          dbo.RPT_OPRI.WCID, dbo.RPT_WC.WorkCenter, dbo.RPT_WC.SAPType, dbo.RPT_WC.SAPCategory, dbo.RPT_WC.SAPOperType,
                          dbo.RPT_OPRI.BaseQ, dbo.RPT_OPRI.OperQUn, dbo.RPT_OPRI.PrMTime, dbo.RPT_OPRI.PrMTimeUn, dbo.RPT_SD.DelivDate,
                          dbo.REF_MRPWC.CCpr, dbo.REF_MRPWC.WG, dbo.REF_MRPWC.WGCnf, dbo.REF_MRPWC.WGCnfPrev, dbo.REF_MRPWC.CAFinal,
                          dbo.REF_MRPWC.PlanActive
    FROM         dbo.RPT_MAT INNER JOIN
                          dbo.RPT_SD INNER JOIN
                          dbo.RPT_SDI ON dbo.RPT_SD.Client = dbo.RPT_SDI.Client AND dbo.RPT_SD.SD = dbo.RPT_SDI.SD INNER JOIN
                          dbo.RPT_OPRI ON dbo.RPT_SDI.Client = dbo.RPT_OPRI.Client AND dbo.RPT_SDI.Operkey = dbo.RPT_OPRI.Operkey INNER JOIN
                          dbo.RPT_CUST ON dbo.RPT_SD.Client = dbo.RPT_CUST.Client AND dbo.RPT_SD.ShipID = dbo.RPT_CUST.CustID ON
                          dbo.RPT_MAT.Client = dbo.RPT_SDI.Client AND dbo.RPT_MAT.Plant = dbo.RPT_SDI.Plant AND
                          dbo.RPT_MAT.Material = dbo.RPT_SDI.Material INNER JOIN
                          dbo.REF_MRPWC ON dbo.RPT_MAT.MRPC = dbo.REF_MRPWC.MRPC AND dbo.RPT_OPRI.Client = dbo.REF_MRPWC.Client AND
                          dbo.RPT_OPRI.OperPlant = dbo.REF_MRPWC.Plant AND dbo.RPT_OPRI.WCID = dbo.REF_MRPWC.WCID INNER JOIN
                          dbo.RPT_WC ON dbo.RPT_OPRI.Client = dbo.RPT_WC.Client AND dbo.RPT_OPRI.OperPlant = dbo.RPT_WC.Plant AND
                          dbo.RPT_OPRI.WCID = dbo.RPT_WC.WCID
    WHERE     (NOT (dbo.RPT_SD.ProgrM IS NULL))



    Dionisis
  •  12-03-2010, 14:51 57649 σε απάντηση της 57648

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Συνημμένα: PlanWithViews.JPG

    Τρέχοντας το query με views..

     

     



    Dionisis
  •  15-03-2010, 10:46 57679 σε απάντηση της 57649

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Έλειπα ΠΣΚ οπότε τώρα είδα τα προηγούμενα. Έχεις ένα view που βασίζεται σε 7 πίνακες (αν μέτρησα σωστά) και αυτό έχει index (ουσιαστικά) πάνω σε αυτούς τους πίνακες. Λογικό μου φάινεται να καθυστερεί τόσο και αυτό φαίνεται από το δεύτερο execution plan. Το update που κάνεις, ως side-ffect, απαιτεί από το view να κάνει update και το index του ώστε το index να μένει συγχρονισμένο. Δεν ξέρω κατά πόσο μπορείς, ωστόσο αυτό που θα πρότεινα είναι να κάνεις drop το index από το view. Τώρα, αν το performance του γίνει προβληματικό, μπορείς να το αντικαταστήσεις με έναν πίνακα που να γεμίζει βάσει κάποιας διαδικασίας και να έχει αυτός ο πίνακας τα κατάλληλα indexes. Βέβαια, αυτό εξαρτάται από το κατά πόσο μπορείς να βάλεις χέρι στην εφαρμογή αλλά δεν βλέπω άλλη λύση...

     


    Vir prudens non contra ventum mingit
  •  15-03-2010, 13:30 57682 σε απάντηση της 57679

    Απ: Καθυστέρηση εκτέλεσης σε update query

    Σε ευχαριστώ για την βοήθεια σου και για την λύση που πρότεινες...  
    Dionisis
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems