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

 

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

SQL Optimization advice: isDeleted σε Header και Details table

Îåêßíçóå áðü ôï ìÝëïò Harkon. Τελευταία δημοσίευση από το μέλος Thiseas στις 01-09-2013, 20:39. Υπάρχουν 5 απαντήσεις.
Ταξινόμηση Δημοσιεύσεων: Προηγούμενο Επόμενο
  •  07-08-2013, 20:31 73783

    SQL Optimization advice: isDeleted σε Header και Details table

    Καλησπέρα σας,

    έχω 2 κλασικούς πίνακες (έστω παραστατικών).

     Στον 1ο αποθηκεύω την «κεφαλή» του παραστατικού και στον 2ο τις λεπτομέρειές του (αντικείμενα) με foreign key το id του πρώτου πίνακα. 

     Έστω τώρα ότι διαγράφω το παραστατικό οπότε πάω στον πρώτο πίνακα και θέτω το πεδίο isDeleted = 1. 

    Στον δεύτερο πίνακα δεν έχω παρόμοιο πεδίο ώστε να πω και στις γραμμές του isDeleted = 1 και αυτό γιατί πάντα στα queries μου θα κοιτάω αν η κεφαλή είναι IsDeleted για να προχωρήσω ανάλογα.

    Βρήκα όμως μια περίπτωση όπου κάνω πρώτα left join στον δεύτερο πίνακα (κρατάω και στοιχεία για κάτι άλλο πέρα από τις γραμμές του παραστατικού) και μετά Join με τον 1ο ώστε να ελέγξω εάν είναι διεγραμμένο.

    Π.χ.

     σε κάποια ερωτήματα πάω πρώτα από τον πίνακα 1 (Timologia)

    SELECT bl.Barcode

    FROM Timologia as t

     INNER JOIN Timologio_Deltia as td

     ON t.id = td.timologioId

     INNER JOIN DeltiaAgoras as dag

     ON td.deltioAgorasID = dag.id and dag.isdeleted=0

    INNER JOIN BCLog as bl ON dag.id = bl.deltio_agoras_id 

     Where t.isDeleted = 0 

    ..... , οπότε εδώ είμαι οκ.

     

    Σε περίπτωση που πάω από την ανάποδη όμως,

    SELECT bl.Barcode 

    FROM DeltiaAgoras as dag

    LEFT JOIN Timologio_Deltia as td 

    ON dag.id = td.deltioAgorasID and (select t2.isdeleted from timologia as t2 where t2.id =td.timologioId)=0 

    LEFT JOIN Timologia as t 

    ON td.timologioId = t.id and t.isdeleted = 0

    LEFT JOIN BCLog as bl ON bl.deltio_agoras_id = dag.id

     ...

     εάν δεν βάλω την υπογραμμισμένη συνθήκη παίρνω πολλαπλές εγγραφές γιατί πάει πρώτα στον 2ο πίνακα οπότε και join-άρει και με εγγραφές που ανήκουν σε διαγραμμένα παραστατικά.

     

    Και ρωτάω, για να μη μακρολογώ. Μήπως είναι καλύτερα και πιο σωστά γενικά, να βάλω απλά ενα πεδίο Isdeleted και στον 2ο πίνακα ή το αφήνω έτσι καλύτερα;

     

     

    Ευχαριστώ πολύ  

    Δημοσίευση στην κατηγορία: , ,
  •  07-08-2013, 20:53 73785 σε απάντηση της 73783

    Απ: SQL Optimization advice: isDeleted σε Header και Details table

    Καλησπέρα,

    Το πρόβλημά σου δεν θα έπρεπε να είναι στον SQL server - όχι ότι είναι αδιάφορο με το πως θα λειτουργήσει η βάση καλύτερα.

    Λογικά το business rule - η λογική της ενέργειας που κάνει εκείνη τη στιγμή ο χρήστης στην εφαρμογή σου - είναι αυτή που θα σου καθορίσει τι χρειάζεται να φτιάξεις, όχι τι χρειάζεται ο SQL για να λειτουργήσει καλύτερα, π.χ. Θα ψάξεις από το πρόγραμμά σου να βρεις από τις γραμμές του παραστατικού το παραστατικό; Αν ναι, τι σημαίνει - για αυτό που κάνει εκείνη τη στιγμή ο χρήστης της εφαρμογής σου - ότι η γραμμή που βρήκε έχει σβησμένο παραστατικό; Θα πρέπει να την δει ο χρήστης; Θα πρέπει να την δείξει το πρόγραμμα; Θα πρέπει να την κρύψει το πρόγραμμα;

       

    George J.

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  07-08-2013, 21:35 73788 σε απάντηση της 73785

    Απ: SQL Optimization advice: isDeleted σε Header και Details table

    Καλησπέρα κι ευχαριστώ πολύ !

     

    Τα ερωτήματα αυτά τα στέλνω τελικά σε crystal reports και ο χρήστης και στα 2 σενάρια δεν θα δει τίποτε που είναι διεγραμμένο. 

    Απλά αναρωτιόμουν αν υπάρχει κάτι που είναι «σχεδιαστικά» πιο ορθό και λιγότερο επίπονο για τον sql server

     

  •  07-08-2013, 21:58 73789 σε απάντηση της 73788

    Απ: SQL Optimization advice: isDeleted σε Header και Details table

    Μόλις είπες την μαγική λέξη: "Crystal Reports".

    Δυστηχώς ή ευτυχώς για να μπορέσουν να δουλέψουν με οποιαδήποτε βάση τα Crystal Reports, έχουν δική τους λογική για να κάνουν optimize τα δεδομένα που χρησιμοποιούν. Και σχεδόν πάντα η λογική εκτελείται στον client και όχι στη βάση.

      

    George J.

     

     


    George J. Capnias: Χειροπρακτικός Υπολογιστών, Ύψιστος Γκουράρχης της Κουμπουτερολογίας
    w: capnias.org, t: @gcapnias, l: gr.linkedin.com/in/gcapnias
    dotNETZone.gr News
  •  09-08-2013, 08:42 73800 σε απάντηση της 73789

    Απ: SQL Optimization advice: isDeleted σε Header και Details table

    αααα μάλιστα...

    ΟΚ τότε.. ας το κλείσουμε εδώ το θέμα, καλύφθηκα!

    σε ευχαριστώ πάρα πολύ! 

  •  01-09-2013, 20:39 74265 σε απάντηση της 73800

    Απ: SQL Optimization advice: isDeleted σε Header και Details table

    Τι θα έλεγες να φτιάξεις ένα VIEW στα DeltiaAgoras (ας πούμε το vDeltiaAgoras) το οποίο θα περίεχει μέσα του (με inner join) και το περίφημο πεδίο IsDeleted του αντίστοιχου header, και αυτό το vDeltiaAgoras να "κοιτούν" όλα τα query σου;

    Nothing to declare...
Προβολή Τροφοδοσίας RSS με μορφή XML
Με χρήση του Community Server (Commercial Edition), από την Telligent Systems