newid () / order by sẽ hoạt động, nhưng sẽ rất tốn kém cho các tập kết quả lớn vì nó phải tạo id cho mỗi hàng, sau đó sắp xếp chúng.
TABLESAMPLE () tốt từ quan điểm hiệu suất, nhưng bạn sẽ nhận được kết quả (tất cả các hàng trên một trang sẽ được trả về).
Để có một mẫu ngẫu nhiên thực sự tốt hơn, cách tốt nhất là lọc ra các hàng ngẫu nhiên. Tôi đã tìm thấy mẫu mã sau trong Bài viết trực tuyến Giới hạn bộ bài viết của SQL Server bằng cách sử dụng TABLESAMPLE :
Nếu bạn thực sự muốn một mẫu ngẫu nhiên của các hàng riêng lẻ, hãy sửa đổi truy vấn của bạn để lọc ra các hàng ngẫu nhiên, thay vì sử dụng TABLESAMPLE. Ví dụ: truy vấn sau sử dụng hàm NEWID để trả về khoảng một phần trăm các hàng của bảng Sales.SalesOrderDetail:
SELECT * FROM Sales.SalesOrderDetail
WHERE 0.01 >= CAST(CHECKSUM(NEWID(),SalesOrderID) & 0x7fffffff AS float)
/ CAST (0x7fffffff AS int)
Cột SalesOrderID được bao gồm trong biểu thức CHECKSUM để NEWID () đánh giá một lần trên mỗi hàng để đạt được lấy mẫu trên cơ sở mỗi hàng. Biểu thức CAST (CHECKSUM (NEWID (), SalesOrderID) & 0x7fffffff AS float / CAST (0x7fffffff AS int) ước tính giá trị float ngẫu nhiên trong khoảng từ 0 đến 1.
Khi chạy với bảng có 1.000.000 hàng, đây là kết quả của tôi:
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
Nếu bạn có thể thoát khỏi việc sử dụng TABLESAMPLE, nó sẽ mang lại cho bạn hiệu suất tốt nhất. Nếu không, sử dụng phương thức newid () / filter. newid () / order by nên là giải pháp cuối cùng nếu bạn có tập kết quả lớn.