์ผ๋ฐ View์ ๋ฌธ์ ์

View๋ ๋ณต์กํ SELECT ๋ช ๋ น๋ฌธ์ ๊ฐ๋จํ๊ฒ ์ฟผ๋ฆฌํ๊ธฐ ์ํด SELECT ๋ฌธ์ ๊ฐ๊ณ ์๋ ์ค๋ธ์ ํธ ์ ๋๋ค. ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์์ง ์๊ณ SELECT๋ฌธ์ ์ ์ฅํด์ ํด๋น View๋ฅผ ์กฐํํ์ ๋, ์ฟผ๋ฆฌ๊ฐ ๋ณต์กํ๋ค๋ฉด ํธํ ์ง์ธ์ ์๋์ ๋ณต์กํ ์ฟผ๋ฆฌ๋ฌธ์ ์กฐํํ๋ ๊ฒ๊ณผ ๊ฐ์ต๋๋ค. ์ฆ, ์ฌ์ฉ์ ํธ์์ฑ์ ์์ง๋ง ์ฑ๋ฅ์ ์ธ ์ธก๋ฉด์์ ๋ฌธ์ ๊ฐ ๋๋ ์ํฉ์ ๋ฐ์ํฉ๋๋ค.
๋ฌธ์ ๊ฐ ๋๋ ์ํฉ์ ์๋ก ๋ค์ด ๋ณด๊ฒ ์ต๋๋ค. 3๊ฐ์ ํ ์ด๋ธ์ ์กฐ์ธํ๋ View๊ฐ ์์ต๋๋ค. ๊ทธ๋ฐ๋ฐ 3๊ฐ์ ํ ์ด๋ธ ๋ชจ๋ ๋๋์ ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ์ฌ ์ฟผ๋ฆฌ๋ฌธ์ ํตํด ๋ฐ์ดํฐ๋ฅผ ์กฐํํ๋๋ฐ ๋๋ฌด ์ค๋ ์๊ฐ์ด ๊ฑธ๋ ค ์ฑ๋ฅ์ ์ธ ๊ฐ์ ์ด ํ์ํ ์ํฉ์ด ๋ฐ์ํฉ๋๋ค. ์ด๋ฌํ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฅผ ๋ณด์ ํ๋ View์ธ Materialized View OR Sumary Table์ ์ฌ์ฉํฉ๋๋ค.
Summary Table ์ฌ์ฉ ํด๊ฒฐ๋ฒ

๋ฐ์ดํฐ์์ผ๋ก ์ธํด ์กฐ์ธ ์์ ์ ํ์ ๋ ์ค๋ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ๋ฌธ์ ๋ ๋ฏธ๋ฆฌ ์กฐ์ธ ์์ ์ ํ ๊ฒฐ๊ณผ๋ฅผ ํ ์ด๋ธ๋ก ์ ์ฅํ์ฌ ์ฟผ๋ฆฌ ์์ ์ ํ ๋ ์กฐ์ธ์ด ์๋ Summary Table์ ์กฐํํ๋ ๋ฐฉ๋ฒ์ ๋๋ค. ์ด๋ ๊ฐ์ฅ ํฐ ๋ฌธ์ ๊ฐ ๋๋ ๊ฒ์ Base Table๋ค๊ณผ Summary Table์ ๋๊ธฐํ ์์ ์ ๋๋ค. ๋๊ธฐํ์ ๋ํ ๋ฌธ์ ๋ Trigger๋ฅผ ์ฌ์ฉํด์ DML์ ๋ํ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ์ ๋ Summary Table์ ๋ณ๊ฒฝ์์ ์ ๊ฐ์ด ํด์ฃผ๋ ๋ฐฉ๋ฒ์ ๋๋ค.
์ฟผ๋ฆฌ์์ ์ ํ์๋ ์๊ฐ์ ๋จ์ถํ์ฌ ์ฑ๋ฅ์์ ์ ํด๊ฒฐํ ์ ์์ง๋ง, Application ๋จ์์ ์ถ๊ฐ์ ์ธ ์์ ์์ ์ ํด์ฃผ์ด์ผํ๋ ๋ฌธ์ ๊ฐ ๋ฐ์ํฉ๋๋ค.
Materialized View ์ฌ์ฉ ํด๊ฒฐ๋ฒ

