加快大表关联查询速度

1、增加I/o读取的速度 DB_FILE_MULTIBLOCK_READ_COUNT如果是全表扫描,那么区间的尺寸大小就有可能导致性能问题。因为全表扫描时,Oracle会一次读取多个Blocks。每次读取的块数将受初始化参数DB_FILE_MULTIBLOCK_READ_COUNT和 操作系统的I/O缓冲区大小的限制。比如说,如果Oracle Block的大小是4KB,操作系统I/O缓 冲区大小是64KB,那么在全表扫描时每次最多可以读取16个块(Oracle Blocks),所以此时将DB_FILE_MULTIBLOCK_READ_COUNT的 值设置为超过16也改变不了全表扫描的性能了。

alter session set db_file_multiblock_read_count=4

alter system set db_file_multiblock_read_count=4

2、并行 查询select /*+ parallel(c1 ,2) */ * from customers c1 where ......

注意事项: 检查一下

1、看看并行选件是否安装SELECT * FROM V$OPTION看看Parallel execution是不是TRUE

2、如果是TRUE,执行语句后查看select * from V$pq_sesstat;如果Queries Parallelized 》0就说明是执行了并行

3、可以强制使用PARALLEL,和CPU数量无关,不过在单个CPU下使用并行没 有什么好处alter session force parallel query;

4、你是怎么知道语句没有使用PARALLEL?如果你用EXPLAIN ,那么有两个脚本看执行计划UTLXPLS.UTLXPLP前一个是看串行计划的,后一个才能看到并行计划,如果你使用SET AUTOTRACE,那么你如果看到P->S,那么说明计划已经是并行的 了。

1.与并行查询有关的参数有哪些?parallel_adaptive_multi_user boolean 启用或禁用一个自适应算法,旨在提高使用并行执行方式的多用户环境的性能。通过按系统负荷自动降低请求的并行度,在启动查询时实现此功能。当 PARALLEL_AUTOMATIC_TUNING = TRUE 时,其效果最佳。 TRUE | FALSE 如果 PARALLEL_AUTOMATIC_TUNING = TRUE,则该值为 TRUE;否则为 FALSE parallel_automatic_tuning boolean 如果设置为 TRUE,Oracle 将为控制并行执行的参数确定默认值。除了设置该参数外,你还必须为系统中的表设置并行性。 TRUE | FALSE FALSEparallel_execution_message_size integer 指定并行执行 (并行查询、PDML、并行恢复和复制) 消息的大小。如果值大于 2048 或 4096,就需要更大的共享池。如果 PARALLEL_AUTOMATIC_TUNING =TRUE,将在大存储池之外指定消息缓冲区。 2148 - 无穷大。 如果 PARALLEL_AUTOMATIC_TUNING 为 FALSE,通常值为 2148;如果 PARALLEL_AUTOMATIC_TUNING 为 TRUE ,则值为 4096 (根据操作系统而定)。parallel_max_servers integer 指定一个例程的并行执行服务器或并行恢复进程的最大数量。如果需要,例程启动时分配的查询服务器的数量将增加到该数量。 0 -256 由 CPU_COUNT, PARALLEL_AUTOMATIC_TUNING 和 PARALLEL_ADAPTIVE_MULTI_USER 确定 parallel_min_percent integer 指定并行执行要求的线程的最小百分比。设置该参数,可以确保并行执行在没有可用的恰当查询从属时,会显示一个错误消息,并且该查询会因此而不予执行。parallel_min_servers integer 指定为并行执行启动例程后,Oracle 创建的查询服务器进程的最小数量。 0 - PARALLEL_MAX_SERVERS。parallel_threads_per_cpu integer 说明一个 CPU 在并行执行过程中可处理的进程或线程的数量,并优化并行自适应算法和负载均衡算法。如果计算机在执行一个典型查询时有超负荷的迹象,应减小该数值 任何非零值。 根据操作系统而定 (通常为 2)2.当前时刻有那些并行查询在跑?14:13:46 SQL> desc v$px_session名称 是否为空? 类型----------------------------------------- -------- ------------------SADDR RAW(4)SID NUMBERSERIAL# NUMBERQCSID NUMBERQCSERIAL# NUMBERQCINST_ID NUMBERSERVER_GROUP NUMBERSERVER_SET NUMBERSERVER# NUMBERDEGREE NUMBERREQ_DEGREE NUMBER3.怎么才能让查询有并行执行?如果建表时指定了并行度,例:CREATE TABLE LI2.PAR_T(a VARCHAR2 (5))PARALLEL 5;那么对该表做全表扫描时就会并行14:26:05 SQL> set autot on14:26:11 SQL> select * from par_t;未选定行已用时间: 00: 00: 00.02Execution Plan----------------------------------------------------------0 SELECT STATEMENT Optimizer=CHOOSE (Cost=1 Card=82 Bytes=328)1 0 TABLE ACCESS* (FULL) OF 'PAR_T' (Cost=1 Card=82 Bytes=328) :Q60001 PARALLEL_TO_SERIAL SELECT /*+ NO_EXPAND ROWID(A1) */ A1."A" FROM "PAR_T" PX_GRANULE(0, BLOCK_RANGE,如果该表没有指定并行度,可以在查询时用hint 实现,例:select /*+ full(t) parallel(t,5) */ * from your_table t where ...;4.为什么本该并行执行的查询没有并行执行呢?系统的并行度由parallel_max_servers 决定,如果它的并行度为5.如果有一个并行度为5的查询在跑,那么系统在这条查询运行完成前是不能再跑并行查询的,该并行查询将会以非并行方式运行.5如果有并行度低于系统最大并行数的查询在跑,那接下来的并行查询会怎么跑呢?When you specify parallel degree 4 oracle tries to allocate 4 producer slaves and 4 consumer slaves. The producers can feed any of the consumers. If there are only 2 slaves available then we use these. If there is only 1 slave available then we go serial If there are none available then we use serial. If parallel_min_percent is set then we error ora 12827 instead of using a lower number of slaves or going serial6.设定parallel_max_servers 多大为好?在多CPU的环境中,一般把CPU-1或CPU的数量做个最大并行数,因为并行查询运行时还需要一个进程协调各并行进程.对于单CPU没什么好说的.7.并行查询能提高系统的性能吗?并行查询运行时,很容易会使机器运行在高负荷下,令系统对其它事务的处理时间大大加长.并行查询一般适合在非业务高峰值人工执行,并不适合在程序中指定运 行并行查询.PINNER:并行不等于快速,仅仅是适合在数据仓库环境,低业务请求与低并发操作的时候典型的OLTP系统,如果我们的系统,是绝对不允许并行查询出现的。

阅读更多
个人分类: oracle专栏
上一篇rman备份rac的总结
下一篇oracle进程说明
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