2010-01-08 11 views
10

Tôi đã một cái nhìn cụ thể hóa được xác định theo cách này:Cập nhật cụ thể hóa quan điểm khi bàn urderlying thay đổi

CREATE MATERIALIZED VIEW M_FOO 
REFRESH COMPLETE ON COMMIT 
AS 
    SELECT FOO_ID, BAR 
    FROM FOO 
    WHERE BAR IS NOT NULL 
    GROUP BY FOO_ID, BAR 
/

COMMENT ON MATERIALIZED VIEW M_FOO IS 'Foo-Bar pairs'; 

tôi đã viết như là một loại bộ nhớ cache: bảng mã nguồn là rất lớn nhưng số lượng các cặp khác nhau là khá nhỏ. Tôi cần những cặp đó để làm cho chúng được gắn kết với các bảng khác. Cho đến nay rất tốt: nó hoàn toàn tốc độ truy vấn.

Nhưng tôi muốn đảm bảo rằng chế độ xem không chứa dữ liệu lỗi thời. Bảng bên dưới được sửa đổi bốn hoặc năm lần mỗi tháng nhưng tôi không nhất thiết phải biết khi nào. Tôi hiểu rằng một khung nhìn vật hoá có thể được định nghĩa để nó cập nhật khi các bảng nguồn thay đổi. Tuy nhiên, các tài liệu nhận được khá phức tạp.

  1. Cú pháp chính xác nào tôi cần phải sử dụng ?

  2. Tôi có cần tạo một bản ghi nhật ký xem được thực hiện không?

  3. Sự khác nhau giữa nhanh và làm mới hoàn toàn là gì?

Trả lời

18

Để đặt câu hỏi của bạn theo thứ tự ngược lại

Làm mới nhanh còn được gọi là làm mới gia tăng. Điều đó sẽ cho bạn manh mối về sự khác biệt. Một làm mới COMPLETE xây dựng lại toàn bộ MVIEW từ đầu, trong khi việc làm mới nhanh chỉ áp dụng các thay đổi từ DML xuất hiện đối với các bảng nạp.

Để thực hiện làm mới nhanh, bạn cần có MVIEW LOG phù hợp.

Đối với các cú pháp, cũng đây là những điều cơ bản:

SQL> create materialized view log on emp 
    2 with rowid, primary key, sequence (deptno, job) 
    3 including new values 
    4/

Materialized view log created. 

SQL> create materialized view emp_mv 
    2 refresh fast on commit 
    3 as 
    4 select deptno, job from emp 
    5 group by deptno, job 
    6/

Materialized view created. 

SQL> 

Mệnh ON COMMIT nghĩa là MVIEW được làm mới transactionally (như trái ngược với ON DEMAND đó là làm mới thường xuyên với số lượng lớn). Các mệnh đề REFRESH chỉ định có áp dụng làm mới gia tăng hoặc hoàn toàn hay không. Có một số loại truy vấn buộc sử dụng làm mới COMPLETE, mặc dù những điều này dường như giảm dần theo từng phiên bản mới của Oracle.

Một test nhanh để thấy rằng nó hoạt động ...

SQL> select * from emp_mv 
    2 order by deptno, job 
    3/

    DEPTNO JOB 
---------- --------- 
     10 MANAGER 
     10 PRESIDENT 
     10 SALES 
     20 ANALYST 
     20 CLERK 
     20 MANAGER 
     30 CLERK 
     30 MANAGER 
     30 SALESMAN 
     40 CLERK 
     40 DOGSBODY 

11 rows selected. 

SQL> 

Làm thế nào về một kỷ lục mới?

SQL> insert into emp (empno, ename, deptno, job) 
    2 values (6666, 'GADGET', 40, 'INSPECTOR') 
    3/

1 row created. 

SQL> commit 
    2/

Commit complete. 

SQL> select * from emp_mv 
    2 order by deptno, job 
    3/

    DEPTNO JOB 
---------- --------- 
     10 MANAGER 
     10 PRESIDENT 
     10 SALES 
     20 ANALYST 
     20 CLERK 
     20 MANAGER 
     30 CLERK 
     30 MANAGER 
     30 SALESMAN 
     40 CLERK 
     40 DOGSBODY 

12 rows selected. 

SQL> 

Bạn có thể tìm thêm chi tiết về cú pháp trong the SQL Reference. Nó cũng đáng đọc Materialized View chapter in the Data Warehousing Guide.

+0

Cảm ơn bạn, tôi nghĩ rằng cuối cùng tôi đã có khái niệm. Phần ON COMMIT cho phép cập nhật và phần REFRESH tinh chỉnh phương thức. Tôi chỉ cần nhật ký xem được thực hiện để làm mới nhanh. –

+0

Kết quả cho biết 12 hàng được chọn, nhưng đếm bằng tay chỉ có kết quả trong 11 ... –

6

Làm mới nhanh sẽ chỉ chèn/cập nhật/xóa dữ liệu đã thay đổi vào chế độ xem vật chất. Quá trình làm mới hoàn toàn sẽ làm trống chế độ xem vật hoá và sau đó sao chép qua tất cả các hàng.

"trên cam kết" có nghĩa là chế độ xem vật chất sẽ được làm mới bất cứ khi nào thay đổi được thực hiện trong bảng chính. Vì vậy, cú pháp hiện tại của bạn sẽ cực kỳ kém hiệu quả. Mỗi khi ai đó thay đổi bất kỳ hàng nào trong foo, m_foo sẽ bị cắt bớt và sau đó mọi hàng trong bảng foo sẽ được chèn vào.

Bạn có thể làm tốt hơn với làm mới nhanh, trong đó chỉ các hàng được sửa đổi trong foo sẽ được gửi tới m_foo. Điều đó mang lại cho bạn tính nhất quán mà không cần nhiều chi phí.

tạo nhật ký xem được thực hiện trên foo bằng khóa chính; - giả sử bạn có khóa chính, bạn nên tạo chế độ xem materialized m_foo làm mới nhanh trên cam kết như \;

Có một số tinh chỉnh bổ sung với các khoản trợ cấp và từ đồng nghĩa nếu bạn đang sử dụng liên kết db hoặc lược đồ sở hữu foo không phải là công ty sở hữu m_foo.

+0

Câu trả lời của bạn cũng tuyệt vời nhưng tôi chỉ có thể chọn một câu trả lời. Cảm ơn bạn. –

+0

nếu nguồn là chế độ xem thay vào đó, nó có hỗ trợ làm mới nhanh không? –