精华内容
下载资源
问答
  • 在OLAP环境,以利用多的CPU和内存资源来加速处理数据,也即oracle的并行查询。单个CPU同一时刻只能服务一个进程,如果有多个CPU,提高CPU利用律,就可以同时运行多个进程。也就是原来单个进程处理的变成多个进程并行...

    在OLAP环境,以利用多的CPU和内存资源来加速处理数据,也即oracle的并行查询。单个CPU同一时刻只能服务一个进程,如果有多个CPU,提高CPU利用律,就可以同时运行多个进程。也就是原来单个进程处理的变成多个进程并行处理加速执行时间。并行执行只是在全表处理或者分区及在分区表中执行本地索引时用到。下面情况会用到并行查询:

    全表扫描、 rebuild index、update (全表或分区表)、insert的并行子查询、本地索引使用、批量插入,象SQLLDR、创建临时表

    比如我们执行

    select /*+ parallel(c1 ,2) */

    ...

    from customers c1

    order by ...process a process b

    fetch rows from fetch rows from

    customers customers

    || ||

    || ||

    ^^ ^^

    process c process d

    sort rows(a-k) sort rows(l-z)

    combine rows

    ||

    return result set

    这里我们看到这个进程分散成4个进程,排序中各负责a-k和l-z,这样就可以并行处理

    我们在分区表中,也可以用一个并行从进程对应一个分区表如果你的并行度是3,那么你可能就比普通的执行速度提高3倍

    注意在单CPU下,如果使用并行,那么就可能造成性能下降,而且也要设置合适的并行度

    并行适合对于长时间运行的语句

    在oltp可能并不适合使用并行处理,因为事务并发比较多,每个用户都要使用CPU,CPU的负载本来就比较高

    所以并行处理还是比较适合olap中的批量导入,sqlldr,mis report和oltp中rebuild index。

    1、看看并行选件是否安装

    Select * FROM V$OPTION

    where parameter like 'Parallel%';

    看看

    Parallel execution是不是TRUE

    2、如果是TRUE,执行语句后查看

    select * from V$pq_sesstat;

    where name like '%Parallelized';

    如果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 FALSE

    parallel_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 NUMBER

    SERIAL# NUMBER

    QCSID NUMBER

    QCSERIAL# NUMBER

    QCINST_ID NUMBER

    SERVER_GROUP NUMBER

    SERVER_SET NUMBER

    SERVER# NUMBER

    DEGREE NUMBER

    REQ_DEGREE NUMBER

    3.怎么才能让查询有并行执行?

    如果建表时指定了并行度,例:

    Create TABLE LI2.PAR_T

    (

    a VARCHAR2 (5)

    )

    PARALLEL 5;

    那么对该表做全表扫描时就会并行

    14:26:05 SQL> set autot on

    14:26:11 SQL> select * from par_t;

    未选定行

    已用时间: 00: 00: 00.02

    Execution 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) :Q6000

    1 PARALLEL_TO_SERIAL Select /*+ NO_EXPAND ROWID(A1) */ A1."A" FRO

    M "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 serial

    6.设定parallel_max_servers 多大为好?

    在多CPU的环境中,一般把CPU-1或CPU的数量做个最大并行数,因为并行查询运行时还需要一个进程协调各并行进程.对于单CPU没什么好说的.

    7.并行查询能提高系统的性能吗?

    并行查询运行时,很容易会使机器运行在高负荷下,令系统对其它事务的处理时间大大加长.并行查询一般适合在非业务高峰值人工执行,并不适合在程序中指定运行并行查询.

    PINNER:

    并行不等于快速,仅仅是适合在数据仓库环境,低业务请求与低并发操作的时候

    典型的OLTP系统,如果我们的系统,是绝对不允许并行查询出现的。

    个人倾向:在使用Oracle Parallel Server时候,尽量设置Parallel_min_percent为非0值,原因是因为,Parallel_min_percent=0的情况下,当slaves不足时,查询会串行化的进行,这样使得了查询的速度更慢;Parallel_min_percent<>0情况下,当slaves不足时Oracle会报出错误,这样比较容易清楚我们需要的slaves不足。

    展开全文
  • PostgreSQL中的并行查询

    2021-02-08 13:48:09
    有些查询并不能使用并行查询,或许是因为当前并行查询实现的限制,或许是因为没有比串行执行更好的选择。不过,对于那些可以使用并行查询的语句,获得的性能提高是显著的。那些需要检索很多数据但仅需返回几行的查询...

    作者:瀚高PG实验室(Highgo PG Lab) 丹心明月

    注:本文章主要翻译自《PostgreSQL 13.0 Documentation》第十五章

    PostgreSQL可生成使用多个CPU的查询计划,以更快的运行查询,即并行查询。有些查询并不能使用并行查询,或许是因为当前并行查询实现的限制,或许是因为没有比串行执行更好的选择。不过,对于那些可以使用并行查询的语句,获得的性能提高是显著的。那些需要检索很多数据但仅需返回几行的查询,性能提升最为明显。本章就并行查询的工作原理及使用场景进行了简单介绍。

    15.1 并行查询如何工作

    当优化器认为并行查询是最优策略时,则会创建一个含Gather或Gather Merge节点的执行计划。以下为简单示例:

    EXPLAIN SELECT * FROM pgbench_accounts WHERE filler LIKE '%x%';
    QUERY PLAN
    -------------------------------------------------------------------------------------
    Gather (cost=1000.00..217018.43 rows=1 width=97)
        Workers Planned: 2
        -> Parallel Seq Scan on pgbench_accounts (cost=0.00..216018.33 rows=1 width=97)
            Filter: (filler ~~ '%x%'::text)
    (4 rows)

     Gather或Gather Merge节点会包含一个并行查询的子执行计划。如果Gather或Gather Merge节点位于最顶层,那么整个查询均会并行执行;如果其位于执行计划树的其他层,那么仅其下的部分才会并行执行。

     

    使用EXPLAIN,可以看到并行度。查询执行期间,若使用并行查询,那么会使用与执行计划选定的并行度一致数量的后台进程。执行计划所选用的并行度,最大为max_parallel_workers_per_gather。在同一时段,可同时存在的总并行度由参数max_worker_precessesmax_parallel_workers决定。因此,可能并行度会低于执行计划中规划的并行度,甚至没有并行。如果这种问题经常发生,那么可以考虑调大max_worker_precessesmax_parallel_workers或者调低max_parallel_workers_per_gather

     

    Gather Merge会对数据排序。

    15.2 何时可用并行查询

    有几个设置可以导致执行计划器无论如何都不会产生并行执行计划。为可以生成并行的查询计划,需进行以下设置:

    此外,数据库系统不可运行在单用户模式。

     

    即使进行了以上设置,但如果以下情形不真,那么查询可能还是无法并行执行:

    • 查询写入数据或锁定行。如果查询更改数据,那么就不会生成并行执行计划。例外情形:CREATE TABLE...AS,SELECT INTO和CREATE MATERIALIZED VIEW命令可使用并行;

    • 在执行期间可能暂停的查询。例如,使用DECLARE CURSOR创建的游标,永不会使用并行执行计划。同理,PL/pgSQL中,FOR x IN query LOOP... END LOOG循环也不会使用并行查询计划;

    • 使用标记为PARALLEL UNSAFE函数的查询。大部分系统预定义的函数是PARALLEL SAFE的,但是用户自定义的函数,默认是PARALLEL UNSAFE的。更多请参见第15.4节

    • 运行在并行查询内的查询。例如,并行查询的语句调用了一个函数,那么函数内的语句都不会再进行并行查询了;

    对于特定查询,虽然生成了并行执行计划,但在某些特定场景下,在查询执行时却不会进行并行查询。此类现象在以下情形下会发生:

    因为max_worker_processes的限制,无法获得并行度;

    因为max_parallel_workers的限制,无法获得并行度;

    客户端发送的执行消息的读取计数非零,参见52.2.3节扩展查询。

    15.3 并行执行计划

    因为每个工作者(worker)执行计划的一部分直到完成,所以无法只是简单的采用一个普通的执行计划,然后运行多个工作者。如果这样,每个工作者都需要生成输出结果集的完整拷贝,这样查询不会比串行执行更快,且还会造成不正确的结果。因此,计划的并行部分必须在查询优化器内部是部分计划,也就是说,执行计划的每个流程仅生成输出行的一个子集,以确保每个所需的输出行均由其中一个协作流程准确地生成。通常,这意味着对查询的驱动表的扫描必须是并行感知的扫描。

    15.3.1 并行扫描

    当前支持以下类型的并行表扫描:

    • 在并行顺序扫描(parallel sequential scan)中,表块在协作进程之间分配。一次分发一块,以保证对表访问的顺序。

    • 在并行位图堆扫描(parallel bitmap heap scan)中,会选定一个进程为主进程。

    • 在并行索引扫描(parallel index scan)或并行仅索引扫描(parallel index-only scan)中,协作进程轮流从索引中读取数据。当前,仅b树索引支持并行索引扫描。

    其他扫描类型,例如非b树索引扫描,或许在将来会支持并行扫描。

    15.3.2 并行表连接

    类似于非并行执行计划,驱动表可能使用嵌套循环、hash连接或merge连接方式与其他表进行连接。取决于表连接类型,连接内部也可以是并行计划:

    • 在nested loop连接中,连接内部是非并行的。

    • merge join中,连接内部是非并行的。

    • 在未使用parallel前缀的hash连接中,连接内部是非并行的。而在parallel hash连接中,连接内部为并行hash。

    15.3.3  并行聚合

    PostgreSQL通过两阶段聚合方式支持并行聚合。首先,参与查询并行部分的每个进程执行一个聚合步骤,为该进程的每个组生成部分结果。这在执行计划中为“Partial Aggregate”节点。其次,将部分结果通过“Gather”或“Gather Merge”转移到主进程。最后,主进程重新汇总所有结果,以产生最终结果。这在执行计划中为Finalize Aggregate节点。

     

    因为Finalize Aggregate节点是在主进程上运行,因此与输入行数相比,产生相对大量组的查询对查询计划者而言不太有利。例如,在最坏的情况下,“Finalize Aggregate”节点所看到的组数可能与“Partial Aggregate”阶段中所有工作进程所看到的输入总行数一样多。对于这种情况,使用并行聚合显然不会对性能产生任何好处。查询计划器在计划过程中会考虑到这一点,因此在这种情况下不太可能选择并行聚合。

     

    并非在所有情况下都支持并行聚合。每个聚合必须是并行安全,且必须具有合并功能。如果聚合具有internal类型的过渡状态,则它必须具有序列化和反序列化功能。有关更多详细信息,请参见 CREATE AGGREGATE。如果任何聚合函数调用时包含了DISTINCT或ORDER BY子句,则不支持并行聚合,对于有序集聚合或当查询涉及GROUPING SETS时,也不支持并行聚合。仅当查询中涉及的所有表连接也是计划中并行部分的一部分时,才可以使用。

    15.3.4 并行追加

    当PostgreSQL需要从多个数据源将行组合成一个结果集时,会使用Append或MergeAppend计划节点。这一般出现在使用UNION ALL或者访问分区表的时候。这也可以使用并行执行计划。不过在并行执行计划中,是Parallel Append节点。

     

    当在并行计划中使用Append节点时,每个流程将按照它们出现的顺序执行子计划,以便所有参与的流程合作执行第一个子计划,直到完成为止,然后几乎同时移至第二个子计划。当使用Parallel Append时,会同时执行多个子计划。这可以避免争用,也可以避免在从未执行子计划的进程中耗费子计划的启动成本。

     

    同样,与常规Append节点不同,常规追加节点在并行计划中使用时只能具有部分子项,而Parallel Append节点可以同时具有部分和非部分子计划。非部分子计划仅由一个过程进行扫描,因为多次扫描会产生重复的结果。因此,即使没有有效的局部计划,涉及附加多个结果集的计划也可以实现粗粒度的并行性。例如,考虑只能使用不支持并行扫描的索引对分区表的查询。计划器可能选择“Index Scan”计划的“Parallel Append“;每个单独的索引扫描都必须由单个进程执行才能完成,但是可以使用不同的进程同时执行不同的扫描。

     

    可使用参数enable_parallel_append启用/禁用该特性。

    15.3.5 并行执行计划小贴士

    如果预期使用并行的查询却没有使用并行执行计划,那么可以通过调整parallel_setup_costparallel_tuple_cost进行处理。当然,修改之后可能会被证实,执行计划器选择的串行执行方式可能更快;但也不一定。如果即使将这两个参数都设置成了0,还是得不到并行执行计划,那么建议再温习下第15.2节第15.4节

     

    当执行并行计划时,可使用EXPLAIN(ANALYZE,VERBOSE)来查看每个计划节点任务的执行状态信息。

    15.4 并行安全性

    执行计划将查询中的操作分为:并行安全(parallel safe),并行限制(parallel restricted)或并行不安全(parallel unsafe)。并行安全的操作与使用并行查询不冲突。并行限制操作不能出现在并行工作者的处理中,但可以由并行查询的主进程执行。因此,并行限制操作不会在Gather或Gather Merge节点下出现,但可以在包含此类节点的执行计划的其他地方出现。并行不安全操作则不能进行并行执行。所以,如果查询包含并行不安全操作,则就完全与并行查询无缘了。

     

    • 以下操作为并行限制操作:

    • CTE表的扫描;

    • 临时表的扫描;

    • 外部表的扫描(使用IsForeignScanParallelSafe API的除外);

    • 附加到InitPlan的执行计划节点;

    • 引用相关子计划的节点。

    15.4.1 为函数和聚合加并行标签

    因为需要预先知晓函数可能执行的所有操作,所以计划器不能自动识别用户自定义的函数或聚合是并行安全、并行受限还是并行不安全。即使是简单的函数,也不会去解析函数中所有的操作,因为这样成本很高且容易出错。取而代之的是,如果没有特别指定,则默认所有用户自定的函数均为并行不安全的。当使用 CREATE FUNCTIONALTER FUNCTION时,可通过使用PARALLEL SAFE,PARALLEL RESTRICTED或PARALLEL UNSAFE进行指定。 CREATE AGGREGATE的parallel选项也可通过SAFE,RESTRICTED或UNSAFE指定。

     

    如果函数和聚合会写数据库,访问序列,即使是临时改变事务状态(例如,PL/pgSQL函数中定义EXCEPTION块以捕获异常)或对设置进行永久修改,均必须设置为PARALLEL UNSAFE。如果函数访问临时表,客户端连接状态,游标,预准备语句或系统无法在工作进程之间同步的其他后端本地状态(例如setseed和random),则必须将其设置为PARALLEL RESTRICTED。

     

    通常,如果函数是并行受限或不安全的,却被标记为并行安全;或者如果函数是并行不安全的,却被标记为并行受限,那么函数会报错或者在使用并行查询时返回错误的结果。如果未正确定义,那么C语言函数可能出现完全未定义的行为。如果不知道怎么定义,那么最好将函数标记为UNSAFE。

     

    如果在并行工作者执行的函数获得了主进程未持有的锁,例如通过查询在查询语句中未涉及到的表,则这些所在工作者结束时释放,而不是在事务结束时才释放。如果编写的函数有此种行为,可通过标记函数为PARALLEL RESTRICTED以确保仅在主进程中执行。

     

    请注意,查询执行计划器不会为了获取更好的执行计划而推迟对查询中涉及的并行受限函数或聚合的计算。所以,例如,如果where子句限制的某个表是并行受限的,那么查询计划器不会在执行计划的并行部分扫描该表。虽然在某些情形下,延迟where子句的计算并在执行计划的并行部分扫描这些表效率更高,但是执行计划器不会这样做。

    展开全文
  • 并行查询(Parallel Query)

    千次阅读 2021-02-07 23:35:06
    通过Hint来控制并行查询使用Hint语法可以对单个语句进行控制,例如系统默认关闭并行查询情况下,但需要对某个高频的慢SQL查询进行加速,此时就可以使用Hint对特定SQL进行加速。您可以使用如下任意一种方式开启并行...

    通过Hint来控制并行查询

    使用Hint语法可以对单个语句进行控制,例如系统默认关闭并行查询情况下,但需要对某个高频的慢SQL查询进行加速,此时就可以使用Hint对特定SQL进行加速。

    您可以使用如下任意一种方式开启并行查询:SELECT /*+PARALLEL(x)*/ ... FROM ...; -- x >0

    SELECT /*+ SET_VAR(max_parallel_degree=n) */ * FROM ... // n > 0

    您可以使用如下任意一种方式关闭并行查询:SELECT /*+NO_PARALLEL()*/ ... FROM ...;

    SELECT /*+ SET_VAR(max_parallel_degree=0) */ * FROM ...

    Hint高级用法

    并行查询提供了PARALLEL和NO_PARALLEL两种Hint。

    通过PARALLEL Hint可以强制查询并行执行,同时可以指定并行度和并行扫描的表。

    通过NO_PARALLEL Hint可以强制查询串行执行,或者指定不选择某些表作为并行扫描的表。

    Hint语法如下所示:/*+ PARALLEL [( [query_block] [table_name] [degree] )] */

    /*+ NO_PARALLEL [( [query_block] [table_name][, table_name] )] */

    其中参数说明如下所示。

    参数

    说明

    query_block

    应用Hint的query block名称。

    table_name

    应用Hint的表名称。

    degree

    并行度。

    示例:SELECT /*+PARALLEL()*/ * FROM t1, t2;

    -- 当表记录数小于records_threshold_for_parallelism设置的行数 ( 默认10000行)时,会强制并行,

    -- 并行度用系统默认max_parallel_degree, 如果max_parallel_degree > 0,

    -- 则打开并行,如果max_parallel_degree等于0时,依旧时关闭并行。

    SELECT /*+PARALLEL(8)*/ * FROM t1, t2;

    -- 强制并行度8并行执行,

    -- 当表记录数小于records_threshold_for_parallelism设置的行数 ( 默认10000行)时,会强制并行,

    -- 并行度设置max_parallel_degree为8。

    SELECT /*+ SET_VAR(max_parallel_degree=8) */ * FROM ...

    -- 设置并行度max_parallel_degree为8,

    -- 当表记录数小于records_threshold_for_parallelism设置的行数(如20000行)时,会自动关闭并行。

    SELECT /*+PARALLEL(t1)*/ * FROM t1, t2;

    -- 选择t1表并行, 对t1表执行/*+PARALLEL()*/ 语法

    SELECT /*+PARALLEL(t1 8)*/ * FROM t1, t2;

    -- 强制并行度8且选择t1表并行执行, 对t1表执行/*+PARALLEL(8)*/语法

    SELECT /*+PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

    --强制subquery并行执行, 并行度用系统默认max_parallel_degree,

    -- 如果max_parallel_degree > 0, 则打开并行,max_parallel_degree等于0时,依旧时关闭并行

    SELECT /*+PARALLEL(@subq1 8)*/ SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

    --强制subquery并行执行, 并行度设置max_parallel_degree为8

    SELECT SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+PARALLEL()*/ SUM(t1.a) FROM t1);

    --强制subquery并行执行,

    -- 并行度用系统默认max_parallel_degree,

    -- 如果max_parallel_degree > 0, 则打开并行,max_parallel_degree等于0时,依旧时关闭并行

    SELECT SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+PARALLEL(8)*/ SUM(t1.a) FROM t1);

    --强制subquery并行执行, 设置并行度max_parallel_degree为8

    SELECT /*+NO_PARALLEL()*/ * FROM t1, t2;

    -- 禁止并行执行

    SELECT /*+NO_PARALLEL(t1)*/ * FROM t1, t2;

    -- 只对t1表禁止并行, 当系统打开并行时, 有可能对t2进行并行扫描,并行执行

    SELECT /*+NO_PARALLEL(t1, t2)*/ * FROM t1, t2;

    -- 同时对t1和t2表禁止并行

    SELECT /*+NO_PARALLEL(@subq1)*/ SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+QB_NAME(subq1)*/ SUM(t1.a) FROM t1);

    --禁止subquery 并行执行

    SELECT SUM(t.a) FROM t WHERE t.a =

    (SELECT /*+NO_PARALLEL()*/ SUM(t1.a) FROM t1);

    --禁止subquery 并行执行

    说明 对于不支持并行的查询或者并行扫描的表,PARALLEL Hint不生效。

    并行子查询的选择方式(并行子查询详细信息请参见/*+ PQ_PUSHDOWN [( [query_block])] */ 对应的子查询会选择push down的并行子查询执行策略

    /*+ NO_PQ_PUSHDOWN [( [query_block])] */ 对应的子查询会选择shared access的并行子查询执行策略

    示例:#子查询选择push down并行策略

    EXPLAIN SELECT /*+ PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =

    (SELECT /*+ qb_name(qb1) */ a FROM t1);

    #子查询选择shared access并行策略

    EXPLAIN SELECT /*+ NO_PQ_PUSHDOWN(@qb1) */ * FROM t2 WHERE t2.a =

    (SELECT /*+ qb_name(qb1) */ a FROM t1);

    #不加query block进行控制

    EXPLAIN SELECT * FROM t2 WHERE t2.a =

    (SELECT /*+ NO_PQ_PUSHDOWN() */ a FROM t1);

    展开全文
  • Oracle 并行查询 parallel Query 81 53,5297P_Base_Day_I_NewTaredUser2009-06-25 17:28:562009-06-25 18:24:2155insert成功base 82 53,5300P_BASE_DAY_I_NEWTAREDUSER_test2009-06-25 17:29:312009-06-25 17:54:...

    Oracle 并行查询 parallel Query 81 53,5297P_Base_Day_I_NewTaredUser2009-06-25 17:28:562009-06-25 18:24:2155insert成功base 82 53,5300P_BASE_DAY_I_NEWTAREDUSER_test2009-06-25 17:29:312009-06-25 17:54:2124insert成功base 这是两个同样的过程 访问

    Oracle 并行查询 parallel Query

    81 53,5297 P_Base_Day_I_NewTaredUser 2009-06-25 17:28:56 2009-06-25 18:24:21 55 insert 成功 base

    82 53,5300 P_BASE_DAY_I_NEWTAREDUSER_test 2009-06-25 17:29:31 2009-06-25 17:54:21 24 insert 成功 base

    这是两个同样的过程 访问6千万的数据进行inner join 统计 前个花了55分钟 后一个花了24分钟

    insert /*+parallel(t_newtraed_test,4) */ into t_newtraed_test

    select b.addtime,0,b.username,sysdate,0,c.lotid,0,c.playid,0,0,sysdate

    from

    (

    select username,min(addtime) as addtime

    from

    (

    select /*+ PARALLEL(x, 5) PARALLEL(z, 5)*/ x.F_username as username ,x.f_addtime as addtime

    from T_Gather_ProUser x

    INNER JOIN t_gather_project z ON x.f_projectid = z.f_id and x.f_lotteryid=z.f_lotteryid

    ....

    对表可以

    ALTER TABLE BA.P_ADMIN PARALLEL ( DEGREE Default INSTANCES Default );

    这个由ORACLE 自己决定

    可经常报 ORA-12801: 并行查询服务器 P029 中发出错误信号

    ORA-00018: 超出最大会话数

    由此可见 它开了太多的会话数。

    下面些资料可供参考

    由OPQ划分的表

    一旦表被划分成块,Oracle启用并行的子查询(有时称为杂务进程),每个子查询同时读取一个大型表中的一块。所有子查询完毕以后,Oracle将结果会传给并行查询调度器,他会重新安排数据,如果需要则进行排序,并且将结果传递给最终用户。OPQ具有无限的伸缩性,因此,以前需要花费几分钟的全表检索目前的响应时间却不到1秒。

    OPQ严重依赖于处理器的数量,通过并行运行之所以能极大地提升全表检索的性能,其前提就是使用了N-1个并行进程(N=Oracle服务器上CPU的数量)。

    必须注意非常重要的一点,即Oracle9i能够自动检测外部环境,包括服务器上CPU的数量。在安装时,Oracle9i会检查服务器上CPU的数量,设置一个名为cpu_count的参数,并使用cpu_count作为默认的初始化输入参数。这些初始化参数会影响到Oracle对内部查询的处理。

    下面就是Orale在安装时根据cpu_count而设置的一些参数:

    fast_start_parallel_rollback

    parallel_max_servers

    log_buffer

    db_block_lru_latches

    参数

    让我们进一步看看CPU的数量是怎么影响这些参数的。

    参数fast_start_parallel_rollback

    Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚得能力。当Oracle数据库发生少有的崩溃时,Oracle能自动检测未完成的事务并回滚到起始状态。这被称为并行热启动,而Oracle使用基于cpu_count的fast_start_parallel_rollback参数来决定未完成事务的秉性程度。

    并行数据操纵语言(DML)恢复能够在Oracle数据库崩溃后极大地加快其重新启动的速度。此参数的默认值是系统CPU数量的两倍,不过一些DBA们认为应该将这个值设置为cpu_count的四倍。

    参数parallel_max_servers_parameter

    Oracle一个显著的加强是自动决定OPQ并行的程度。由于Oracle清晰服务器中CPU的数量,他会自动分配合适的子进程的数量来提升并行查询的响应时间。当然,会有其他的外部因素,比如表的划分及磁盘输入/输出子系统的布局等,不过根据cpu_count来设置parallel_max_servers参数将给Oracle一个合理的依据来选择并行的程度。

    由于Oracle的并行操作严重依赖服务器上CPU的数量,parallel_max_servers会被设置成服务器上CPU的数量。如果在一台服务器上运行多个实例,则默认值太大了,会导致过度的页面交换和严重的CPU负担。并行的程度还依赖于目标表中分区的数量,因此parallel_max_servers应该设置成足够大以允许Oracle为每个查询选择最佳数量的并行子查询。

    参数log_buffer

    参数log_buffer定义了供即刻写入redo日志信息的保留RAM的数量,这个参数受cpu_count的影响。Oracle推荐log_buffer最大为cpu_count乘以500KB或128KB。CPU的数量对于log_buffer来说非常重要,因为Oracle会生成多日志写入(LGWR)进程来异步释放redo信息。

    log_buffer是Oracle中最易误解的的RAM参数之一,通常存在下面几个设置错误:

    log_buffer被设置得太高(例如,大于1MB),这回引起性能问题,因为大容量的结果会使得写入同步进行(例如,日志同步等待事件非常高)。log_buffer不是db_block_size的倍数。在的Oracle9i中,log_buffer应该是2048字节的倍数。

    参数db_block_lru_latches

    LRU锁的数量是在Oracle数据库内部用来管理数据库缓冲的,这严重依赖于服务器上CPU的数量。

    非常多聪明的Oracle9i的DBA使用多冲数据缓冲(例如db_32k_cache_size),他们推荐将这个未公开声明的参数重设置为默认的最大值。db_block_lru_latches参数在Oracle8i中使用得非常多,不过在Oracle9i中变成了一个未公开声明的参数,因为Oracle目前根据数据库拥有的CPU数量设置了一个合理的默认值。

    db_block_lru_latches默认被设置为服务器上cpu_count的一半(例如服务器上只有一个Oracle数据库)。Oracle推荐db_block_lru_latches千万不要超过cpu_count的两倍或三倍,或db_block_buffers的五十分之一。

    如果使用多缓冲池则这种计算方法有一个问题,因为不能控制分配给每个数据缓冲池的锁的数量。如果db_writers参数大于1,则默认值或许显得太小。

    加强服务器

    Oracle数据库总是在提升性能,根据外部服务器环境检测cpu_count和基本参数设置的能力对于Oracle软件来说是个重要的加强。

    随着更多的Oracle系统转移到SMP上来,当客户要采取增强措施并将众多的数据库转移到拥有32个或64个CPU的巨大服务器上来的时候,这些参数显得愈发重要。

    本文原创发布php中文网,转载请注明出处,感谢您的尊重!

    展开全文
  • java并行查询数据库什么是并行数据库流? 阅读这篇文章,了解如何使用并行流和Speedment并行处理数据库中的数据。 在许多情况下,并行流可能比通常的顺序流快得多。 随着Java 8的引入,我们得到了期待已久的Stream...
  • mysql并行查询问题

    2021-01-18 18:55:18
    如果一个线程查询一张表耗时 2s,那么要实现的是 4个线程跑完也是耗时 2s(利用cpu多核真正并行),但现实是耗时 2 * 4 约等于 8s多。真的困扰多时的一个问题,还望大佬相助,跪谢!附上mysql参数:+-----------------...
  • 相对于DDL、DML等类型操作,并行查询更可以作为系统功能的一个步骤来进行。 进行并行查询最大的风险就是并行滥用和失控的出现。这也是Oracle一直致力解决的问题。在Oracle11gR2中,引入了Parallel Statement Queuing...
  • mysql并行查询语句

    2021-01-19 04:27:54
    {"moduleinfo":{"card_count":[{"count_phone":1,"count":1}],"search_count":[{"count_phone":4,"count":4}]},"card":[{"des":"阿里云数据库专家保驾护航,为用户的数据库应用系统进行性能和风险评估,参与配合进行...
  • 为了提高性能,我们针对Oracle数据库本身提供了的方法或方案进行过不少的偿试主要包括:共享服务器模式(MTS)集群技术(Clustering),RAC分区并行处理(主要是并行查询)Oracle提供的这些特性确实是用来进行性能改善的,但...
  • postgresql的并行查询

    2021-11-18 15:14:39
    postgresql的并行查询 9.6版本之前不支持并行查询,9.6+版本支持并行查询有限,10+版本增强并行查询功能 10版本暂不支持非btree索引类型的并行索引扫描 并行查询的相关参数 ##设置系统支持的最大后台进程数,备库...
  • 当我们在使用Oracle数据库的时候会发现Oracle数据库并行查询出错这一问题,那么你知道如何解决Oracle数据库并行查询出错吗?下面就是解决Oracle数据库并行查询出错的方法介绍。Oracle的并行查询是使用多个操作系统...
  • 搜索热词Oracle的并行查询是使用多个操作系统级别的Server Process来同时完成一个SQL查询,本文讲解Oracle数据库并行查询出错的解决方法如下:1、错误描述sql;">ORA-12801: 并行查询服务器P007中发出错误信号ORA-...
  • Oracle并行查询出错

    2021-05-04 01:18:53
    1、错误描述ORA-12801: 并行查询服务器P007中发出错误信号ORA-01722:无效数字12801.00000 -"error signaled in parallel query server %s"*Cause: A parallel query server reached an exception condition.*Action:...
  • 本文将介绍基于代价进行并行优化、并行执行的云数据库的并行查询引擎的关键问题和核心技术。 作者 | 智邻 来源 | 阿里技术公众号 一 背景 随着数据规模的不断扩大,用户SQL的执行时间越来越长,这不仅对数据库...
  • 本文首发于 GreatSQL社区 微信公众号。GreatSQL马上正式开源了,这次又新增了两个重磅特性:InnoDB事务锁优化以及InnoDB引擎的并行查询优化,这两个特性是由华为鲲鹏...
  • 并行查询--dba手册

    2021-07-03 20:52:02
    22.8 并行查询 22.8.1 并行查询概念 倘若没有并行查询技术,一个串行执行的查询语句只能利用 CPU 或者磁盘设备中的一 个,而不能利用整个计算机的处理能力。并行查询技术的出现,使得单个 SQL 语句能利用 多个 CPU ...
  • 摘要:GaussDB(for MySQL)并行查询为何快人一步?华为云数据库内核专家这样说
  • Oracle11gRAC跨节点并行查询的控制,跟先前的版本有所变化:参数instance_groups被废弃,并新增加了参数:PARALLEL_FORCE_LOCAL来限制内部节点的并行操作.使用Services来确定并行查询将在哪些节点上执行.参数...
  • 正在看的ORACLE教程是:用Oracle并行查询发挥多cpu的威力。参数 让我们进一步看看cpu的数量是如何影响这些参数的。 参数fast_start_parallel_rollback Oracle并行机制中一个令人兴奋之处是在系统崩溃时调用并行回滚得...
  • PG11开始支持CREATE TABLE … AS、SELECT INTO以及CREATE MATERIALIZED VIEW的并行查询。 先说结论: 换用create table as 或者select into或者导入导出。 首先跟踪如下查询语句的执行计划: select count(*) from ...
  • 开启并行查询,但是发现开启并行查询反而不如不开启的sql执行效率高.. select /*+ parallel(pre, 4) */ count(1) from task t inner join extract e on t.TASK_ID = e.TASKID inner join GRKHXXB_PRE pre on...
  • PostgreSQL 9.6 版本前还不支持并行查询, SQL 无法利用多核CPU 提升性能, PostgreSQL 9.6 版本开始支持并行查询,只是9.6 版本的并行查询所支持的范围非常有限【只在顺序扫描、多表关联、聚合查询中支持并行】 ...
  • 作者:阎书利 max_worker_processes...设置系统支持的并行查询进程数,默认8 这个参数值不能高于max_worker_processes 调整这个参数,建议同时调整max_parallel_workers_per_gather参数值 max_parallel_workers
  • 原文很好翻译,直接读好理解长久以来MySQL没有并行查询,并且在其他数据库已经有了的情况下,MySQL终于在8.0.14版本开始有了自己的并行查询,但使用面非常的窄,只适用于并行聚集索引的count(*) 并且只是在没有where...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 207,582
精华内容 83,032
关键字:

并行查询