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

 

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

Delete χωρίς εγγραφή στο transaction log

Îåêßíçóå áðü ôï ìÝëïò cap. Τελευταία δημοσίευση από το μέλος KelMan στις 08-11-2005, 17:16. Υπάρχουν 4 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  08-11-2005, 13:36 6887

    Delete χωρίς εγγραφή στο transaction log

    Το πρόβλημα:

    Υπάρχει μια εφαρμογή που τρέχει live.

    Χρειάζεται να γίνει ένα μεγααααλο delete με τον εξής τρόπο: Delete from sometable where somefield=somevalue. Αυτό θα διαγράψει αρκετές εκατοντάδες χιλιάδες εγγραφές. Δεν θέλουμε όμως να γραφτούν στο transaction log αυτά για διάφορους λόγους. Τα deletes αυτά θα γίνουν σε διάφορους πίνακες οι οποίοι έχουν γενικά constraints.

    Truncate, αλλαγή του recovery κλπ. δεν παίζουν στο συγκεκριμένο σενάριο.

    Η ερώτηση:

    Υπάρχει τρόπος να μην περιληφθούν στο transaction log αυτά τα deletes?

     

     

     

     

     


    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  08-11-2005, 14:44 6889 σε απάντηση της 6887

    Απ: Delete χωρίς εγγραφή στο transaction log

    Ο μόνος άλλος τρόπος που μπορώ να σκεφτώ είναι να κάνεις export τα δεδομένα που θες να κρατήσεις (ίσως με DTS?) σε ένα αρχείο, και μετά να τα ξαναβάλεις στην βάση με bcp, που μπορεί να παίξει χωρίς logging.  Είναι βέβαια σαν να προσπαθείς να πιάσεις το αριστερό σου αυτί με το δεξί σου χέρι πίσω από το κεφάλι σου...


    Patrick
  •  08-11-2005, 15:32 6890 σε απάντηση της 6889

    Απ: Delete χωρίς εγγραφή στο transaction log

    Δεν υπάρχει τρόπος να διαγράψει κανείς εγγραφές χωρίς να καταγραφούν στο transaction log, εκτός και αν εκτελέσει το truncate table. Ο λόγος είναι ότι οι αλλαγές στον SQL Server (αλλά και κάθε άλλη βάση) καταγράφονται πάντα για να αποφευχθεί η περίπτωση να "κτυπήσει" η βάση την ώρα που καταχωρεί τις αλλαγές στο σκληρό και στις εσωτερικές δομές του. Διαφορετικά,θα υπήρχε κίνδυνος να διαγραφεί μια γραμμή αλλά να φαίνεται σαν γεμάτη ή το αντίστροφο.

    Για να μπορέσει κανείς να τροποποιήσει μαζικά πολλές εγγραφές (update, delete) αποφεύγοντας να γεμίσει το transaction log και να κλειδώσει τους άλλους χρήστες ενός πίνακα υπάρχουν μερικοί τρόποι.

    • Μία λύση είναι να χρησιμοποιήσει ένα static cursor που θα επιστρέφει τα ID των εγγραφών που χρειάζεται να τροποποιηθούν και μέσα στον cursor να εκτελεί τα update/delete. Είναι ίσως μία από τις ελάχιστες φορές που έχει νόημα να χρησιμοποιηθεί ένα cursor. Δεν είναι βέβαια και τόσο γρήγορη λύση επειδή καταλήγει σε πολλές εκτελέσεις του update/delete.
    • Μια άλλη λύση είναι να σπάσει το delete ή update σε batches χρησιμοποιώντας την εντολή SET ROWCOUNT.
        SET ROWCOUNT 1000
        WHILE (1=1) BEGIN 
        BEGIN TRANSACTION
          UPDATE...set ...,MyLastUpdate='date',...WHERE
          MyLastUpdate < 'date' 
        -- Update 1000 nonupdated rows
          IF @@ROWCOUNT = 0
          BEGIN
            COMMIT TRANSACTION
            BREAK
          END
            COMMIT TRANSACTION
          END

    Τέλος, η ταχύτητα μπορεί να βελτιωθεί αν το update/delete query περιέχει κάποιο FROM χρησιμοποιώντας table hints όπως το NOLOCK.


    Παναγιώτης Καναβός, Freelancer
    Twitter: http://www.twitter.com/pkanavos
  •  08-11-2005, 16:29 6893 σε απάντηση της 6890

    Απ: Delete χωρίς εγγραφή στο transaction log

    Νομίζω οτι καλύφθηκα. Ευχαριστώ!

    Σωτήρης Φιλιππίδης

    DotSee Web Services

    View Sotiris Filippidis's profile on LinkedIn

    DotNetNuke them!
  •  08-11-2005, 17:16 6895 σε απάντηση της 6887

    Απ: Delete χωρίς εγγραφή στο transaction log

    Γαμ$%το! Όλα τα ωραία posts πέφτουν όταν λείπω...
    Vir prudens non contra ventum mingit
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems