Oracle固定SQL的执行计划(一)---SQL Profile

我们都希望对于所有在Oracle数据库中执行的SQL,CBO都能产生出正确的执行计划,但实际情况却并非如此,由于各种各样的原因(比如目标SQL所涉及的对象的统计信息的不准确,或者CBO内部一些成本计算公式的先天缺陷等),导致有时CBO产生效率不高、甚至是错误的执行计划。特别是CBO对目标SQL所产生的初始执行计划是正确的,后来由于某种原因(比如统计信息的变更等)而导致CBO重新对其产生了错误的执行计划,这种执行计划的改变往往会导致目标SQL执行时间呈数量级的递增,而且常常会让我们很困惑:这个SQL原先跑得好好的,为什么突然就慢得让人无法接受?其实这种SQL执行效率突然衰减往往是因为目标SQL执行计划的改变。

我们当然希望这样的改变永远不要发生,即在Oracle数据库中跑的所有SQL都能有正确的、稳定的执行计划,但实际上在Oracle 11g的SPM(SQL Plan Management)出现之前,这一点是很难做到的。那么现在退而求其次,如果已经出现了执行坟墓的变更,即CBO已经产生了错误的执行计划,我们应该怎么纠正呢?

我种情况下,我们通常会重新收集一下统计信息或者修改目标SQL(比如在目标SQL中加入Hint等)以纠正错误的执行计划。但有时候重新收集统计信息并不能解决问题,更糟糕的是,很多情况下是没有办法修改目标SQL的SQL文本的(比如第三方开发的系统,修改不了源码,或者目标SQL是前台框架动态生成的等等),那么这种情况下我们该怎么办呢?

在Oracle 10g/11g及其以后的版本中,我们可以使用SQL Profile或SPM(SQL Plan Management)来解决上述执行计划变更的问题,用它们来调整、稳定目标SQL的执行计划。

本文介绍使用SQL Profile来稳定执行计划:

Oracle 10g中的SQL Profile(直译为“SQL概要”)可以说是Oracle 9i中的Stored Outline(直译为“存储概要”)的进化。Stored Outline能够实现的功能SQL Profile也完全能够实现。

与Stored Outline相比,SQL Profile具备如下优点:

  • 更容易生成、更改和控制

  • 在SQL语句的支持上做得更好,也就是说适用范围更广。

使用SQL Profile可以很容易实现如下两个目的:

  • 锁定或者说稳定执行计划

  • 在不能修改目标SQL的SQL文本的情况下使目标SQL语句按指定的执行计划运行。

SQL Profile有两种类型:一种是Automatic类型,另一种是Manual类型。下面分别介绍这两种类型:

1. Automatic类型的SQL Profile

Automatic类型的SQL Profile其实就是针对目标SQL的一些额外的调整信息,这些信息存储在数据字典里。当有了Automatic类型的SQL Profile后,Oracle在产生执行计划时就会根据它对目标SQL所涉及的统计信息等内容做相应的调整,因而能够在一定程度上避免产生错误的执行计划。你不用担心Automatic类型的SQL Profile的准确性,因为Oracle会使用类型于动态采用技术那样的手段来保证这些额外调整信息相对准确。

Automatic类型的SQL Profile不会像Stored Outline那样锁定目标SQL的执行计划,因为Automatic类型的SQL Profile的本质就是针对目标SQL的一些额外的调整信息,这些额外的调整信息需要与原目标SQL的相关统计信息等内容一起作用才能得到新的执行计划,即原始SQL的统计信息等内容一旦发生变化,即使原有Automatic类型的SQL Profile并没有改变,该SQL的执行也可能会发生变化。从这个意义上讲,Automatic类型的SQL Profile并不能完全起到稳定目标SQL的执行计划的作用,虽然它确实可以用来调整执行计划。

看一个在不更改目标SQL的SQL文本的情况下使用Automatic类型的SQL Profile来调整执行计划的实例:

创建测试表及相关操作:

zx@MYDB>createtablet1(nnumber);

Tablecreated.

zx@MYDB>declare
2begin
3foriin1..10000loop
4insertintot1values(i);
5endloop;
6commit;
7end;
8/

