Διαφορές μεταξύ EXISTS και IN χειριστών σε SQL

Συγγραφέας: Peter Berry
Ημερομηνία Δημιουργίας: 11 Αύγουστος 2021
Ημερομηνία Ενημέρωσης: 20 Νοέμβριος 2024
Anonim
ΣΥΝΔΕΣΗ ODBC
Βίντεο: ΣΥΝΔΕΣΗ ODBC

Περιεχόμενο

Μία συνεχής πρόκληση στη χρήση του SQL είναι ο προσδιορισμός της σωστής χρήσης των EXISTS και IN χειριστών. Οι δύο φορείς εκμετάλλευσης μπορούν να παράγουν τα ίδια αποτελέσματα, αλλά όχι πάντα. Επιπλέον, υπάρχει σημαντική συζήτηση για τον τρόπο βελτιστοποίησης του κάθε χειριστή για ταχύτητα. Οι χρήστες πρέπει να κατανοούν τα διαφορετικά χαρακτηριστικά κάθε χειριστή και να πειραματίζονται με τα δύο για να καθορίσουν την κατάλληλη χρήση.


Σκεφτείτε τους στόχους SQL όταν επιλέγετε EXISTS ή IN (Jupiterimages / Φωτογραφίες.com / Getty Images)

IN χειριστή

Ο χειριστής IN επιστρέφει μια γραμμή εάν η τιμή πεδίου ενός πίνακα ικανοποιεί την προϋπόθεση WHERE σε μια λίστα των τιμών IN. Χρησιμοποιείται συνήθως ως μέρος ενός κύριου ερωτήματος ή σε συνδυασμό με ένα υποσύστημα.

Παράδειγμα 1: WHERE table.field IN ('a', 'b', 'c') Παράδειγμα 2: WHERE table.field IN (Υποσύστημα που επιστρέφει ένα σετ)

ΥΠΑΡΧΕΙ φορέας

Ο διαχειριστής EXISTS επιστρέφει όλες τις μεγάλες σειρές, αν ένα υποσύστημα περιέχει οποιεσδήποτε σειρές. Χρησιμοποιείται μόνο σε συνδυασμό με ένα υποσύστημα. Οι σειρές που επιστρέφονται καθορίζονται από το φίλτρο στο κύριο ερώτημα.

Παράδειγμα: WHERE EXISTS (Υποσύστημα που επιστρέφει ένα σετ)

Διαφορά

Ο χειριστής IN δεν μπορεί να αξιολογήσει τις τιμές NULL, έτσι ώστε οι γραμμές αυτές θα είναι πάντα ψευδείς και δεν θα επιστραφούν, σε αντίθεση με τον χειριστή EXISTS, ο οποίος αξιολογεί και επιστρέφει γραμμές με τιμές NULL.


Ομοιότητες

Τόσο η EXISTS όσο και η IN υποστηρίζουν συσχετισμένες και μη συσχετισμένες υποεπιχειρήσεις, και οι δύο μπορούν να παράγουν παρόμοια αποτελέσματα. Όταν συσχετίζονται, ικανοποιούν ένα κύριο πεδίο ερωτήματος για ένα πεδίο υποερωτήματος (π.χ.: principal.id = subquery.id). Το υποσύστημα αξιολογεί τη σειρά ανά σειρά για κάθε εμφάνιση που εντοπίστηκε. Στην περίπτωση αυτή, οι IN και EXISTS θα επιστρέψουν τις ίδιες γραμμές με βάση παρόμοιες συνθήκες "id". Όταν δεν έχουν συσχετιστεί, οι δύο χειριστές επεξεργάζονται τα υποκείμενα τους και στη συνέχεια συνδυάζουν τα αποτελέσματα για το κύριο ερώτημα.

Απόδοση

Η απόδοση καθορίζεται από τη βελτιστοποίηση βάσης δεδομένων και το σχέδιο εκτέλεσης που χρησιμοποιείται για τον εκτελεσμένο κώδικα. Για τα EXISTS και IN, ο βελτιστοποιητής μπορεί να επιλέξει διαφορετικές διαδρομές. Στην Oracle, το NOT EXISTS είναι συνήθως ταχύτερο από το NOT IN. Στο τέλος, απαιτούνται κάποιες προσπάθειες και σφάλματα για να ταξινομήσετε τη συντομότερη διαδρομή, ανάλογα με τη βάση δεδομένων και την έκδοση που χρησιμοποιείται. Φροντίστε να χρησιμοποιήσετε πρώτα τον χειριστή που εγγυάται τα σωστά αποτελέσματα και, στη συνέχεια, προσπαθήστε να αντικαταστήσετε τους χειριστές για να δείτε ποια είναι η ταχύτερη.