2016-08-05 15 views
5

Trên Oracle 11g, tôi đang cố gắng tạo một chế độ xem vật hoá với FAST REFRESH ON COMMIT có mệnh đề là HAVING.Chế độ xem được làm mới nhanh với mệnh đề HAVING?

Các Database Data Warehousing Guide nói:

General Restrictions on Fast Refresh

The defining query of the materialized view is restricted as follows:

  • It cannot contain a HAVING clause with a subquery.

Nhưng nếu tôi thêm HAVING count(*)>1 (lưu ý: không subquery) đến một cách khác làm việc cụ thể hóa quan điểm, tôi nhận được lỗi này:

ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view

dbms_mview.explain_mview() nói:

REFRESH_FAST     N 
REFRESH_FAST_AFTER_INSERT  N 2011 a HAVING clause is present 

Lệnh thực tế:

SQL> create materialized view mv1 refresh fast on commit as 
    2  select UserId, count(*) from USERS group by UserId; 

Materialized view created. 

SQL> DROP MATERIALIZED VIEW mv1; 

Materialized view dropped. 

SQL> create materialized view mv1 refresh fast on commit as 
    2  select UserId, count(*) from USERS group by UserId 
    3   having count(*)>1; -- the only difference 
    having count(*)>1 
        * 
ERROR at line 5: 
ORA-12054: cannot set the ON COMMIT refresh attribute for the materialized view 

Lưu ý: Nhật ký xem vật liệu được tạo (thậm chí không phải ví dụ đầu tiên sẽ hoạt động).

Tại sao nó không hoạt động? Có ai biết một ví dụ MV với một mệnh đề HAVING? Vì vậy, ít nhất tôi có thể bắt đầu từ đó (tôi googled nhưng tôi không tìm thấy).

Lưu ý2: Lý do tôi muốn HAVING là giảm số lượng hàng trong chế độ xem từ hàng nghìn hoặc thậm chí là triệu thành chỉ một vài. Để lưu trữ (và có thể đạt được hiệu suất).

PS: Phiên bản cơ sở dữ liệu Oracle chính xác được sử dụng: 11.2.0.3.0

+0

@GordonLinoff - chức năng được ghi lại không hoạt động với mệnh đề HAVING ** với truy vấn phụ **. Câu hỏi có ý nghĩa hoàn hảo - OP * tuyên bố rằng anh không có truy vấn phụ trong định nghĩa MV của mình. Cho dù anh ta có hay không là một câu hỏi khác - anh ấy đã đăng một cái gì đó khác với định nghĩa MV thực tế của mình - nhưng câu hỏi có ý nghĩa hoàn hảo. – mathguy

+0

@mathguy Các ví dụ trong câu hỏi tạo lại vấn đề và chúng không có truy vấn phụ. Tôi sẽ xóa đề cập đến truy vấn "khác" được đề cập để tránh nhầm lẫn. (mặc dù sau đó ai đó sẽ nói ví dụ đơn giản được đăng làm cho không có ý nghĩa kinh doanh ...). –

+0

Vâng, trong khi chờ đợi, Gordon rút lại câu hỏi/phản đối bài đăng của bạn, vì vậy đó là điểm tranh luận. Tôi vừa mới cài đặt phiên bản Enterprise trên một trong các máy tính của tôi (tôi là một người đam mê học tập cho bản thân mình) - câu hỏi của bạn là tạo động lực cho ngày hôm nay, hãy thử chính xác những gì bạn mô tả và xác nhận nó. Nó được biết rằng đôi khi ngay cả các tài liệu là sai, chỉ cần giữ cho rằng trong tâm trí. – mathguy

Trả lời

2

Có, tài liệu dường như không chính xác.

Để giải quyết sự cố, bạn có thể thử triển khai các chế độ xem được thực hiện lồng nhau.

CREATE MATERIALIZED VIEW mv1 
REFRESH FAST ON COMMIT 
AS 
SELECT col1, 
     COUNT(col1) count_col1 
FROM test_table 
GROUP BY col1 

ALTER MATERIALIZED VIEW mv1 ADD CONSTRAINT pk_mv1 PRIMARY KEY (col1) 

CREATE MATERIALIZED VIEW LOG ON mv1 WITH PRIMARY KEY; 

CREATE MATERIALIZED VIEW MV2 
REFRESH FAST ON COMMIT AS 
SELECT col1, 
     count_col1 
FROM mv1 
WHERE count_col1 > 1 
+0

Có, công trình này, nhưng mục tiêu của tôi là không có những hàng được lưu trữ trên đĩa. Tôi sẽ cập nhật câu hỏi để phản ánh điều đó. –

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