PL/SQLproceduresuccessfullycompleted.

zx@MYDB>selectcount(*)fromt1;

COUNT(*)
----------
10000

zx@MYDB>createindexidx_t1ont1(n);

Indexcreated.

zx@MYDB>execdbms_stats.gather_table_stats(ownname=>USER,tabname=>'T1',method_opt=>'forallcolumnssize1',cascade=>true);

PL/SQLproceduresuccessfullycompleted.

zx@MYDB>select/*+no_index(t1idx_t1)*/*fromt1wheren=1;

N
----------
1

wKiom1i05RHQIxnlAAAiyxL16KA685.png

从上述显示内容可以看出,目标SQL走的是对表T1的全表扫描(Table Access Full),这个执行计划显然是错误,这里正确的执行坟墓应该是走索引IDX_T1的索引范围扫描(Index Range Scan)。下面使用SQL Tuning Advisor对这条SQL生成Automatic类型的SQL Profile。

a.先创建一个名为my_sql_tuning_task_2的自动调整任务:

zx@MYDB>declare
2my_task_namevarchar2(30);
3my_sqltextclob;
4begin
5my_sqltext:='select/*+no_index(t1idx_t1)*/*fromt1wheren=1';
6my_task_name:=dbms_sqltune.create_tuning_task(
7sql_text=>my_sqltext,8user_name=>USER,9scope=>'COMPREHENSIVE',10time_limit=>60,11task_name=>'my_sql_tuning_task_1',12description=>'Tasktotuneaqueryontablet1');
13end;
14/

PL/SQLproceduresuccessfullycompleted.

zx@MYDB>selecttask_name,status,execution_start,execution_endfromuser_advisor_log;

TASK_NAMESTATUSEXECUTION_STARTEXECUTION_END
-----------------------------------------------------------------------------------------------------
my_sql_tuning_task_1INITIAL

注:创建任务时可以使用SQL来创建,可以适用于SQL文本长的情况。详情参考官方文档。

b.执行上述自动调整任务

zx@MYDB>begin
2dbms_sqltune.execute_tuning_task(task_name=>'my_sql_tuning_task_1');
3end;
4/

zx@MYDB>zx@MYDB>selecttask_name,execution_endfromuser_advisor_log;

TASK_NAMESTATUSEXECUTION_STARTEXECUTION_END
-----------------------------------------------------------------------------------------------------
my_sql_tuning_task_1COMPLETED2017-02-2810:59:432017-02-2810:59:44

PL/SQLproceduresuccessfullycompleted.

c.查看上述自动任务的调整结果

zx@MYDB>setlong9000
zx@MYDB>setlongchunksize1000
zx@MYDB>setlinesize800
zx@MYDB>selectdbms_sqltune.report_tuning_task('my_sql_tuning_task_1')fromdual;

wKiom1i06JSD9gqUAACC_GItPOE832.png

wKiom1i06Hjy0ylYAABb5-wX0Fg685.png

从上述调整结果可以看到,Oracle现在告诉我们:它已经为目标SQL找到了更好的执行计划,并且已经创建了针对该SQL的Automatic类型的SQL Profile。如果我们使用accecp_sql_profile接受了这个SQL Profile,则目标SQL的响应时间将会有86.24%的提升,逻辑读将会有95%的提升,并且接受了该SQL Profile后目标SQL的执行计划将会由原来的全表扫描变为索引范围扫描。

上面Automatic类型的SQL Profile所产生的调整结果就是我们想要的,所以现在只需按Oracle的提示接受这个SQL Profile即可:

zx@MYDB>executedbms_sqltune.accept_sql_profile(task_name=>'my_sql_tuning_task_1',task_owner=>'ZX',replace=>TRUE,force_match=>true);

PL/SQLproceduresuccessfullycompleted.

接受此SQL Profile后我们来看一下效果,再次执行目标SQL:

zx@MYDB>select/*+no_index(t1idx_t1)*/*fromt1wheren=1;

N
----------
1

wKiom1i065Kj_v65AAB-FIlggM0241.png