Materialized View๋ ๋ฐ์ดํฐ๋ฅผ ๊ฐ๊ณ ์๋ View ์ ๋๋ค. ๋ง์ฐฌ๊ฐ์ง๋ก ์์ ๋ฌธ์ ๋ฅผ ํด๊ฒฐํ๊ธฐ ์ํด View์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ ์์ด ์ฟผ๋ฆฌ๋ฌธ์ ์คํํ์ ๋ ๋น ๋ฅธ ์๋๋ก ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค. Summary Table์ ์ด์ฉํ๋ ๊ฒ๊ณผ๋ ๋ค๋ฅด๊ฒ View Log๋ผ๋ ์ค๋ธ์ ํธ๋ฅผ ์ด์ฉํด์ ๋๊ธฐํ ์์ ์ ํฉ๋๋ค. ์๋ณธ๋ฐ์ดํฐ์ ์์ ๋ ๋ถ๋ถ๋ง ๊ธฐ๋กํ์ฌ ๋๊ธฐํ ์์ ์ ํฉ๋๋ค.
Materialized View๋ Optimizer๊ฐ ์คํ๊ณํ์ ์์ฑํ ๋ ์ฐธ์กฐํ์ฌ ์๋์ผ๋ก ๋น ๋ฅธ ๋ฐฉ๋ฒ์ ์ ํํฉ๋๋ค. ์ค์ต์ ํตํด์ ์์๋ณด๊ฒ ์ต๋๋ค.
Advisor๋ฅผ ์ด์ฉํ ์ค์ต
์ค์ตํ๊ฒฝ
OS : Red Hat Enterprise Linux Server release 6.10
DB : Oracle 12.1.0.2
SID : testdb
dbms_advisor.tune_mview
์ค๋ผํด์์ ์ ๊ณตํด์ฃผ๋ advisor ํจํค์ง๋ฅผ ์ด์ฉํด์ Materialized View์์ฑ ๊ฐ์ด๋๋ฅผ ํ๋ ๋ฐ์์ ์งํํ ์์ ์ ๋๋ค. ์ํ ์คํค๋ง SH๊ฐ ๊ฐ๊ณ ์๋ ํ ์ด๋ธ๋ก ์์ ์ ์งํํ๊ฒ ์ต๋๋ค.
[testdb@host01 ~]$ sqlplus / as sysdba
SYS@testdb> desc dbms_advisor

dbms_advisor.tune_mview์์ ํ์ํ ํ๋ผ๋ฏธํฐ๋ฅผ ํ์ธํ์ต๋๋ค. TASK_NAME์ IN/OUT Type์ผ๋ก ํ๋ผ๋ฏธํฐ๋ฅผ ํ๋ ์ง์ ํด์ค์ผํ๊ณ MV_CREATE_STMT์๋ Materialized View๋ฅผ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฅผ ๋ฃ์ด ๊ฐ์ด๋๋ฅผ ๋ฐ๊ฒ ์ต๋๋ค.
SYS@testdb> grant advisor to sh;
advisor ํจํค์ง๋ฅผ ์ฌ์ฉํ ์ ์๋ ๊ถํ์ sh์๊ฒ ๋ถ์ฌํด์คฌ์ต๋๋ค.
SYS@testdb> conn sh/sh
SH@testdb>
declare
tune_mv varchar2(20) := 'mview_task';
begin
dbms_advisor.tune_mview
(
task_name=>tune_mv,
mv_create_stmt=>'create materialized view c_s_mv
enable query rewrite
as
select
c.cust_id
,s.channel_id
,avg(s.amount_sold)
from customers c, sales s
where c.cust_id = s.cust_id
group by c.cust_id, s.channel_id'
);
end;
/
PL/SQL procedure successfully completed.
dmms_advisor.tune_mview๋ฅผ ์ฑ๊ณต์ ์ผ๋ก ์คํ ํ user_tune_mview ๋ทฐ๋ฅผ ํตํด ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ธํ ์ ์์ต๋๋ค.
SH@testdb> set long 10000
SH@testdb> select * from user_tune_mview;

