2012-02-26 36 views
11

Tôi đang làm việc với cơ sở dữ liệu Oracle và tôi cần có khả năng phân vùng dữ liệu trong bảng. Tôi hiểu rằng Rracle có một hàm ora_hash có thể phân vùng dữ liệu thành các thùng. Hàm ora_hash có xác định được không?Là ora_hash xác định?

Trong chương trình của mình, tôi sẽ thực hiện một số truy vấn cơ sở dữ liệu khác nhau với mỗi truy vấn yêu cầu một số nhóm khác nhau.

Ví dụ, trong một truy vấn tôi có thể yêu cầu hai xô đầu tiên:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (0,1); 

Trong một truy vấn tiếp theo tôi có thể yêu cầu 2 và xô 3rd:

SELECT * FROM sales WHERE ORA_HASH(cust_id, 9) in (1,2); 

Ở phía trên Ví dụ, ora_hash sẽ luôn chia bảng thành 10 nhóm giống nhau không? Giả sử rằng dữ liệu trong các bảng đã không thay đổi. Nhóm thứ hai (nhóm 1) có giống nhau trong cả hai truy vấn không?

Có tài liệu gợi ý rằng giá trị hạt giống cho phép oracle trả lại các kết quả khác nhau cho cùng một tập dữ liệu. Vì vậy, tôi giả sử rằng nếu tôi không sử dụng giá trị hạt giống , thì ora_hash sẽ được xác định. Xem the documentation.

+0

Tôi chỉ có thể tìm thấy một tham chiếu đến ["Nứt không xác định"] (http://thedailywtf.com/Articles/The-Nondeterministic-Hash.aspx) ... –

Trả lời

5

Câu trả lời của Jon Heller có thêm một số chi tiết, vì vậy hãy nêu lên câu trả lời của anh ấy. Vì đây là câu trả lời chấp nhận vẫn còn, tôi sẽ inline một phần của câu trả lời của mình:

ORA_HASH chắc chắn là xác định với nhiều loại dữ liệu có thể được sử dụng cho phân vùng, chẳng hạn như NUMBER, VARCHAR, DATE vv

Nhưng ORA_HASH không xác định cho ít nhất một số loại dữ liệu khác, chẳng hạn như CLOB.

+0

Tài liệu chính xác! – timmy

13

ORA_HASH chắc chắn là xác định với nhiều loại dữ liệu có thể được sử dụng cho phân vùng, chẳng hạn như số, VARCHAR, DATE vv

Nhưng ORA_HASHkhông xác định ít nhất một số các kiểu dữ liệu khác , chẳng hạn như CLOB.


Câu trả lời của tôi dựa trên this Bài viết về Jonathan Lewis về ORA_HASH.

Jonathan Lewis không rõ ràng là xác định, nhưng ông đề cập rằng ORA_HASH "có vẻ là hàm được sử dụng nội bộ - với hạt 0 - để xác định phân vùng nào thuộc hàng trong bảng được phân đoạn băm". Và nếu nó được sử dụng để phân vùng băm thì nó phải được xác định, hoặc các tham gia phân vùng khôn ngoan khác sẽ không hoạt động.

Để cho biết rằng ORA_HASH có thể không xác định đối với một số loại dữ liệu, hãy chạy truy vấn bên dưới. Đó là từ một lời nhận xét trong cùng một bài viết:

with src as (select to_clob('42') val from dual connect by level<=5) 
select val,ora_hash(val,7) from src order by 2; 

Đáng ngạc nhiên, vấn đề này tương tự xảy ra với dbms_sqlhash.gethash.

Các vấn đề liên quan