注意到Note部分有这样的内容“SQL profile SYS_SQLPROF_015a82b353490000 used for this statement”这说明我们刚才接受的SQL Profile已经起了作用,该SQL Profile的名字为SYS_SQLPROF_015a82b353490000。从执行计划中也可以看到,执行计划确实已经改变了。

另外,DBMS_SQLTUNE.ACCEPT_SQL_PROFILE的输入参数force_match的默认值为FALSE,表示只有在SQL文本完全匹配的情况下才会应用SQL Profile,这种情况下只要目标SQL的SQL文本发生一点变动,原有的SQL Profile将会失去作用,如果设置为TRUE,即使SQL有变动SQL Profile也会强制生效。

删除SQL Profile

zx@MYDB>execdbms_sqltune.drop_sql_profile('SYS_SQLPROF_015a82b353490000');

PL/SQLproceduresuccessfullycompleted.

2. Manual类型的SQL Profile

Manual类型的SQL Profile本质上就是一堆Hint的组合,这一堆Hint的组合实际上来源于执行计划中的Outline Data部分的Hint组合。Manual类型的SQL Profile同样可以在不更改目标SQL的SQL文本的情况下,调整其执行计划,而且更为重要的是,Manual类型的SQL Profile可以起到很好稳定目标SQL的执行计划的作用,这一点是Automatic类型的SQL Profile所不具备的。

看一个使用Manual类型的SQL Profile实例固定执行计划的实例,使用上面的t1表,删除上面的SQL Profile,再次执行SQL

zx@MYDB>select/*+no_index(t1idx_t1)*/*fromt1wheren=1;

N
----------
1

wKioL1i09kTDbaLYAAAon2Umz2g502.png

从上述输出可以看出执行计划仍然走全表扫描。

现在来创建Manual类型的SQL Profile。这里使用了MOS上的一个脚本coe_xfr_sql_profile.sql。这个脚本用于从Shared Pool、AWR Repository中指定SQL的指定执行计划的Outline Data部分的Hint组合,来创建Manual类型的SQL Profile。

使用coe_xfr_sql_profile.sql脚本的步骤为

  1. 针对目标SQL使用coe_xfr_sql_profile.sql产生能生成其Manual类型的SQL Profile的脚本A。

  2. 改写目标SQL的文本,在其中使用合适的Hint,直到加入Hint后的SQL能走出我们想要的执行计划。然后对加入合适Hint后的SQL使用脚本coe_xfr_sql_profile.sql,产生能生成其Manual类型的SQL Profile的脚本B。

  3. 用脚本B中的Outline Data部分的Hint组合替换掉脚本A的Outline Data部分的Hint组合。

  4. 执行脚本A生成针对原目标SQL的Manual类型的SQL Profile。

现在改写上面的SQL,强制走索引:

zx@MYDB>select/*+index(t1idx_t1)*/*fromt1wheren=1;

N
----------
1

wKioL1i09FKC2sQHAAAp5hXwOKc945.png

从执行计划中可以看出SQL Id和对应的Plan hash value。

全表扫描的SQL Id:6chcc0pvvhqqm Plan hash value:3617692013

索引扫描的SQL Id:2ufquy7xs5nm5Plan hash value:1369807930

a. 先使用coe_xfr_sql_profile.sql生成全表扫描SQL对应的脚本

zx@MYDB>@scripts/coe_xfr_sql_profile.sql

Parameter1:
SQL_ID(required)

Entervaluefor1:6chcc0pvvhqqm


PLAN_HASH_VALUEAVG_ET_SECS
--------------------------
3617692013.002

Parameter2:
PLAN_HASH_VALUE(required)

Entervaluefor2:3617692013

Valuespassedtocoe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID	:"6chcc0pvvhqqm"
PLAN_HASH_VALUE:"3617692013"

SQL>BEGIN
2IF:sql_textISNULLTHEN
3	RAISE_APPLICATION_ERROR(-20100,'SQL_TEXTforSQL_ID&&sql_id.wasnotfoundinmemory(gv$sqltext_with_newlines)orAWR(dba_hist_sqltext).');
4ENDIF;
5END;
6/
SQL>SETTERMOFF;
SQL>BEGIN
2IF:other_xmlISNULLTHEN
3	RAISE_APPLICATION_ERROR(-20101,'PLANforSQL_ID&&sql_id.andPHV&&plan_hash_value.wasnotfoundinmemory(gv$sql_plan)orAWR(dba_hist_sql_plan).');
4ENDIF;
5END;
6/
SQL>SETTERMOFF;