CLOB ํ์ ์ ๊ฒฐ๊ณผ๋ฅผ ๋ณด์ฌ์ฃผ๊ธฐ ๋๋ฌธ์ long ๊ฐ์ ๋๋ํ๊ฒ ์ฃผ๊ณ ๊ฒฐ๊ณผ๋ฅผ ์กฐํํด๋ดค์ต๋๋ค. ์ ๋ด์ฉ์ ์ฐจ๋ก๋๋ก VIEW lOG์ Materialized View๋ฅผ ์์ฑํ๋ ์ฟผ๋ฆฌ๋ฅผ ์๋ ค์ค๋๋ค. alter์ ๋ํ ๋ด์ฉ์ ๋ด์ฉ์ ์ ์ธํ๊ณ create๋ถ๋ถ์ ๋ด์ฉ์ ์์๋ณด๊ธฐ ์ฝ๊ฒ ์ ๋ฆฌํ๊ณ ์คํ๊น์ง ํด๋ณด๊ฒ ์ต๋๋ค.
Materialized View ์์ฑ
SYS@testdb> grant query rewrite to sh;
SYS@testdb> grant create materialized view to sh;
์์ฑ์์ ์ด ์๋ ๊ฒฝ์ฐ ์์ ๊ถํ์ ๋ถ์ฌํด์ฃผ์ธ์.
SH@testdb> CREATE MATERIALIZED VIEW LOG ON "SH"."SALES"
WITH ROWID, SEQUENCE ("CUST_ID","CHANNEL_ID","AMOUNT_SOLD")
INCLUDING NEW VALUES;
Materialized view log created.
SH@testdb> CREATE MATERIALIZED VIEW LOG ON "SH"."CUSTOMERS"
WITH ROWID, SEQUENCE ("CUST_ID")
INCLUDING NEW VALUES;
Materialized view log created.
SH@testdb> CREATE MATERIALIZED VIEW SH.C_S_MV
REFRESH FAST WITH ROWID
ENABLE QUERY REWRITE
AS
SELECT
SH.SALES.CHANNEL_ID C1,
SH.SALES.CUST_ID C2,
SUM("SH"."SALES"."AMOUNT_SOLD") M1, COUNT("SH"."SALES"."AMOUNT_SOLD") M2,
COUNT(*) M3 FROM SH.CUSTOMERS,
SH.SALES
WHERE SH.SALES.CUST_ID = SH.CUSTOMERS.CUST_ID
GROUP BY SH.SALES.CHANNEL_ID, SH.SALES.CUST_ID;
Materialized view created.
์ฟผ๋ฆฌ๋ฅผ ํ๋์ฉ ์ดํด๋ณด๋ฉด ์กฐ์ธ์์ ์ ํ๋ ํ ์ด๋ธ์ ๋๊ธฐํ ์์ ์ ์ํ View Log ํ๋์ฉ ์์ฑํ๊ณ , Materialized View๋ฅผ ์์ฑํ๋ ์ฟผ๋ฆฌํ๋๊ฐ ์์ต๋๋ค.
๊ทธ๋ฐ๋ฐ ๋ถ์์ ์์ฒญํ MView ์์ฑ ์ฟผ๋ฆฌ๊ฐ ์กฐ๊ธ ๋ค๋ฆ ๋๋ค. Average๋ฅผ ๊ตฌํ๋ ํจ์๋ฅผ ์ฌ์ฉํ๋๋ฐ, SUM๊ณผ COUNT์ ๋ํ ์ปฌ๋ผ์ ์ด์ฉํด์ ๊ฒฐ๊ณผ๊ฐ ์์ฑ๋์๋๋ฐ ์ ์ด๋ฐ ๊ฒฐ๊ณผ๋ฅผ ๊ถํ์๊น์?
MView๋ฅผ ๋ ๋ง์ ๋ฒ์์์ Optimizer๊ฐ ์ฐธ์กฐํ๋๋ก AVGํจ์๋ฅผ SUM๊ณผ COUNT๋ก ๋๋ ๊ฒ ์ ๋๋ค. ์ฟผ๋ฆฌ๊ฐ AVG๊ฐ ์๋ SUM์ด๋ COUNT์ ๋ํ ์์ ์ด ๋ค์ด์์ ๋๋ Optimizer๊ฐ ์ฐธ์กฐํ๋๋ก ํ ์ ์์ต๋๋ค. AVGํจ์๋ฅผ ์ฌ์ฉํด์ MView๋ฅผ ์์ฑํ ์ ์์ง๋ง, ๊ทธ๋ ๊ฒ๋๋ฉด SUM์ด๋ COUNT์ ๋ํ ์์ ์ด ๋ค์ด์์ ๋ ์ฑ๋ฅ์ ๋์ด๊ธฐ ์ํด์ ๋ค์ MView๋ฅผ ๋ง๋๋ ๋ถํธํจ์ด ์๊ธฐ ๋๋ฌธ์ ๋ถ๋ฆฌํด์ ํ๋ฒ์ MView๋ฅผ ์์ฑํ๋๋ก ๊ถ์ฅํ๋ ๊ฒ์ ๋๋ค. Optimizer์์ ์คํ ๊ณํ์ ๋ง๋ค ๋ Query์ Re-Write ์์ ์ ์งํํ์ฌ SUM๊ณผ COUNT๊ฒฐ๊ณผ๋ฅผ ๊ฐ๊ณ AVG์ ๊ฐ์ ์ฐ์ถํ ์ ์์ต๋๋ค.
์กฐํ ํ์ธ ์์
SH@testdb> set autot trace explain
์ฟผ๋ฆฌ๋ฅผ ์คํํ์ ๋ ์คํ๊ณํ๋ง ํ์ธํ๊ธฐ ์ํด ์ค์ ํฉ๋๋ค.
SH@testdb>
select
c.cust_id
,s.channel_id
,avg(s.amount_sold)
from customers c, sales s
where c.cust_id = s.cust_id
group by c.cust_id, s.channel_id;

