物化视图 - PCTFREE 和 PCTUSED
Materialized View - PCTFREE and PCTUSED
我有一些关于优化物化视图 (MV) 的问题:
在下面的教程中,建议将 PCTFREE 和 PCTUSED 设置为 0 或 99:
Note: If a materialized view is complete refreshed, then set it's
PCTFREE to 0 and PCTUSED to 99 for maximum efficiency.
--> https://satya-dba.blogspot.com/2009/07/materialized-views-oracle.html
第一个问题:
这个建议正确吗? PCTFREE 0 和 PCTUSED 99 这两个参数是否应该相应设置?
更新MV的具体流程是怎样的?
创建 MV(相应设置 PCTFREE 0 和 PCTUSED 99):
CREATE MATERIALIZED VIEW "SYSK85"."CMVF_01_SK85_BESTAND_2019" ("BRNR", "LEAT", "TLRTAL", "LEATSO", "STAND_DATUM", "VOAT", "AQEQ", "ELAT", "ELDT", "VSKN", "VTKZ", "ANZAHL")
PCTFREE 0 PCTUSED 99
NOCOMPRESS LOGGING
NO INMEMORY
BUILD IMMEDIATE
USING INDEX
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE
AS (
select BRNR, LEAT, TLRTAL, LEATSO, STAND_DATUM, VOAT, AQEQ, ELAT, ELDT, VSKN, VTKZ, count(*) as ANZAHL
from CVF_SK85_BESTAND_2019 GROUP BY BRNR, LEAT, TLRTAL, LEATSO, STAND_DATUM, VOAT, AQEQ, ELAT, ELDT, VSKN, VTKZ
);
第二个问题:
MV的Create是否应该设置PCTFREE 0和PCTUSED 99这两个参数?
但是如果MV更新了呢?
EXEC DBMS_MVIEW.REFRESH('CMVF_01_SK85_BESTAND_2019', 'C', atomic_refresh=>FALSE);
PCTFREE 和 PCTUSED 这两个参数是否应该在更新后再次显式重置(以便数据库可以重新组织数据 - 如有必要)?或者没有必要?
非常感谢
亲切的问候
乔治
重点是限制到MV
的完全刷新。
此类MV
被truncate
和insert
或delete
+insert
刷新,所以建议 归结为一个 琐碎的 声明,即您不应该为 未来更新 保留 space ,这将在完全刷新时更新(PCTFREE = 0
).
这将导致 MV 的大小减小。
PCTUSED
在这种情况下扮演 IMO 没有角色 因为没有 后续插入 .
这两个参数在使用 ALTER TABLE
明确更改之前一直有效。
总结
如果您不确定刷新策略,我绝不会触及这些参数。
如果您知道您只进行全表刷新 和,那么您会进行很多全表扫描[= MV
上的 50=] - 您可能会看到 优化效果 。在 OLTP
上进行正常的 OLTP
索引访问和嵌套循环连接时,您几乎看不出有什么不同。
我有一些关于优化物化视图 (MV) 的问题:
在下面的教程中,建议将 PCTFREE 和 PCTUSED 设置为 0 或 99:
Note: If a materialized view is complete refreshed, then set it's PCTFREE to 0 and PCTUSED to 99 for maximum efficiency.
--> https://satya-dba.blogspot.com/2009/07/materialized-views-oracle.html
第一个问题:
这个建议正确吗? PCTFREE 0 和 PCTUSED 99 这两个参数是否应该相应设置?
更新MV的具体流程是怎样的?
创建 MV(相应设置 PCTFREE 0 和 PCTUSED 99):
CREATE MATERIALIZED VIEW "SYSK85"."CMVF_01_SK85_BESTAND_2019" ("BRNR", "LEAT", "TLRTAL", "LEATSO", "STAND_DATUM", "VOAT", "AQEQ", "ELAT", "ELDT", "VSKN", "VTKZ", "ANZAHL")
PCTFREE 0 PCTUSED 99
NOCOMPRESS LOGGING
NO INMEMORY
BUILD IMMEDIATE
USING INDEX
REFRESH FORCE ON DEMAND
ENABLE QUERY REWRITE
AS (
select BRNR, LEAT, TLRTAL, LEATSO, STAND_DATUM, VOAT, AQEQ, ELAT, ELDT, VSKN, VTKZ, count(*) as ANZAHL
from CVF_SK85_BESTAND_2019 GROUP BY BRNR, LEAT, TLRTAL, LEATSO, STAND_DATUM, VOAT, AQEQ, ELAT, ELDT, VSKN, VTKZ
);
第二个问题:
MV的Create是否应该设置PCTFREE 0和PCTUSED 99这两个参数?
但是如果MV更新了呢?
EXEC DBMS_MVIEW.REFRESH('CMVF_01_SK85_BESTAND_2019', 'C', atomic_refresh=>FALSE);
PCTFREE 和 PCTUSED 这两个参数是否应该在更新后再次显式重置(以便数据库可以重新组织数据 - 如有必要)?或者没有必要?
非常感谢
亲切的问候
乔治
重点是限制到MV
的完全刷新。
此类MV
被truncate
和insert
或delete
+insert
刷新,所以建议 归结为一个 琐碎的 声明,即您不应该为 未来更新 保留 space ,这将在完全刷新时更新(PCTFREE = 0
).
这将导致 MV 的大小减小。
PCTUSED
在这种情况下扮演 IMO 没有角色 因为没有 后续插入 .
这两个参数在使用 ALTER TABLE
明确更改之前一直有效。
总结
如果您不确定刷新策略,我绝不会触及这些参数。
如果您知道您只进行全表刷新 和,那么您会进行很多全表扫描[= MV
上的 50=] - 您可能会看到 优化效果 。在 OLTP
上进行正常的 OLTP
索引访问和嵌套循环连接时,您几乎看不出有什么不同。