Executecoe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql
onTARGETsysteminordertocreateacustomSQLProfile
withplan3617692013linkedtoadjustedsql_text.


COE_XFR_SQL_PROFILEcompleted.

从输出可以看出,生成一个名为coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql的脚本。

b.用coe_xfr_sql_profile.sql生成索引扫描SQL对应的脚本

SQL>@scripts/coe_xfr_sql_profile.sql

Parameter1:
SQL_ID(required)

Entervaluefor1:2ufquy7xs5nm5


PLAN_HASH_VALUEAVG_ET_SECS
--------------------------
1369807930.001

Parameter2:
PLAN_HASH_VALUE(required)

Entervaluefor2:1369807930

Valuespassedtocoe_xfr_sql_profile:
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
SQL_ID	:"2ufquy7xs5nm5"
PLAN_HASH_VALUE:"1369807930"

SQL>BEGIN
2IF:sql_textISNULLTHEN
3	RAISE_APPLICATION_ERROR(-20100,'PLANforSQL_ID&&sql_id.andPHV&&plan_hash_value.wasnotfoundinmemory(gv$sql_plan)orAWR(dba_hist_sql_plan).');
4ENDIF;
5END;
6/
SQL>SETTERMOFF;

Executecoe_xfr_sql_profile_2ufquy7xs5nm5_1369807930.sql
onTARGETsysteminordertocreateacustomSQLProfile
withplan1369807930linkedtoadjustedsql_text.


COE_XFR_SQL_PROFILEcompleted.

从输出可以看出,生成一个名为coe_xfr_sql_profile_2ufquy7xs5nm5_1369807930.sql的脚本。

c. 把后生成的脚本里的Outline Data部分的Hint组合替换到先生成的脚本里,即下图红框部分内容

wKioL1i0-N_CUwWiAAA1ci19gs8669.png

d. 执行coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql脚本

