T-SQL’de bir tablodan rastgele kayıt seçmenin farklı yöntemleri bulunmaktadır. Bunlardan en popüler olanı NEWID() isimli sistem fonksiyonun kullanılmasıdır. Bu fonksiyon her çağrıldığında uniqueidentifier türünde tekil bir değer döndürür. Okuduğumuz tabloda her satır için bunu çağırıp listeyip bu alana göre sıralamamız yeterli olacaktır.
SELECT TOP 5 * FROM Alisveris ORDER BY NEWID() --Üretilen değeri INT türünde yazdıralım SELECT ABS(CAST(CAST(NEWID() AS VARBINARY) AS INT)), * FROM Alisveris ORDER BY NEWID()
Bu sorgu Alisveris tablosundan rastgele 5 kayıt döndürecektir.
SQL Server’de rastgele değer üretmek için kullanılan RAND() fonksiyonu rastgele seçim için kullanılabilecek gibi görünse de tam olarak istediğimiz sonucu veremeyecektir. RAND() fonksiyonu 0 ve 1 arasında float türünde rastgele bir değer üretir. Fakat tablo okuma esnasında çağrıldığı zaman NEWID() gibi her satır için tekil bir değer döndürmek yerine tüm satırlar için aynı değeri üretir. RAND() fonksiyıno aynı zamanda int türünde seed parametresi alır. Bu parametre her defasında aynı sonucu elde etmek için kullanılır. Aynı seed değeri ile aynı değer üretilir. RAND() fonksiyonu sadece tek kayıt okumak için tercih edilebilir.
SELECT TOP 1 * FROM Alisveris ORDER BY RAND()
Bir tablo üzerinde örneklem yapmak için SQL Server 2005 ile birlikte TABLESAMPLE yan tümcesi geliştirildi. Parametre olarak kaç kayıt veya yüzdelikte satır okunacağının parametresini alır.
...FROM tableName TABLESAMPLE (10 PERCENT) ...FROM tableName TABLESAMPLE (1000 ROWS)
Fakat bu tümce okumayı satır bazında değil doğrudan data page bazında yaptığından her zaman verdiğimiz değer kadar satır gelmeyebilir. İlgili data page’de bulunan tüm kayıtları listeler. Bu yüzden TOP ile birlikte kullanılması daha doğru olacaktır.
SELECT TOP 10 * FROM Alisveris TABLESAMPLE SYSTEM (100 ROWS)
TABLESAMPLE tümcesi tablo üzerinde hızlı bir şekilde örneklem yapmamıza sağlar. 50mio kayıt bulunan bir tabloda aşağıdaki sonuçları elde ettik.
SET STATISTICS TIME ON SET STATISTICS IO ON SELECT TOP 10 * FROM f_mov ORDER BY NEWID() /*========NEWID() SQL Server Execution Times: CPU time = 430389 ms, elapsed time = 29744 ms. */ SELECT * FROM f_mov TABLESAMPLE SYSTEM (100 ROWS) /*===========TABLESAMPLE SQL Server Execution Times: CPU time = 281 ms, elapsed time = 424 ms. */ SET STATISTICS IO OFF SET STATISTICS TIME OFF
Görüldüğü gibi TABLESAMPLE daha kısa sürede sonuç vermiştir. Fakat yazdığımız gibi NEWID() gibi her zaman aynı sayıda kesin sonuç vermeyebilir.