如果我运行sql 10次,8次运行正常,2次运行2次.
它是Centos 7上Linux x86_64的Oracle 11.2.0.4的干净安装.
我已经安装了Oracle推荐的补丁:
>补丁19769489 – 数据库补丁集更新11.2.0.4.5(包括cpuJan2015)
>补丁19877440 – Oracle JavaVM组件11.2.0.4.2数据库PSU(2015年1月)
修补后没有变化.
这两个表有:
LNK_PACK_REP:13行
包装:6排
在sql Plus中,我已启用所有统计信息并多次运行sql.只有时间从0.1变为2.1.如果我将0.1秒的运行与2.1秒的运行进行比较,则不会更改其他统计数据.服务器有16 Gb RAM和8个cpu内核.服务器负载低于0.1(暂时没有用户使用服务器).
输出:
sql>从LNK_PACK_REP中选择PACKAGE_ID,ID,package_name LNKPR INNER JOIN PACKAGES P ON LNKPR.PACKAGE_ID = P.ID;
PACKAGE_ID ID PACKAGE_name
3 3 RAPOARTE 3 3 RAPOARTE 121 121 VANZARI 121 121 VANZARI 121 121 VANZARI 2 2 PACHETE 2 2 PACHETE 1 1 DEPARTAMENTE 1 1 DEPARTAMENTE 81 81 RolURI 81 81 RolURI
PACKAGE_ID ID PACKAGE_name
101 101 UTIliZATORI 101 101 UTIliZATORI
选择了13行.
经过时间:00:00:02.01
执行计划
计划哈希值:2671988802
--------------------------------------------------------------------------------------------------------------------------| ID | Operation | name | Rows | Bytes | Cost (%cpu)| Time | TQ |IN-OUT| PQ distrib |--------------------------------------------------------------------------------------------------------------------------| 0 | SELECT STATEMENT | | 13 | 351 | 3 (0)| 00:00:01 | | | || 1 | PX COORDINATOR | | | | | | | | || 2 | PX SEND QC (RANDOM) | :TQ10002 | 13 | 351 | 3 (0)| 00:00:01 | Q1,02 | P->S | QC (RAND) ||* 3 | HASH JOIN | | 13 | 351 | 3 (0)| 00:00:01 | Q1,02 | Pcwp | || 4 | PX RECEIVE | | 6 | 84 | 2 (0)| 00:00:01 | Q1,02 | Pcwp | || 5 | PX SEND HASH | :TQ10001 | 6 | 84 | 2 (0)| 00:00:01 | Q1,01 | P->P | HASH || 6 | PX BLOCK IteraTOR | | 6 | 84 | 2 (0)| 00:00:01 | Q1,01 | PCWC | || 7 | table ACCESS FulL| PACKAGES | 6 | 84 | 2 (0)| 00:00:01 | Q1,01 | Pcwp | || 8 | BUFFER SORT | | | | | | Q1,02 | PCWC | || 9 | PX RECEIVE | | 13 | 169 | 1 (0)| 00:00:01 | Q1,02 | Pcwp | || 10 | PX SEND HASH | :TQ10000 | 13 | 169 | 1 (0)| 00:00:01 | | S->P | HASH || 11 | INDEX FulL SCAN | UNQ_PACK_REP | 13 | 169 | 1 (0)| 00:00:01 | | | |--------------------------------------------------------------------------------------------------------------------------
谓词信息(由 *** 作ID标识):
3 – 访问(“LNKPR”.“PACKAGE_ID”=“P”.“ID”)
注意
>用于此语句的动态采样(级别= 2)
统计
24 recursive calls 0 db block gets 10 consistent gets 0 physical reads 0 redo size 923 bytes sent via sql*Net to clIEnt 524 bytes received via sql*Net from clIEnt 2 sql*Net roundtrips to/from clIEnt 4 sorts (memory) 0 sorts (disk) 13 rows processed
表1结构:
-- Create tablecreate table PACKAGES( ID NUMBER(3) not null,package_name VARCHAR2(150),position NUMBER(3),activ NUMBER(1))tablespace UM pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );-- Create/Recreate primary,unique and foreign key constraints alter table PACKAGES add constraint PACKAGES_ID primary key (ID) using index tablespace UM pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );-- Create/Recreate indexes create index PACKAGES_ACTIV on PACKAGES (ID,ACTIV) tablespace UM pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );
表2结构:
-- Create tablecreate table LNK_PACK_REP( package_ID NUMBER(3) not null,report_ID NUMBER(3) not null)tablespace UM pctfree 10 initrans 1 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );-- Create/Recreate primary,unique and foreign key constraints alter table LNK_PACK_REP add constraint UNQ_PACK_REP primary key (PACKAGE_ID,REPORT_ID) using index tablespace UM pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );-- Create/Recreate indexes create index LNK_PACK_REP_REPORT_ID on LNK_PACK_REP (REPORT_ID) tablespace UM pctfree 10 initrans 2 maxtrans 255 storage ( initial 64K next 1M minextents 1 maxextents unlimited );
在sql Monitor的Oracle Enterprise Manager中,我可以看到多次运行的sql.所有runns都有“数据库时间”0.0s(如果我将鼠标悬停在列表上,则小于10微秒),正常运行时“持续时间”为0.0s,延迟时间为“秒”.
如果我为2.0s的那次运行监控sql执行,我有:
>持续时间:2.0秒
>数据库时间:0.0s
> PL / sql& Java:0.0
>等待活动:%(此处没有数字)
>缓冲区得到:10
> IO请求:0
> IO字节:0
>取电话:2
>平行:4
除了持续时间甚至小于数据库时间(10,163微秒数据库时间和3,748微秒持续时间)之外,Theese数字与快速运行一致,如果没有鼠标悬停,则显示为0.0s.
我不知道还有什么要检查.
解决方法 并行查询无法在几秒钟内进行有意义的调整.它们专为长时间处理大量数据的查询而设计.使用小数据集优化并行语句的最佳方法是暂时禁用它:
alter system set parallel_max_servers=0;
(这是在工作站而不是服务器上开发的优点的一个很好的例子.在服务器上,这种变化会影响每个人,你甚至可能没有权限运行命令.)
查询可能很简单,但并行性在后台增加了很多复杂性.
很难确切地说为什么它会变慢.如果您有sql监视报告,则等待事件可能会有所帮助.但即便是这些数字也可能只是像“cpu”这样的通用等待.并行查询有很多开销,期望资源密集,长时间运行的查询.以下是一些类型的开销,可以解释这些2秒来自哪里:
>动态采样 – 并行可能会自动导致动态采样,从表中读取数据.虽然用于此语句的动态采样(级别= 2)
可能只是意味着缺少优化器统计信息.
> OS线程启动 – SQL语句可能需要启动8个额外的OS线程,并准备大量内存来保存所有中间数据.也许
参数ParaLLEL_MIN_SERVERS可以帮助防止用于创建这些线程的一些时间.
>附加监视 – 自动监视并行语句,这需要递归SELECT和INSERT.
>缓存 – 并行查询通常直接从磁盘读取并跳过读取和写入缓冲区缓存.何时缓存数据的规则很复杂且没有文档记录.
>降级 – 找到正确的并行度很复杂.例如,我编译了一个39 factors that influence the DOP的列表.其中一个可能导致降级,使一些查询快速而其他查询速度变慢.
并且可能有许多其他类型的开销我无法想到.并行性非常适合大规模改进大型运营的运行时间.但它对于微小的查询效果不佳.
总结以上是内存溢出为你收集整理的linux – Oracle 11.2在随机时间对简单SQL有2秒的延迟全部内容,希望文章能够帮你解决linux – Oracle 11.2在随机时间对简单SQL有2秒的延迟所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)