zx@MYDB>@coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql
zx@MYDB>REM
zx@MYDB>REM$Header:215187.1coe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql11.4.4.42017/02/28carlos.sierra$
zx@MYDB>REM
zx@MYDB>REMCopyright(c)2000-2012,OracleCorporation.Allrightsreserved.
zx@MYDB>REM
zx@MYDB>REMAUTHOR
zx@MYDB>REMcarlos.sierra@oracle.com
zx@MYDB>REM
zx@MYDB>REMSCRIPT
zx@MYDB>REMcoe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql
zx@MYDB>REM
zx@MYDB>REMDESCRIPTION
zx@MYDB>REMThisscriptisgeneratedbycoe_xfr_sql_profile.sql
zx@MYDB>REMItcontainstheSQL*Pluscommandstocreateacustom
zx@MYDB>REMSQLProfileforSQL_ID6chcc0pvvhqqmbasedonplanhash
zx@MYDB>REMvalue3617692013.
zx@MYDB>REMThecustomSQLProfiletobecreatedbythisscript
zx@MYDB>REMwillaffectplansforSQLcommandswithsignature
zx@MYDB>REMmatchingtheoneforSQLTextbelow.
zx@MYDB>REMReviewSQLTextandadjustaccordingly.
zx@MYDB>REM
zx@MYDB>REMPARAMETERS
zx@MYDB>REMNone.
zx@MYDB>REM
zx@MYDB>REMEXAMPLE
zx@MYDB>REMSQL>STARTcoe_xfr_sql_profile_6chcc0pvvhqqm_3617692013.sql;
zx@MYDB>REM
zx@MYDB>REMNOTES
zx@MYDB>REM1.ShouldberunasSYSTEMorSYSDBA.
zx@MYDB>REM2.UsermusthaveCREATEANYSQLPROFILEprivilege.
zx@MYDB>REM3.SOURCEandTARGETsystemscanbethesameorsimilar.
zx@MYDB>REM4.TodropthiscustomSQLProfileafterithasbeencreated:
zx@MYDB>REMEXECDBMS_SQLTUNE.DROP_SQL_PROFILE('coe_6chcc0pvvhqqm_3617692013');
zx@MYDB>REM5.BeawarethatusingDBMS_SQLTUNErequiresalicense
zx@MYDB>REMfortheOracleTuningPack.
zx@MYDB>REM6.IfyoumodifiedaSQLputtingHintsinordertoproduceadesired
zx@MYDB>REMPlan,youcanremovetheartificalHintsfromSQLTextpiecesbelow.
zx@MYDB>REMBydoingsoyoucancreateacustomSQLProfilefortheoriginal
zx@MYDB>REMSQLbutwiththePlancapturedfromthemodifiedSQL(withHints).
zx@MYDB>REM
zx@MYDB>WHENEVERSQLERROREXITSQL.SQLCODE;
zx@MYDB>REM
zx@MYDB>VARsignatureNUMBER;
zx@MYDB>VARsignaturefNUMBER;
zx@MYDB>REM
zx@MYDB>DECLARE
2sql_txtCLOB;
3hSYS.SQLPROF_ATTR;
4PROCEDUREwa(p_lineINVARCHAR2)IS
5BEGIN
6DBMS_LOB.WRITEAPPEND(sql_txt,LENGTH(p_line),p_line);
7ENDwa;
8BEGIN
9DBMS_LOB.CREATETEMPORARY(sql_txt,TRUE);
10DBMS_LOB.OPEN(sql_txt,DBMS_LOB.LOB_READWRITE);
11--SQLTextpiecesbelowdonothavetobeofsamelength.
12--SoifyoueditSQLText(i.e.removingtemporaryHints),13--thereisnoneedtoeditorre-alignunmodifiedpieces.
14wa(q'[select/*+no_index(t1idx_t1)*/*fromt1wheren=1]');
15DBMS_LOB.CLOSE(sql_txt);
16h:=SYS.SQLPROF_ATTR(
17q'[BEGIN_OUTLINE_DATA]',18q'[IGNORE_OPTIM_EMBEDDED_HINTS]',19q'[OPTIMIZER_FEATURES_ENABLE('11.2.0.1')]',20q'[DB_VERSION('11.2.0.1')]',21q'[ALL_ROWS]',22q'[OUTLINE_LEAF(@"SEL$1")]',23q'[INDEX(@"SEL$1""T1"@"SEL$1"("T1"."N"))]',24q'[END_OUTLINE_DATA]');
25:signature:=DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt);
26:signaturef:=DBMS_SQLTUNE.SQLTEXT_TO_SIGNATURE(sql_txt,TRUE);
27DBMS_SQLTUNE.IMPORT_SQL_PROFILE(
28sql_text=>sql_txt,29profile=>h,30name=>'coe_6chcc0pvvhqqm_3617692013',31description=>'coe6chcc0pvvhqqm3617692013'||:signature||''||:signaturef||'',32category=>'DEFAULT',33validate=>TRUE,34replace=>TRUE,35force_match=>FALSE/*TRUE:FORCE(matchevenwhendifferentliteralsinSQL).FALSE:EXACT(similartoCURSOR_SHARING)*/);
36DBMS_LOB.FREETEMPORARY(sql_txt);
37END;
38/

PL/SQLproceduresuccessfullycompleted.

zx@MYDB>WHENEVERSQLERRORCONTINUE
zx@MYDB>SETECHOOFF;

SIGNATURE
---------------------
3589138201450662673


SIGNATUREF
---------------------
8068435081012723673


...manualcustomSQLProfilehasbeencreated


COE_XFR_SQL_PROFILE_6chcc0pvvhqqm_3617692013completed

e. 执行完成后再次查看目标SQL的执行计划

zx@MYDB>select/*+no_index(t1idx_t1)*/*fromt1wheren=1;

N
----------
1

wKioL1i0-U6TcXLrAACEm7QFkBI403.png

从执行计划中可以看出已经走了INDEX RANGE SCAN,而且note部分提示SQL profile coe_6chcc0pvvhqqm_3617692013 used for this statement,说明执行sql时使用了该SQL Profile。