๋ทฐ์ ์ฟผ๋ฆฌ๋ก ์กฐํํ์ ๋ MView๋ฅผ ์ฌ์ฉํด์ ์กฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
SH@testdb>
select
c.cust_id
,sum(s.amount_sold)
from customers c, sales s
where c.cust_id = s.cust_id
group by c.cust_id;

sum์ผ๋ก๋ง ์กฐํํ์๋๋ MView๋ฅผ ์กฐํํ๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค. ์์ฑ์ฟผ๋ฆฌ์ ๋์ผํ์ง๋ ์์, ํด๋น ๋ทฐ์์ ํ๋ฒ๋ ๊ฑธ๋ฌ๋ด๋ ์์ ์ ํ๋ ๊ฒ๋ ํ์ธ ๊ฐ๋ฅํฉ๋๋ค.
SH@testdb> set autot off
SH@testdb>
select
segment_name
,segment_type
from user_segments
where segment_name = 'C_S_MV';

์ธ๊ทธ๋จผํธ๋ฅผ ์กฐํํ์๋ VIEW์๋ ๋ค๋ฅด๊ฒ TABLE Type์ผ๋ก ์กฐํ๊ฐ ๋๋ ๊ฒ์ ํ์ธํ ์ ์์ต๋๋ค.
Materialized View ์์ฑ ๋ฌธ๋ฒ
์ค์ต์ Advisor๋ฅผ ์ด์ฉํด์ ๊ถ์ฅ๋๋ ์์ฑ ์ฟผ๋ฆฌ๋ฅผ ๋ฐ์์ ์งํํ์ต๋๋ค. Materialized View๋ฅผ ์์ฑํ ๋ ์ฌ์ฉ๋๋ ์ต์ ๋ค์ ๋ช๊ฐ์ง ์์๋ณด๊ฒ ์ต๋๋ค.
create materialized view <๋ทฐ๋ช
>
build immediate
refresh [on demand | on commit]
[complete | fast | force | never]
enable query rewrite
as
<์๋ธ์ฟผ๋ฆฌ>;
build immediate
MView ์์ฑ ํ๋ฉด์ ํด๋น ๋ฐ์ดํฐ๋ฅผ MView์ ์ ์ฅ
on demand
dbms_mview ํจํค์ง๋ฅผ ์ด์ฉํด์ ๋๊ธฐํ ์์
on commit
commit ๋ช ๋ น ์ฌ์ฉ์ ์๋ ๋๊ธฐํ ์์
complete
๋ชจ๋ ๋ฐ์ดํฐ๊ฐ ๋๊ธฐํ
fast
์์ ๋ ๋ฐ์ดํฐ๋ง ๋๊ธฐํ ๋ฉ๋๋ค. ์ด ๋ฐฉ๋ฒ์ ์ฌ์ฉํ๊ธฐ ์ํด์ Materialized View Log ์ค๋ธ์ ํธ ์์์ด ํ์ํฉ๋๋ค.
force
fast ๊ธฐ์ ๊ณผ complete ๋ณํ ์ฌ์ฉ
never
๋๊ธฐํ ํ์ง ์์
enable query rewrite
์ด ์ต์ ์ ํ์๋ก ์ฌ์ฉํ๋ ๊ฒ์ ๊ถ์ฅํฉ๋๋ค. ์ฟผ๋ฆฌ ์คํํ์๋ Optimizer๊ฐ ํด๋น MView๋ฅผ ์ฐธ์กฐํ์ฌ Query Re-Write์ ํ ์ ์๋๋ก ํฉ๋๋ค.
๋๊ธ