【发布时间】:2015-04-10 15:48:02
【问题描述】:
一个简单的表连接通常在 0.0XX 秒内完成,有时在 2.0XX 秒内完成(根据 PL/SQL Developer SQL 执行)。从 SQL Plus 运行时仍然会发生这种情况。
如果我运行 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> select PACKAGE_ID, id, package_name from LNK_PACK_REP 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")
注意
- 用于此语句的动态采样 (level=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 table
create 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 table
create 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用于延迟。 如果我为 2.0s 运行受监控的 SQL 执行,我有:
- 持续时间:2.0s
- 数据库时间:0.0s
- PL/SQL 和 Java:0.0
- 等待活动:%(此处无数字)
- 缓冲区获取:10
- IO 请求:0
- IO 字节数:0
- 获取调用:2
- 并行:4
这些数字与快速运行一致,但持续时间甚至小于数据库时间(10,163 微秒数据库时间和 3,748 微秒持续时间),如果没有鼠标悬停,则两者都显示为 0.0 秒。
我不知道还要检查什么。
【问题讨论】:
-
并行查询?我会在这么小的桌子上禁用它。
-
这是默认设置。我没有 SQL 提示,也没有更改与并行执行相关的任何设置。桌子会变大。原始 SQL 有 10 个表连接,但我已经设法将这个问题减少到只有 2 个表连接,结果没有变化。
-
您确认延迟是在数据库端而不是在 SQL*Plus 客户端吗?
-
在较大的表上运行 PQ 没有问题,但我会尝试消除它作为导致此问题的原因,因为它需要查询前执行检查点以及其他问题。
-
我假设您已经检查了警报日志以查找诸如等待日志切换的日志写入器之类的内容?
标签: linux database oracle delay