我使用UUID(36-chars)作为表中的主键。 由于我们达到了大约150个记录,因此插入变得非常慢(似乎是由于PK指数)。
有没有办法改善这种情况?或者你们有什么想法吗?
详细说明:
150 M行的行长度平均值。
总共约60个字符(10列,8个只是ID)
慢的定义
每秒800-1000行
在加载了多少行后,它会变慢。
afaik first one
你是如何加载的(SQL * Loader?SQL?自己的代码?线程?)
Informatica Powercenter
精确的Oracle版本(从v $版本中选择*)
Oracle Database 11g企业版11.2.0.3.0版 - 64位生产
答案 0 :(得分:0)
36个字符的主键不应该是真正减慢插入行的问题。使用具有唯一值的索引强制执行主键。使用时,36个字符加上一些开销加上AL32UTF8的额外内容,仍允许8 KB块大小在一个索引叶块中容纳多个值。
可能还有其他事情发生。
请定义:
从添加内容中,我了解到在单一索引(PK索引)下降后,性能合理(22K / s)。
您可能需要查看以下内容:
作为旁注:对于具有36个字符列作为主键的行,60个字符似乎不切实际。每个ID大约采用精度/ 2 + 1字节(BCD格式)。但即使行数增加一倍,也不会产生重大影响。
根据要求增加:
以下查询用于确定符合重建条件的索引。最后的标准可以改变。对于在OLTP环境中的生产使用,它们足以充分减少不必要的消息,但仍然可以检测到真正的不良情况。以特权用户身份运行或授予对相关数据字典视图的读取权限。应该在Oracle 8,8i,9和10上运行。最近没有在11或12上使用。
我知道直接查询数据字典并不总是令人满意的,例如在使用多个版本的数据模型时,但这样做的效果要好得多。从重建中受益的索引可以通过存储获益(在黑暗时代,我们在VMS服务器上只有几MB,每个KB都很有价值),有时候性能会更好。
ttitle "Warning: Fragmented Indexes (&dbname)" -
skip 2 "Corrective action:" -
skip 1 "Rebuild index (rebuildIndexes.sql)." -
skip 2
column owner format a30 heading "Owner"
column ind_name format a30 heading "Index"
column num_rows format 999,999,990 heading "#Rows"
column cur_size_kb format 9,999,990 heading "Current Size (Kb)"
column est_size_kb format 9,999,990 heading "Est. Size (Kb)"
column ratio format 9,990 heading "Ratio cur/est"
select /*+ rule */ usr.name owner
, objind.name ind_name
, round
(
( sum
( (tab.rowcnt - head.null_cnt) * col.length * 0.5
/* 50% average fill */
)
* 1.5 /* 75% usage after some delet/update */
+ 5 * ts.blocksize
) /1024
) est_size_kb
, round(ts.blocksize * seg.blocks / 1024) cur_size_kb
, round
( ts.blocksize * seg.blocks
/ ( sum((tab.rowcnt - head.null_cnt) * col.length * 0.5) * 1.5
+ 5 * ts.blocksize
)
) ratio
, tab.rowcnt num_rows
from sys.ind$ ind
, sys.hist_head$ head
, sys.col$ col
, sys.icol$ icol
, sys.obj$ objind
, sys.obj$ objtab
, sys.tab$ tab
, sys.ts$ ts
, sys.seg$ seg
, sys.user$ usr
where 1=1
and ts.ts# = seg.ts#
and seg.file# = ind.file#
and seg.block# = ind.block#
and ind.obj# = objind.obj#
and head.col# (+) = col.col#
and head.obj# (+) = col.obj#
and icol.obj# = ind.obj#
and col.col# = icol.col#
and col.obj# = objtab.obj#
/* To save at least 25 Mb, the index must be over 25 Mb. */
and ts.blocksize * seg.blocks > 25 * 1024
and ind.bo# = objtab.obj#
and objind.obj# = ind.obj#
and tab.obj# = objtab.obj#
and objtab.owner# = usr.user#
and usr.name not in ('SYS','SYSTEM')
group
by objind.name
, ts.blocksize
, seg.blocks
, tab.rowcnt
, usr.name
having ts.blocksize * seg.blocks / ( sum((tab.rowcnt - head.null_cnt) * col.length * 0.5) * 1.5 + 5 * ts.blocksize )
>= 2
and ( ts.blocksize * seg.blocks / 1024 )
-
( sum((tab.rowcnt - head.null_cnt) * col.length * 0.5) * 1.5
+ 5 * ts.blocksize
) / 1024
> 25 * 1024
order by 5 desc
答案 1 :(得分:0)
首先:每秒800-1000行 - 不是那么慢,特别是来自外部源。我猜你是逐个插入行,Oracle每次都会解析它,然后每次插入都会有延迟。
关于提高绩效:
一个。如果您的桌子上有更多索引,请查看。
特别是寻找位图索引,因为它们很难重建。
您还可以轻松检查主键是否确实存在问题:
alter table <table> drop constraint <primary key>;
B中。如果您在此表上有“物化视图日志”+“物化视图刷新提交”,请查看。这也可能会受到很大伤害。
如果要获得最快的性能,请不要在表上使用索引,并创建第二个在阴影中刷新的索引。也许,有一点需要使用物化视图。