go backarticles

Articles of SQLschool.gr Team

How to find if a table has rows

Antonios Chatzipavlis

Πολλές φορές όταν γράφουμε κώδικα είτε μέσα σε 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';

img1

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.


img2

Η εξήγηση είναι απλή. Η EXISTS σταματάει μόλις βρει το πρώτο record που την ικανοποιεί.

Using TOP(1)

Στο σημείο αυτό θα πρέπει να επισημάνω ότι σε κάποιες περιπτώσεις (που θα πρέπει για να τις βρείτε να πειραματιστείτε) να δείτε την ίδια συμπεριφορά με την EXISTS χρησιμοποιώντας την TOP(1) αλλά θεωρώ ότι η χρήση της EXISTS είναι καλύτερη καθώς γράφω και λιγότερο κώδικα και γλυτώνω την χρήση της μεταβλητής.



//antonch




Relative Articles

Leave your comment

Login with your SQLschool.gr account if you want to comment on this article.