How to find if a table has rows
Wednesday 28 November 2018
Πολλές φορές όταν γράφουμε κώδικα είτε μέσα σε stored procedures είτε σε scripts να χρειάζεται να κάνουμε διάφορους ελέγχους. Ένας συνηθισμένος έλεγχος είναι να κοιτάμε αν υπάρχουν εγγραφές σε ένα πίνακα για να προχωρήσουμε στο επόμενο βήμα.
Συνήθως για κάτι τέτοιο γράφουμε τον παρακάτω κώδικα.
declare @c int=0;
select @c=count(*)
from dbo.T
where col1==N'xxxxxx';
if @c>0
print 'Has records';
Το πρόβλημα με το κώδικα αυτό είναι ότι αν ο πίνακας μας έχει αρκετά μεγάλο αριθμό εγγραφών θα πρέπει είτε ο πίνακας να γίνει table scan ή αν έχουμε index που μπορεί να χρησιμοποιηθεί να έχουμε index scan.
Αυτό έχει σαν αποτέλεσμα μεγάλους χρόνους εκτέλεσης αλλά και δαπανηρά πλάνα εκτέλεσης όπως φαίνεται παρακάτω αν εκτελέσω κάτι αντίστοιχο σε ένα παραγωγικό περιβάλλον.
declare @c int=0;
select @c=count(*)
from dbo.T
where col1=N'xxxxxx';
if @c>0
print 'Has records';
Using EXISTS
Υπάρχει όμως τρόπος όλα αυτά να τα κάνουμε σχεδόν μηδέν και ο τρόπος είναι να χρησιμοποιήσουμε την EXISTS όπως παρακάτω
if exists(
select *
from dbo.T
where col1=N'xxxxxx'
)
print 'Has records'
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'T Scan count 1, logical reads 1, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
Η εξήγηση είναι απλή. Η EXISTS σταματάει μόλις βρει το πρώτο record που την ικανοποιεί.
Using TOP(1)
Στο σημείο αυτό θα πρέπει να επισημάνω ότι σε κάποιες περιπτώσεις (που θα πρέπει για να τις βρείτε να πειραματιστείτε) να δείτε την ίδια συμπεριφορά με την EXISTS χρησιμοποιώντας την TOP(1) αλλά θεωρώ ότι η χρήση της EXISTS είναι καλύτερη καθώς γράφω και λιγότερο κώδικα και γλυτώνω την χρήση της μεταβλητής.
//antonch