1.创建物化视图
alter session set container=pdb;
grant create materialized view to scott;
创建语法解释
1. "创建 build" 的方式
(1) 'immediate':立即生效,默认。
(2) 'deferred' : 延迟至第一次 refresh 时才生效
2. "刷新 refresh" 的方式
(1) force :默认。如果可以 '快速刷新' 就 '快速刷新',否则执行 '完全刷新'
(2) fast :'快速刷新'。只刷新 '增量' 部分(前提:创建 '物化日志')
(3) complete: '完全刷新'。刷新时更新全部数据,包括视图中已经生成的原有数据
(4) never : 从不刷新
3. "触发" (请注意,on demand 中,才需要设置 '开始时间' 和 '间隔时间') -- 冲突
(1) on commit:基表有 commit 动作时,刷新刷图("不能跨库执行")
(2) on demand:在需要时刷新
[1] 根据后面设定的 '开始时间' 和 '结束时间' 进行刷新
[2] 手动调用 dbms_mview 包中的过程进行刷新
4. 基于基表的 primary key 或 rowid 创建
(1) 如果是基于 rowid,则不能对基表执行 '分组函数'、'多表连接' 等需要把
多个 rowid 合成一行的操作(理由很简单:到底以哪个 rowid 为准呢?)
5. enable query rewrite 启用查询重写(请注意, '开始时间' 和 '间隔时间' 不支持)-- 冲突
(1) 不支持的理由也很简单。
所谓的 '重写',就是讲对基表的查询定位到物化视图上,
而 '开始时间' 和 '间隔时间' 会造成物化视图上部分数据延迟,所以,不能重写
(2) 参数: query_rewrite_enabled (可通过 v$parameter 视图查询)
测试延时刷新
scott用户创建表
CREATE TABLE person_info (
person_no VARCHAR2(10),
NAME VARCHAR2(30),
create_date DATE
);
INSERT INTO person_info(person_no, NAME, create_date) VALUES('001', '瑶瑶', SYSDATE);
INSERT INTO person_info(person_no, NAME, create_date) VALUES('002', '倩倩', SYSDATE);
COMMIT;
创建1分钟刷新一次物化视图
CREATE MATERIALIZED VIEW mvw_person_info
BUILD IMMEDIATE
REFRESH FORCE
ON DEMAND
START WITH SYSDATE
NEXT SYSDATE + 1/1440
AS
SELECT pi.person_no,
pi.name,
pi.create_date
FROM person_info pi;
测试语句:先查询,等个十几秒在执行 insert,再等 1 分钟左右,观察前后数据
SELECT * FROM mvw_person_info;
查询物化视图
1. 查询物化视图,非 DBA 用户,请查询 all_mviews 或 user_mviews
SELECT *
FROM dba_mviews t
WHERE t.owner = 'SCOTT'
AND t.mview_name = 'MVW_PERSON_INFO';
2. 查询一般视图
SELECT * FROM dba_views;
修改物化视图
alter materialized view 物化视图名
refresh [force | fast | complete | never]
on [commit | demand]
start with 开始时间
next 间隔时间
删除物化视图
drop materialized view 物化视图名;
手动刷新
BEGIN
dbms_mview.refresh(list => '视图名',
method => 'fast', -- 增量刷新
refresh_after_errors => TRUE);
END;
2.创建物化视图日志
1. 适用于 'fast' 增量刷新
2. with primary key
3. with rowid
测试 with primary key
CREATE TABLE student_info (
student_no VARCHAR2(10),
NAME VARCHAR2(30)
);
ALTER TABLE student_info ADD CONSTRAINT pk_student_info_student_no
PRIMARY KEY(student_no);
创建物化视图日志
create materialized view log on student_info with primary key
[including new values];
-- including new values 允许 Oracle 将数据库 新、旧值都保存在物化视图日志中
-- 即 update 前 和 update 后都保存,按需设置即可
插入一条数据
查询物化视图日志信息
SELECT * FROM all_mview_logs;
SELECT * FROM mlog$_student_info;
创建 'fast' 增量模式的物化视图条件:
(1) select 语句中包含到的每一个表都需要创建 '物化日志'
(2) select 中必须包含涉及到所有表的 'rowid'
(3) select 中必须明确具体的列,不允许使用 '*'
创建表
CREATE TABLE test_a (
a_id VARCHAR(10),
NAME VARCHAR2(30)
);
ALTER TABLE test_a ADD CONSTRAINT pk_test_a_a_id PRIMARY KEY(a_id);
CREATE TABLE test_b (
b_id VARCHAR(10),
NAME VARCHAR2(30)
);
ALTER TABLE test_b ADD CONSTRAINT pk_test_b_b_id PRIMARY KEY(b_id);
创建物化视图日志
create materialized view log on test_a with rowid including new values;
create materialized view log on test_b with rowid including new values;
fast 增量测试
创建表
CREATE MATERIALIZED VIEW mvw_test_ab
REFRESH FAST WITH ROWID
ON DEMAND
START WITH SYSDATE
NEXT SYSDATE + 3/1440
AS
SELECT t1.a_id,
t1.name a_name,
t1.rowid a_rowid,
t2.b_id,
t2.name b_name,
t2.rowid b_rowid
FROM test_a t1, test_b t2
WHERE t1.a_id = t2.b_id;
查询此时没有数据
SELECT * FROM mvw_test_ab;
SELECT * FROM all_mview_logs;
SELECT * FROM mlog$_test_a;
SELECT * FROM mlog$_test_b;
插入数据
INSERT INTO test_a(a_id, NAME) VALUES('1', 'a1');
INSERT INTO test_a(a_id, NAME) VALUES('2', 'a2');
INSERT INTO test_a(a_id, NAME) VALUES('3', 'a3');
INSERT INTO test_b(b_id, NAME) VALUES('1', 'b1');
INSERT INTO test_b(b_id, NAME) VALUES('2', 'b2');
INSERT INTO test_b(b_id, NAME) VALUES('3', 'b3');
COMMIT;
在次查询有数据
SQL> SELECT * FROM mlog$_test_b;
M_ROW$$
--------------------------------------------------------------------------------
SNAPTIME$ D O CHANGE_VECTOR$$ XID$$
--------- - - -------------------- ----------
AAASHJAAaAAAAEdAAA
01-JAN-00 I N FE 1.9704E+15
AAASHJAAaAAAAEdAAB
01-JAN-00 I N FE 1.9704E+15
AAASHJAAaAAAAEdAAC
01-JAN-00 I N FE 1.9704E+15
3.进行日志挖掘
查看当前日志
SQL> select max(SEQUENCE#) from v$archived_log;
MAX(SEQUENCE#)
--------------
187
日志切换
alter system archive log current;
@$ORACLE_HOME/rdbms/admin/dbmslm.sql
@$ORACLE_HOME/rdbms/admin/dbmslmd.sql
这两个脚本必须均以 DBA 用户身份运行。其中第一个脚本用来创建 DBMS_LOGMNR 包,该包用来分析日志文件。第二个脚本用来创建 DBMS_LOGMNR_D 包,该包用来创建数据字典文件。
创建完毕后将包括如下过程和视图:
|
类型 |
过程名 |
用途 |
|---|---|---|
|
过程 |
Dbms_logmnr_d.build |
创建一个数据字典文件 |
|
过程 |
Dbms_logmnr.add_logfile |
在类表中增加日志文件以供分析 |
|
过程 |
Dbms_logmnr.start_logmnr |
使用一个可选的字典文件和前面确定要分析日志文件来启动 LogMiner |
|
过程 |
Dbms_logmnr.end_logmnr |
停止 LogMiner 分析 |
|
视图 |
V$logmnr_dictionary |
显示用来决定对象 ID 名称的字典文件的信息 |
|
视图 |
V$logmnr_logs |
在 LogMiner 启动时显示分析的日志列表 |
|
视图 |
V$logmnr_contents |
LogMiner 启动后,可以使用该视图在 SQL 提示符下输入 SQL 语句来查询重做日志的内容 |
LogMiner 工具实际上是由两个新的 PL/SQL 内建包( (DBMS_LOGMNR 和 DBMS_LOGMNR_D)和四个 V$动态性能视图(视图是在利用过程 DBMS_LOGMNR.START_LOGMNR启动 LogMiner 时创建)组成。在使用 LogMiner 工具分析 redo log 文件之前,可以使用DBMS_LOGMNR_D 包将数据字典导出为一个文本文件。该字典文件是可选的,但是如果没有它, LogMiner 解释出来的语句中关于数据字典中的部分(如表名、列名等)和数值都将是 16进制的形式,我们是无法直接理解的。例如,下面的 sql 语句:
INSERT INTO dm_dj_swry (rydm, rymc) VALUES (00005, '张三');
insert into Object#308(col#1, col#2) values (hextoraw('c30rte567e436'),hextoraw('4a6f686e20446f65'));
CREATE DIRECTORY utlfile AS '/home/oracle/LOGMNR';
alter system set utl_file_dir='/home/oracle/LOGMNR' scope=spfile;
这个方式放弃等后续问问别人
直接分析方式
exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.new);
exec dbms_logmnr.add_logfile(logfilename => '/home/oracle/arch11/1_189_1106805210.dbf',options=>dbms_logmnr.addfile);
exec dbms_logmnr.start_logmnr(options => dbms_logmnr.dict_from_online_catalog);
set linesize 200
alter session set nls_date_format='yyyy-mm-dd hh24:mi:ss';
select timestamp,commit_timestamp,sql_redo from v$logmnr_contents where table_name like '%PER%' and operation='INSERT';
查看分析结果如下
2023-02-14 21:56:22
insert into "SCOTT"."PERSON_INFO"("PERSON_NO","NAME","CREATE_DATE") values ('003','hrz',TO_DATE('2023-02-14 21:56:21', 'yyyy-mm-dd hh24:mi:ss'));
注意:logmnior最大表字符支持最大30,字段也是字符最大30个
The tables or column names selected for mining must not exceed 30 characters.
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits
关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。
使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta
我对最新版本的Rails有疑问。我创建了一个新应用程序(railsnewMyProject),但我没有脚本/生成,只有脚本/rails,当我输入ruby./script/railsgeneratepluginmy_plugin"Couldnotfindgeneratorplugin.".你知道如何生成插件模板吗?没有这个命令可以创建插件吗?PS:我正在使用Rails3.2.1和ruby1.8.7[universal-darwin11.0] 最佳答案 随着Rails3.2.0的发布,插件生成器已经被移除。查看变更日志here.现在
我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当
我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。
我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere
如何使用RSpec::Core::RakeTask初始化RSpecRake任务?require'rspec/core/rake_task'RSpec::Core::RakeTask.newdo|t|#whatdoIputinhere?endInitialize函数记录在http://rubydoc.info/github/rspec/rspec-core/RSpec/Core/RakeTask#initialize-instance_method没有很好的记录;它只是说:-(RakeTask)initialize(*args,&task_block)AnewinstanceofRake
Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/