物化视图的修改语句
ALTER MATERIALIZED VIEW
包含了
CONSIDER FRESH
语句。通过这个语句可以使得数据库认为物化视图已经是刷新后的状态。同时可以使得这个物化视图对于查询重新生效。
CONSIDER FRESH语句的另一个主要功能就是使得物化视图可以继续为查询重写所使用。
查询重新包括三个级别的参数:ENFORCED、TRUSTED和STALE_TOLERATED。对于一个无法刷新到FRESH状态的物化视图,只有STALE_TOLERATED级别的查询重新可以考虑读取这个物化视图,而使用了CONSIDER FRESH语句后,在TRUSTED级别Oracle在查询重写的时候也可以使用这个物化视图:
SQL> DROP TABLE T PURGE;
表已删除。
SQL> DROP MATERIALIZED VIEW MV_T;
实体化视图已删除。
SQL> CREATE TABLE T
2 (ID NUMBER,
3 NAME VARCHAR2(30),
4 TYPE VARCHAR2(18),
5 CREATE_DATE DATE);
表已创建。
SQL> INSERT INTO T
2 SELECT ROWNUM,
3 OBJECT_NAME,
4 OBJECT_TYPE,
5 CREATED
6 FROM ALL_OBJECTS;
已创建55680行。
SQL> COMMIT;
提交完成。
SQL> CREATE MATERIALIZED VIEW LOG ON T
2 WITH ROWID, SEQUENCE (TYPE)
3 INCLUDING NEW VALUES;
实体化视图日志已创建。
SQL> CREATE MATERIALIZED VIEW MV_T
2 REFRESH FAST
3 ENABLE QUERY REWRITE
4 AS SELECT TYPE, COUNT(*)
5 FROM T
6 GROUP BY TYPE;
实体化视图已创建。
首先建立了测试的物化视图,然后检查一下查询重写的配置:
SQL> SHOW PARAMETER QUERY_REWRITE
NAME TYPE VALUE
query_rewrite_enabled string TRUE
query_rewrite_integrity string enforced
SQL> @?/rdbms/admin/utlxrw
表已创建。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 过程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01151: 已重写查询
QSM-01209: 已通过实体化视图 MV_T, 采用文本匹配算法进行了查询重写
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截断。
SQL> INSERT INTO T
2 VALUES (1, 'TEST', 'T', SYSDATE);
已创建 1 行。
SQL> COMMIT;
提交完成。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 过程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01150: 未重写查询
QSM-01029: 实体化视图 MV_T 在 ENFORCED 完整性模式中已过时
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = STALE_TOLERATED;
会话已更改。
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截断。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 过程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01151: 已重写查询
QSM-01209: 已通过实体化视图 MV_T, 采用文本匹配算法进行了查询重写
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截断。
SQL> ALTER SESSION SET QUERY_REWRITE_INTEGRITY = TRUSTED;
会话已更改。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 过程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
QSM-01150: 未重写查询
QSM-01031: 实体化视图 MV_T 在 TRUSTED 完整性模式中已过时
可以看到,和前面分析的一样,一旦物化视图的数据和基表中的最新的数据存在差异,这个物化视图在TRUSTED模式下无法被查询重写所使用。
下面使用CONSIDER FRESH语句:
SQL> TRUNCATE TABLE REWRITE_TABLE;
表被截断。
SQL> ALTER MATERIALIZED VIEW MV_T
2 CONSIDER FRESH;
实体化视图已更改。
SQL> EXEC DBMS_MVIEW.EXPLAIN_REWRITE('SELECT TYPE, COUNT(*) FROM T GROUP BY TYPE')
PL/SQL 过程已成功完成。
SQL> SELECT MESSAGE
2 FROM REWRITE_TABLE;
MESSAGE
<?xml version="1.0" encoding="utf-8"?>
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003"><Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<PropertyGroup>
<VName>{BranchName}_Release</VName>
<WebAppOutput>..\WebAppPublished</WebAppOutput>
<WebSiteOutput>..\WebSitePublished</WebSiteOutput>
</PropertyGroup><ItemGroup>
<MySourceFiles Include="web\**\*.dll;web\**\*.aspx;web\**\*.js;web\**\*.css;web\**\*.jpg;web\**\*.config;web\**\*.gif;web\**\*.config;web\**\*.png;web\**\*.ascx;"/>
</ItemGroup> <Target Name="build">
<MsBuild Projects="{SlnName}" Targets="$(BuildCmd)" />
</Target>
</Project>
调用winrar压缩打包部分代码
代码会通过根据注册表里是否有winrar安装信息,然后找到路径进行调用。 /// <summary>
/// 生成Zip
/// </summary>
/// <param name="path">文件夹路径</param>
/// <param name="rarPath">生成压缩文件的路径</param>
/// <param name="rarName">生成压缩文件的文件名</param>
/// <param name="ignore">忽略的文件</param>
public static void CompressRar(String path,www.chenhaiyulp.cn String rarPath, String rarName,string ignore)
{
try
{
String winRarPath = null;
if (!ExistsRar(out winRarPath)) return;//验证WinRar是否安装。 //var pathInfo = String.Format("a -afzip -m0 -ep1 \"{0}\" \"{1}\"", rarName, path);
var pathInfo = String.Format(www.baihuidengLu.com"a {2} -k -r -s -ep1 \"{0}\" \"{1}\"", rarName, path,ignore); #region WinRar 用到的命令注释
//[a] 添加到压缩文件
//afzip 执行zip压缩方式,方便用户在不同环境下使用。(取消该参数则执行rar压缩)
//-m0 存储 添加到压缩文件时不压缩文件。共6个级别【0-5】,值越大效果越好,也越慢
//ep1 依名称排除主目录(生成的压缩文件不会出现不必要的层级)
//r 修复压缩档案
//t 测试压缩档案内的文件
//as 同步压缩档案内容
//-p 给压缩文件加密码方式为:-p123456 #endregion
//打包文件存放目录
var process = new Process
{
StartInfo = new ProcessStartInfo
{
FileName = winRarPath,//执行的文件名
Arguments = pathInfo,//需要执行的命令
UseShellExecute www.yunyouuyL.com= false,//使用Shell执行
WindowStyle = ProcessWindowStyle.Hidden,//隐藏窗体
WorkingDirectory = rarPath,//rar 存放位置
CreateNoWindow = true,//不显示窗体
},
};
process.Start();//开始执行
process.WaitForExit();//等待完成并退出
process.Close(www.tianscpt.com);//关闭调用 cmd 的什么什么
}
catch (Exception ex)
{
throw ex;
}
QSM-01151: 已重写查询
QSM-01209: 已通过实体化视图 MV_T, 采用文本匹配算法进行了查询重写
通过使用CONSIDER FRESH,数据库重新认为物化视图已经和基表的数据保持一致,因此TRUSTED模式下,物化视图重新可以被查询重写机制所使用。