如果想在目标SQL的SQL文本发生变动时SQL Profile依然生效,则需要修改生成的脚本里的force_match=>true。

参考:《基于Oracle的SQL优化》

官方文档:http://docs.oracle.com/cd/E11882_01/server.112/e41573/sql_tune.htm#PFGRF94854

http://docs.oracle.com/cd/E11882_01/appdev.112/e40758/d_sqltun.htm#CHDGAJCI

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


文章浏览阅读773次,点赞6次,收藏9次。【代码】c# json字符串转Oracle的insert into的小程序。
文章浏览阅读8.7k次,点赞2次,收藏17次。此现象一般定位到远端的监听服务来找问题,在远端查看监听服务状态(具体看下面的解决方案会详细呈现),服务是否开启,另外查看监听端点概要是否存在host未指向到计算名的,如无直接进入监听配置文件listener.ora内添加指向即可。2、查看监听服务状态 lsnrctl status,右边为远端端点状态,未添加host指向到计算名;1、本地及远端安装好Oracle并配置好连接,Oracle服务和监听已启动;1、远程Oracle数据库:Oracle11g R2。或者进入下述服务手动重启。,再进行远程连接即可。_ora-12541:tns:无监听程序
文章浏览阅读2.8k次。mysql脚本转化为oracle脚本_mysql建表语句转oracle
文章浏览阅读2.2k次。cx_Oracle报错:cx_Oracle DatabaseError: DPI-1047: Cannot locate a 64-bit Oracle Client library_cx_oracle.databaseerror: dpi-1047: cannot locate a 64-bit oracle client libr
文章浏览阅读1.1k次,点赞38次,收藏35次。本文深入探讨了Oracle数据库的核心要素,包括体系结构、存储结构以及各类参数。通过解析Oracle数据库的体系结构,读者可以深入了解其内部组成和工作原理。存储结构部分介绍了数据在Oracle中的存储方式,从表空间到数据文件的层层逻辑。最后,我们深入探讨了Oracle数据库中各类参数的作用和配置方法,帮助读者更好地理解和优化数据库性能。本文旨在帮助读者全面理解Oracle数据库的运作机制,为其在实践中的应用提供基础和指导。
文章浏览阅读1.5k次。默认自动收集统计信息的时间为晚上10点(周一到周五,4个小时),早上6点(周六,周日,20个小时)由于平时默认每天只收集4小时,时间有点短了,改成每天可收集8小时。oracle 18c中默认是打开的。查看当前自动收集统计信息的时间。_oracle自动收集统计信息
文章浏览阅读929次,点赞18次,收藏20次。只有assm(Automatic Shared Memory Management)模式可以使用大页,需要关闭amm(Memory Manager Process)HugePages_Free: 306 (空闲306页,已使用306-306=0页)防止oracle使用的内存交换,所以设置的大小与oracle配置的sga、pga相关。HugePages_Rsvd: 0 (操作系统承诺给oracle预留的页数)HugePages_Total: 306 (总共306页)_oracle11g 大页
文章浏览阅读801次。例如:10046:0,1,4,8,12。默认redo日志有三个,大小为50M,循环覆盖使用。redo log再覆盖之前,会被归档,形成归档日志。答:不同事件,不同级别。trace的不同级别?_oracle 日志
文章浏览阅读4.2k次,点赞84次,收藏77次。主要讲解MySQL中SQL的DDL语句,其中包括对数据库和表的一系列操作。_sql ddl 新增字段 mysql
文章浏览阅读1.1k次。ON DEMAND:仅在该物化视图“需要”被刷新了,才进行刷新(REFRESH),即更新物化视图,以保证和基表数据的一致性;ON COMMIT:一旦基表有了COMMIT,即事务提交,则立刻刷新,立刻更新物化视图,使得数据和基表一致。Method =>'C',物化视图有三种刷新方式:COMPLETE、FAST和FORCE。物化视图会占用空间,一半可用于大量数据查询时,减缓主表的查询压力使用。例如创建一个物化视图,让对接单位查询。_oracle物化视图定时刷新
文章浏览阅读713次,点赞21次,收藏18次。1.背景介绍在当今的大数据时代,数据量越来越大,传统的关系型数据库已经无法满足业务需求。因此,NoSQL数据库技术迅速崛起,成为企业和开发者的首选。Oracle NoSQL Database是Oracle公司推出的一款分布式NoSQL数据库产品,具有高性能、高可用性和易于扩展等特点。在本文中,我们将深入了解Oracle NoSQL Database的集成与开发者工具,帮助您更好地掌握这款产品的...
文章浏览阅读2.5k次,点赞2次,收藏4次。今天遇见一个问题需要将字段中包含中文字符串的筛选出来。_oracle查询包含中文字符
文章浏览阅读802次。arcmap 在oracle删除表重新创建提示表名存在解决放啊
文章浏览阅读4.3k次,点赞2次,收藏4次。Oracle连接数据库提示 ORA-12638:身份证明检索失败_ora-12638
文章浏览阅读3.4k次,点赞6次,收藏25次。etc/profile是一个全局配置文件,所有用户登录都会使用该文件构建用户环境。与windows配置环境变量是一个道理。选择Linux系统,找到适合自己系统的安装包,我的是CentOS 8 x64。接下来需要登陆Oracle账户才能下载,无账户的可以自己注册一个。Linux中export 命令用于设置或显示环境变量。模式,利用上下键到文档最后,添加以下代码。出现如图所示版本号字样,则说明安装成功。点击下载,勾选1,点击2。记住完整路径用于后面配置。找到Java并点击进去。往下翻,找到Java8。_linux安装jdk1.8
文章浏览阅读2.4w次,点赞26次,收藏109次。JDK 是的简称,也就是 Java 开发工具包。JDK 是整个 Java 的核心,其中JDK包含了 Java 运行环境(Java Runtime Envirnment,简称 JRE),Java 工具(比如 javac、java、javap 等等),以及 Java 基础类库(比如 rt.jar)。最主流的 JDK 是Oracle公司发布的 JDK,除了 Oracle JDK(商业化,更稳定)之外,还有很多公司和组织开发了属于自己的 JDK,比较有名的有IBM JDK(更适合 IBM) 和OpenJDK。_jdk安装教程
文章浏览阅读7.5w次。出现 “java.sql.SQLNonTransientConnectionException:Could not create connection to database server” 的错误通常是由于无法连接到数据库服务器引起的。_java.sql.sqlnontransientconnectionexception: could not create connection to
文章浏览阅读849次,点赞7次,收藏10次。在ClickHouse中创建用户、数据库并进行权限分配是一个重要的管理任务,它涉及到安全性和访问控制。下面是一个基本的指南来帮助你完成这些操作:1. 创建数据库首先,需要创建一个数据库。使用以下命令:CREATE DATABASE IF NOT EXISTS your_database_name;将 your_database_name 替换为你想要的数据库名。2. 创建用户接下来,创建一个新用户。使用以下命令:CREATE USER your_username IDENTIFIED WIT_在clickhouse中如何创建用户 赋权
文章浏览阅读1.2k次,点赞53次,收藏39次。本文是一篇关于Oracle数据库安装和使用的博文摘要。作者以轻松幽默的笔调介绍了自己在实验中掌握的Oracle数据库基本操作,包括使用组件查看命令、配置数据库监听器等。作者也分享了在实验中遇到的一些有趣问题,如SQL语句缺少分号导致的意外错误。此外,作者还强调了登录sys用户和启动实例加载数据库的注意事项,并鼓励读者面对挑战时保持乐观,不断提升自己的能力。整体风格风趣严谨,引人入胜。
文章浏览阅读820次,点赞17次,收藏16次。KingbaseES、xml、dbms_xmlgen、SETSKIPROWS、人大金仓、KingbaseES兼容Oracle包dbms_xmlgen的功能是通过SQL查询将关系表中数据转化为XML文档。转化方式一共有两种:(1)通过查询字符串直接转化。(2)通过上下文句柄转化。对于通过查询字符串直接转化的方式,无法跳过若干行进行查询,只能直接将表格中的所有数据转化为XML文档。