Mượn bảng ví dụ của jonearles, tôi thấy chính xác điều tương tự (trong 11gR2 trên hình ảnh nhà phát triển OEL), thường nhận các giá trị cho a
lệch nhiều về phía 1
; với kích thước mẫu nhỏ, đôi khi tôi không thể nhìn thấy gì cả. Với bước ngẫu nhiên / hạn chế bổ sung mà tôi đã đề cập trong một nhận xét:
select a, count(*) from (
select * from test1 sample (1)
order by dbms_random.value
)
where rownum < 101
group by a;
... với ba lần chạy tôi đã nhận được:
A COUNT(*)
---------- ----------
1 71
2 29
A COUNT(*)
---------- ----------
1 100
A COUNT(*)
---------- ----------
1 64
2 36
Có, 100% thực sự đã trở lại dưới dạng 1
trong lần chạy thứ hai. Bản thân việc nghiêng dường như khá ngẫu nhiên. Tôi đã thử với block
công cụ sửa đổi dường như không tạo ra sự khác biệt nhỏ, có lẽ đáng ngạc nhiên - tôi có thể nghĩ rằng nó sẽ trở nên tồi tệ hơn trong tình huống này.
Điều này có thể sẽ chậm hơn, chắc chắn là đối với các kích thước mẫu nhỏ, vì nó phải đạt được toàn bộ bảng; nhưng không mang lại cho tôi sự phân chia khá, thậm chí khá nhất quán:
select a, count(*) from (
select a, b from (
select a, b, row_number() over (order by dbms_random.value) as rn
from test1
)
where rn < 101
)
group by a;
Với ba lần chạy, tôi nhận được:
A COUNT(*)
---------- ----------
1 48
2 52
A COUNT(*)
---------- ----------
1 57
2 43
A COUNT(*)
---------- ----------
1 49
2 51
... trông khỏe mạnh hơn một chút. Tất nhiên là YMMV.
Bài viết này của Oracle
bao gồm một số kỹ thuật lấy mẫu và bạn có thể muốn đánh giá ora_hash
cũng như cách tiếp cận và phiên bản phân tầng nếu dữ liệu của bạn trải rộng và các yêu cầu về 'tính đại diện' của bạn đòi hỏi nó.