UUID作为主键(慢插入)

时间:2013-12-10 07:32:14

标签: oracle oracle11g oracle10g

我使用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位生产

2 个答案:

答案 0 :(得分:0)

36个字符的主键不应该是真正减慢插入行的问题。使用具有唯一值的索引强制执行主键。使用时,36个字符加上一些开销加上AL32UTF8的额外内容,仍允许8 KB块大小在一个索引叶块中容纳多个值。

可能还有其他事情发生。

请定义:

  • 150 M行的行长平均值。
  • 慢的定义
  • 在加载了多少行后,它会变慢。
  • 你是如何加载的(SQL * Loader?SQL?自己的代码?线程?)
  • 精确的Oracle版本(从v $版本中选择*)

删除索引帮助

从添加内容中,我了解到在单一索引(PK索引)下降后,性能合理(22K / s)。

您可能需要查看以下内容:

  • 检查PowerCenter正在使用的后端,取决于ETL作业,版本和平台的可能性。也许它是插入/选择,并行是/否,甚至是提取和重新加载。为简单起见,我们假设它是一些并行选择和插入。
  • 11.2.0.3是一个很好的Oracle版本,只有很少的烦恼。
  • 根据DBA配置空间管理的方式,查看PK索引的initrans和maxtrans。第一个确定允许活动的事务数。例如,将initrans设置为并发插入的数量。
  • 检查数据字典中的统计信息是完全缺席还是最新(请查看dba_tables for instace)。
  • 检查您自己的表上的统计信息是否不存在或相当准确(对于所有索引的所有列,将表xxx计算统计信息用于表)。在每次加载数据的数量和/或分布发生重大变化后重复此步骤。
  • 有时候,特别是在初始加载时,索引可能会变得过于分散。也许为UUID生成的值对此有贡献。使用查询可以检测到这一点,但要保持简单:始终在初始加载表后重建索引。随着时间的推移,变化变小,从1行变为1.000.000是一个很大的变化,从100万到200万不是。你现在应该只做一次。

作为旁注:对于具有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中。如果您在此表上有“物化视图日志”+“物化视图刷新提交”,请查看。这也可能会受到很大伤害。

如果要获得最快的性能,请不要在表上使用索引,并创建第二个在阴影中刷新的索引。也许,有一点需要使用物化视图。

相关问题