newid () / order by çalışacak, ancak her satır için bir kimlik oluşturması ve ardından bunları sıralaması gerektiği için büyük sonuç kümeleri için çok pahalı olacaktır.
TABLESAMPLE (), performans açısından iyidir, ancak sonuçların toplanmasını sağlarsınız (sayfadaki tüm satırlar döndürülür).
Daha iyi performans gösteren gerçek rastgele örnek için, en iyi yol satırları rastgele filtrelemektir. Aşağıdaki kod örneğini TABLESAMPLE kullanarak sonuç kümelerini sınırlama SQL Server Books Online'da buldum :
Gerçekten tek tek sıraların rastgele bir örneğini istiyorsanız, TABLESAMPLE yerine satırları rastgele filtrelemek için sorgunuzu değiştirin. Örneğin, aşağıdaki sorgu, Sales.SalesOrderDetail tablosundaki satırların yaklaşık yüzde birini döndürmek için NEWID işlevini kullanır:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(),SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SalesOrderID sütunu CHECKSUM ifadesine dahil edilir, böylece NEWID () satır başına örnekleme elde etmek için satır başına bir kez değerlendirilir. CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) ifadesi 0 ile 1 arasında rastgele bir float değeri olarak değerlendirilir.
1.000.000 sıralı bir tabloya karşı çalıştırıldığında, sonuçlarım şunlardır:
SET STATISTICS TIME ON
SET STATISTICS IO ON
/* newid()
rows returned: 10000
logical reads: 3359
CPU time: 3312 ms
elapsed time = 3359 ms
*/
SELECT TOP 1 PERCENT Number
FROM Numbers
ORDER BY newid()
/* TABLESAMPLE
rows returned: 9269 (varies)
logical reads: 32
CPU time: 0 ms
elapsed time: 5 ms
*/
SELECT Number
FROM Numbers
TABLESAMPLE (1 PERCENT)
/* Filter
rows returned: 9994 (varies)
logical reads: 3359
CPU time: 641 ms
elapsed time: 627 ms
*/
SELECT Number
FROM Numbers
WHERE 0.01 >= CAST(CHECKSUM(NEWID(), Number) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
SET STATISTICS IO OFF
SET STATISTICS TIME OFF
TABLESAMPLE'ı kullanmaktan kurtulabilirseniz, size en iyi performansı verecektir. Aksi takdirde newid () / filter yöntemini kullanın. Büyük bir sonuç kümeniz varsa newid () / order by son çare olmalıdır.