提供7*24专业Sybase数据库远程及现场技术支持,Sybase ASE及Sybase SQL Anywhere数据库修复服务,
请联系电话: (微信),QQ: 289965371!
We supply technical support for Sybase ASE and Sybase SQL Anywhere, also have many years of experience in recovering data from damanged Sybase devices.
Please contact us:
Phone:
Wechat: 13811580958
QQ: 289965371 联系我们获取数据库技术支持!
Email: 289965371@qq.com
扫描下方微信,联系我们:
扫描雨翰数据恢复官方微信获取专业数据库恢复服务

 

随着Sybase被完全整合到SAP下,Sybase原来的支持网站被SAP Support Portal取代。
只有购买了SAP服务的用户才能使用账号登录SAP Support Portal进行介质下载、补丁升级、报Incident等。
目前,原Sybase所有产品(包括:Adaptive Server Enterprise、Sybase IQ、Replication Server、PowerDesigner等)的官方手册仍然可以从https://infocenter.sybase.com/help/index.jsp进行浏览或下载。暂不清楚该网站https://infocenter.sybase.com/help/index.jsp何时会被完全迁移到SAP Support上!
Sybase官方手册英文版有html和pdf两种格式,而中文版手册只有pdf一种格式。为了国内Sybase用户更方便、快捷地搜索Sybase常见产品的官方手册内容,特将中文版Sybase官方手册转为html格式!
Sybase产品官方手册中文版的html格式所有内容的版权归SAP公司所有!本博客站长是Sybase数据库的铁杆粉丝!

如有Sybase数据库技术问题需要咨询,请联系我!

  QQ :289965371 联系我们获取数据库技术支持!
  Email:

以下官方手册为ASE 15.7 ESD#2中文版:

  1. 新增功能公告 适用于 Windows、Linux 和 UNIX 的 Open Server 15.7 和 SDK 15.7
  2. 新增功能摘要
  3. 新增功能指南
  4. ASE 15.7 发行公告
  5. 配置指南(windows)
  6. 安装指南(windows)
  7. 参考手册:构件块
  8. 参考手册:命令
  9. 参考手册:过程
  10. 参考手册:表
  11. Transact-SQL® 用户指南
  12. 系统管理指南,卷 1
  13. 系统管理指南,卷 2
  14. 性能和调优系列:基础知识
  15. 性能和调优系列:锁定和并发控制
  16. 性能和调优系列:监控表
  17. 性能和调优系列:物理数据库调优
  18. 性能和调优系列:查询处理和抽象计划
  19. 性能和调优系列:使用 sp_sysmon 监控 Adaptive Server
  20. 性能和调优系列:利用统计分析改进性能
  21. 程序员参考 jConnect for JDBC 7.0.7
  22. Adaptive Server Enterprise 中的 Java
  23. 组件集成服务用户指南
  24. Ribo 用户指南
  25. 内存数据库用户指南
  26. Sybase Control Center for Adaptive Server® Enterprise
  27. 安全性管理指南
  28. 实用程序指南

 


< 上一个 | 内容 | 下一步 >

Adaptive Server 并行查询执行模型

并行查询执行模型的一个重要组成部分是 EXCHANGE 运算符。您可以从 查询的 showplan 输出中查看它。


EXCHANGE 运算符

EXCHANGE 运算符标记生产者运算符和使用者运算符间的边界

EXCHANGE 运算符之下的运算符产生数据,而位于它之上的运算符则 消耗数据)。示例 A 显示了对 titles 表进行并行扫描 ( select * from titles )EXCHANGE: EMIT SCAN 运算符产生数据。下例对此进行了 简要说明。

select * from titles


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes.

|


| |EXCHANGE:EMIT Operator

| |

| | |RESTRICT Operator

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | titles

| | | | Table Scan.

在本例中,一个消耗程序进程从管道 (用作跨进程边界传送数据的介 质)读取数据,并将数据传递给 emit 运算符,该运算符又会将结果发送 至客户端。 exchange 运算符还生成工作进程,这些进程称为生产者线 程。 exchange:emit 运算符将数据写入由 exchange 运算符管理的管道。

5-1:将线程绑定到查询计划中的计划片段

image


5-1 显示了生产者进程和消耗程序进程之间的进程边界。该查询计划 中有两个计划片段。包含 scan exchange:emit 运算符的计划片段通过 三路复制,并由三对一的 exchange 运算符将其写入管道。emit 运算符和 exchange 运算符由单个进程运行,这意味着仅对该计划片段复制一次。


管道管理


exchange 运算符管理四类管道,这些管道按照其拆分和合并数据流的方 式进行区分。通过在 showplan 输出 (其中显示了生产者和使用者的数 目)中查看 exchange 运算符的说明,可以确定由该运算符管理的管道类 型。下面对这四种管道类型进行了说明。


多对一 在此情况下, exchange 运算符将生成多个生产者线程来向一个管道写入 数据,并只有一个使用者任务读取该管道中的数据。在上一示例中, exchange 运算符实现的就是多对一的 exchange。多对一的 exchange 运算 符可以保留原有顺序,这一技术尤其适用于以下情况:为 order by 子句 执行并行排序,并且结果数据流被合并,以生成最终顺序。 showplan 输 出显示多个生产者进程以及一个消耗程序进程。

|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes

一对多 在此情况下,存在一个生产者线程和多个使用者线程。生产者线程根据 查询优化时设计的分区方案将数据写入多个管道中,然后将数据传送给 各个管道。每个使用者线程都从一个分配的管道读取数据。这种数据拆 分方式可保留数据的顺序。 showplan 输出显示一个生产者进程以及多个 消耗程序进程:

|EXCHANGE Operator (Repartitioned)

|Executed in parallel by 1 Producer and 4 Consumer processes

多对多 “多对多”意味着存在多个生产者和多个使用者。每个生产者向多个管 道写入数据,而每个管道又拥有多个使用者。每个流都将写入管道。每 个使用者线程都从一个分配的管道读取数据。

|EXCHANGE Operator (Repartitioned)

|Executed in parallel by 3 Producer and 4 Consumer processes

复制型 exchange

运算符

在此情况下,生产者线程将它的所有数据写入 exchange 运算符配置的每 个管道中。生产者线程会生成源数据的大量副本 (该数量由查询优化程 序指定),其数目等于 exchange 运算符中的管道数。每个使用者线程都 从一个分配的管道读取数据。 showplan 输出显示了这一情况,如下所示:

|EXCHANGE (Replicated)

|Executed in parallel by 3 Producers and 4 Consumer processes


工作进程模式


并行查询计划由多个不同的运算符组成,其中至少有一个 exchange 运算 符。在运行期,并行查询计划会绑定到一组服务器进程上,这组进程会 一起以并行方式执行该查询计划。

与用户连接相关联的服务器进程称为 alpha 进程,这是因为它是启动并 行执行的源进程。具体来说,执行并行查询计划时所涉及的每个工作进 程都是由 alpha 进程生成的。


除生成工作进程外, alpha 进程还初始化计划执行过程中所涉及的所有 工作进程。此外,它还创建并损坏工作进程交换数据所必需的管道。 alpha 进程实际上是执行并行查询计划的全局事务协调器。

在运行期, Adaptive Server 将计划中的每个 exchange 运算符与一组工作 进程相关联。这些工作进程会执行位于 exchange 运算符正下方的查询计 划片段。

对于示例 A (如 136 页的 “ EXCHANGE 运算符”中所述)中的查 询,exchange 运算符与 3 个工作进程相关联。每个工作进程都会执行由 exchange:emit 运算符及 scan 运算符构成的计划片段。

5-2:包含一个 exchange 运算符的查询执行计划


titlesÔºà3 ‰³


titlesÔºà3 ‰³

image


每个 exchange 运算符也与一个服务器进程相关联,该进程称为 beta 进 程,它可以是 alpha 进程,也可以是工作进程。与给定的 exchange 运算 符相关联的 beta 进程是执行 exchange 运算符下的计划片段的局部事务 协调器。在上一示例中, beta 进程与 alpha 进程相同,原因是要执行的 计划仅包含一个级别的 exchange 运算符。


接下来,我们将使用此查询来说明当查询计划中包含多个 exchange 运算 符时的情形:

select count(*),pub_id, pub_date from titles

group by pub_id, pub_date

5-3:包含两个 exchange 运算符的查询执行计划

image


5-3 中,存在两级 exchange 运算符,分别标记为 EXCHANGE-1 EXCHANGE-2。工作进程 T4 是与 exchange 运算符 EXCHANGE-2 相关 联的 beta 进程。

beta 进程可在局部协调 exchange 运算符下的计划片段的执行;它分派工 作进程所需的查询计划信息,并同步计划片段的执行。

alpha 进程和 beta 进程外,在并行查询计划的执行过程中,还会涉及 另一种进程,称为 gamma 进程


给定的并行查询计划在运行期会绑定到唯一的 alpha 进程、一个或多个 beta 进程以及至少一个 gamma 进程。任何 Adaptive Server 并行计划都需 要至少两个不同的进程 (alpha gamma)才能并行执行。

要找出 exchange 运算符与工作进程之间的映射,并确定哪个进程是

alpha 进程以及哪些进程是 beta 进程,请使用 dbcc traceon(516)

=======Thread to XCHg Map BEGINS=======

ALFA thread spid: 17

XCHG = 2 <- refers to Xchg-2 Comp Count = 2 Exec Count = 2

Range Adjustable Consumer XCHG = 5

Parent thread spid: 34 <- refers to T4 Child thread 0: spid: 37 <- refers to T1 Child thread 1: spid: 38 <- refers to T2 Child thread 2: spid: 36 <- refers to T3

Scheduling level: 0

XCHG = 5 <- refers to Xchg-1 Comp Count = 3 Exec Count = 3

Bounds Adjustable Consumer XCHG -1

Parent thread spid:17 <- refers to Alpha Child thread 0: spid: 34 <- refers to T4 Child thread 1: spid: 35 <- refers to T5


Scheduling level: 0

=======Thread to XCHg Map BEGINS=======


SQL 操作中使用并行度

可使用最能反映应用程序的需要的任意方式来对表或索引进行分区。 Sybase 建议将分区置于使用不同物理磁盘的多个段上,以便提供足够的 I/O 并行度。例如,您可以基于表中某些列的散列、某些范围或属于某 一分区的值列表来创建明确定义的分区。散列、范围和列表分区属于 “基于语义的”分区类别,在给定某行的情况下,可以确定该行所属的 分区。

循环分区与其分区没有任何语义关联。一个行可能出现在它的任何一个 分区中。所选择的要分区的列与使用的分区类型会对应用程序的性能产 生重大影响。分区可以视为基数较低的索引;必须对其定义分区的列将 基于应用程序中的查询。


查询处理引擎及其运算符可以利用 Adaptive Server 的分区策略。对表和 索引定义的分区称为静态分区。此外, Adaptive Server 动态地对数据进 行重新分区,以满足像连接、矢量集合、区分、联合等关系操作的需要。 重新分区以流模式执行,且不会与任何存储相关联。重新分区与发出 alter table repartition 命令不同,后者执行的是静态分区。

一个查询计划由多个查询执行运算符组成。在 Adaptive Server 中,运算 符分为两类:

不区分属性的运算符包括 scansunion alls scalar aggregation。基 础分区不会影响不区分属性的运算符。

区分属性的运算符 (例如, joindistinctunion vector aggregation),它们允许使用基于语义的分区,将针对给定数量的数 据的一项操作分为多个较小的操作,以作用于该数据的多个较小的 片段。之后,只需使用 union all 便可提供最终的结果集。 union all 通 过执行多对一的 exchange 运算符实现。

以下几节将讨论这两类运算符,其中的示例将使用下表并通过足够的数 据来触发并行处理。

create table RA2(a1 int, a2 int, a3 int)


不区分属性的操作的并行度

本节讨论不区分属性的操作,包括 scan(串行和并行)、scalar aggregation

union all


表扫描


对于水平并行度,必须至少对查询中的一个表进行分区,或者配置参数 max repartition degree 的值必须大于 1。如果将 max repartition degree 设置 为 1Adaptive Server 将提示使用联机引擎的数目。当 Adaptive Server 运行水平并行度时,它将并行运行一个或多个运算符的多个版本。运算 符的每个副本都在其分区上运行,该分区可通过静态方式创建,也可在 执行过程中动态生成。

串行表扫描 下面的示例显示查询的串行执行,其中,将使用 table scan 运算符对表 RA2 进行扫描。此操作的结果将传送给 emit 运算符,该运算符又会将结 果转移到客户端。

select * from RA2

QUERY PLAN FOR STATEMENT 1 (at line 1).


1 operator(s) under root The type of query is SELECT.


ROOT:EMIT Operator


|SCAN Operator

| FROM TABLE

| RA2

| Table Scan.

| Forward Scan.

| Positioning at start of table.

| Using I/O Size 2 Kbytes for data pages.

| With LRU Buffer Replacement Strategy for data pages.

15.0 之前的版本中,除非使用 force 选项,否则它不会尝试使用基于 散列的扫描来并行扫描未分区的表。 5-4 显示了由单个任务 T1 在串 行模式下对所有页锁定表执行的扫描。如果执行物理 I/O 时所需页不在 缓存中,该任务会沿表的页链读取各页。

5-4:串行任务扫描数据页

image

单个页链

7T1


并行表扫描 您可以使用 Adaptive Server force 选项对未分区的表强制并行表扫描。 在此情况下, Adaptive Server 使用基于散列的扫描。

基于散列的表扫描 5-5 显示了在基于散列的表扫描期间,三个工作进程如何分工,共同 访问所有页锁定表的数据页。每个工作进程对每页都执行一次逻辑 I/O ,但只检查三分之一页上的行,如图中不同阴影行所示。仅当用户 强制并行度时,才可使用基于散列的表扫描。请参见 183 页的 “分 区倾斜

即使只有一个引擎,使用并行访问也能使查询受益,因为在其它工作进 程等待 I/O 时可以有一个进程在执行。如果存在多个引擎,则某些工作 进程可同时运行。


5-5:多个工作进程扫描未分区的表



WP2


WP1


WP3

image

单个页链


多个工作进程


基于散列的扫描会增加扫描的逻辑 I/O,因为各工作进程必须访问每个 页才能按页 ID 实现散列。而对于仅数据锁定表,基于散列的扫描既可 按扩充 ID 也可按分配页 ID 实现散列,这样将只有一个工作进程扫描 页,从而不会增加逻辑 I/O

基于分区的表扫描 如果您按以下方式对该表进行分区:

alter table RA2 partition by range(a1, a2)

(p1 values <= (500,100), p2 values <= (1000, 2000))

使用以下查询, Adaptive Server 可能选择对表进行并行扫描。仅当存在 足够多的页以进行扫描,并且各个分区大小都很相似,足以使查询从并 行度中获益时,才可选择并行扫描。

select * from RA2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


3 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |SCAN Operator

| | | FROM TABLE

| | | RA2

| | | Table Scan.

| | | Forward Scan.

| | | Positioning at start of table.

|

|

|

Using I/O Size 2 Kbytes for data pages.

|

|

|

With LRU Buffer Replacement Strategy

for data pages.

|

|

|

Using I/O Size 2 Kbytes for data pages.

|

|

|

With LRU Buffer Replacement Strategy

for data pages.

| | | Executed in parallel with a 2-way partition scan.


对表进行分区后, showplan 输出将包括两个附加的运算符:exchange exchange:emit。该查询包括两个工作进程,每个工作进程都扫描给定的分 区,并将数据传递给 exchange:emit 运算符,如 137 页的图 5-1 中所示。

5-6 显示了查询如何针对某个在三个物理磁盘上有三个分区的表进行 扫描。即使只有一个引擎,使用并行处理也能使查询获益,因为在其它 工作进程休眠等待 I/O 或等待其它进程将其所持有的锁释放时,可以有 一个工作进程在执行。如果有多个引擎可用,则工作进程便可同时在多 个引擎上运行。此类配置可获得极佳的执行效果。

5-6:多工作进程访问多个分区

image


索引扫描


与表类似,索引也可以是分区的,也可以是未分区的。本地索引继承表 的分区策略。每个本地索引分区仅扫描一个分区中的数据。全局索引的 分区策略不同于基表的分区策略,它们引用一个或多个分区。

全局非聚簇索引 Adaptive Server 在所有表分区策略中都支持未分区的非聚簇全局索引。 支持全局索引,以与 Adaptive Server 15.0 之前的版本兼容;全局索引还 适用于 OLTP 环境。索引和数据分区可驻留在相同的存储区域中,也可 驻留在不同的存储区域中。

使用散列对全局非聚簇 索引执行非覆盖扫描

要在按范围分区的表 RA2 上创建未分区的全局非聚簇索引,请输入:

create index RA2_NC1 on RA2(a3)

此查询包含使用索引键 a3 的谓词:

select * from RA2 where a3 > 300

QUERY PLAN FOR STATEMENT 1 (at line 1).

. . . . . . . . . . . . . .

The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes.

|

| |EXCHANGE:EMIT Operator

| |

| | |SCAN Operator

| | | FROM TABLE

| | | RA2

| | | Index : RA2_NC1

| | | Forward Scan.

| | | Positioning by key.

| | | Keys are:

| | | a3 ASC

| | | Executed in parallel with a 3-way hash scan.

|

|

|

With LRU Buffer Replacement

Strategy

for index leaf pages.

|

|

|

Using I/O Size 2 Kbytes for

data

pages.

|

|

|

With LRU Buffer Replacement

Strategy

for data pages.

|

|

|

With LRU Buffer Replacement

Strategy

for index leaf pages.

|

|

|

Using I/O Size 2 Kbytes for

data

pages.

|

|

|

With LRU Buffer Replacement

Strategy

for data pages.

| | | Using I/O Size 2 Kbytes for index leaf pages.


Adaptive Server 应用的索引扫描使用索引 RA2_NC1,该索引使用由 exchange 运算符生成的三个生产者线程。每个生产者线程都将扫描所有 的限定叶页,对限定数据的行 ID 应用散列算法并访问它所属的数据页。 在此示例中,并行度出现在数据页级上。

5-7:对全局非聚簇索引执行基于散列的并行扫描

image


5-7 的图例:

image


如果查询不需要访问数据页,则不会并行执行查询。但是,必须向查询 中添加分区列;因此,它将成为一个非覆盖扫描:

select a3 from RA2 where a3 > 300 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.

3 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |SCAN Operator

|

|

|

FROM TABLE

|

|

|

RA2

|

|

|

Index : RA2_NC1

|

|

|

Forward Scan.

|

|

|

Positioning by key.

|

|

|

Keys are:

|

|

|

a3 ASC

|

|

|

Executed in parallel with a

2-way hash

scan.

|

|

|

Using I/O Size 2 Kbytes for

index leaf

pages.

|

|

|

With LRU Buffer Replacement

Strategy for

index leaf pages.

|

|

|

Using I/O Size 2 Kbytes for

data pages.

|

|

|

With LRU Buffer Replacement

Strategy for

data pages.

使用非聚簇全局索引的 覆盖扫描

如果存在包含分区列的非聚簇索引,Adaptive Server 则无需访问数据页, 且查询将以串行模式执行:

create index RA2_NC2 on RA2(a3,a1,a2)


select a3 from RA2 where a3 > 300 QUERY PLAN FOR STATEMENT 1 (at line 1).


1 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

| SCAN Operator

| FROM TABLE

| RA2

| Index : RA2_NC2

| Forward Scan.

| Positioning by key.

| Index contains all needed columns. Base table will not be read.

| Keys are:

| a3 ASC

| Using I/O Size 2 Kbytes for index leaf pages.

| With LRU Buffer Replacement Strategy for index leaf pages.

聚簇索引扫描 对所有页锁定表设置聚簇索引后,将不允许使用基于散列的扫描策略。 唯一允许的策略为分区扫描。 Adaptive Server 将在必要时使用分区扫描。 对于仅数据锁定表,聚簇索引通常是一个位置索引,它与非聚簇索引的 行为相似。所有关于所有页锁定表上的非聚簇索引的论述也同样适用于 仅数据锁定表上的聚簇索引。

本地索引 Adaptive Server 支持聚簇和非聚簇本地索引。

分区表上的聚簇索引 本地聚簇索引允许多个线程并行扫描每个数据分区,因而可极大地提高 性能。要利用此并行度,可使用分区聚簇索引。对于本地索引,每个分 区中的数据都是单独排序的。每个数据分区中的信息都符合创建分区时 建立的边界,因此可以在整个表中实现唯一索引键。

唯一的聚簇本地索引具有下列限制:

索引列必须包含所有分区列。

分区列的顺序必须与索引定义的分区键相同。

唯一的聚簇本地索引不能包含在具有多个分区的循环表中。

分区表上的非聚簇索引 Adaptive Server 支持分区表上的本地非聚簇索引。

但是,在使用本地索引时仍有些许不同。当对本地非聚簇索引执行覆盖 索引扫描时,由于索引页也已经过分区,因此 Adaptive Server 仍可使用 并行扫描。


为说明其中的差异,下面的示例将创建一个本地非聚簇索引:

create index RA2_NC2L on RA2(a3,a1,a2) local index

select a3 from RA2 where a3 > 300 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


3 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |SCAN Operator

| | | FROM TABLE

| | | RA2

| | | Index : RA2_NC2L

| | | Forward Scan.

| | | Positioning by key.

| | | Index contains all needed columns. 基本功能

table will not be read.

| | | Keys are:

| | | a3 ASC

| | | Executed in parallel with a 2-way partition scan.

| | | Using I/O Size 2 Kbytes for index leaf pages.

| | | With LRU Buffer Replacement Strategy

for index leaf pages.

有时, Adaptive Server 会选择对本地索引执行基于散列的扫描。当需要 不同的并行度时,或当分区中的数据存在倾斜,以致应首选基于散列的 并行扫描时,便会发生这种情况。


标量集合


Transact-SQL 标量集合操作可以串行模式执行,也可并行执行。


两阶段标量集合


在并行标量集合中,集合操作使用两个标量集合运算符分两阶段执行。 在第一阶段中,较低的标量集合运算符执行数据流的集合。通过使用多 对一的 exchange 运算符,第一阶段中的标量集合结果将合并,该数据流 将进行第二次集合。

对于 count(*) 集合,第二阶段的集合将对标量执行 sum。下一示例的 showplan 输出中重点介绍了这一情况。

select count(*) from RA2

QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


5 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|SCALAR AGGREGATE Operator

| Evaluate Ungrouped SUM OR AVERAGE AGGREGATE.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and 1 Consumer processes.


|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

| |SCALAR AGGREGATE Operator

|

|

| | Evaluate Ungrouped COUNT

AGGREGATE.

|

|

| |

|

|

| | |SCAN Operator

|

|

| | | FROM TABLE

|

|

| | | RA2

|

|

| | | Table Scan.

|

|

| | | Forward Scan.

|

|

| | | Positioning at start

of table.

|

|

| | | Executed in parallel

with a

2-way partition scan.

| | | | | Using I/O Size 2 Kbytes for data


pages.

| | | | | With LRU Buffer Replacement

Strategy for data pages.


串行集合


Adaptive Server 也可以选择以串行模式执行集合。如果要集合的数据量 不足,无法保证提高性能,则串行集合可能成为首选技术。在执行串行 集合时,扫描结果将使用多对一的 exchange 运算符进行合并。下面的示 例对此进行了说明,其中还增加了一个选择性的谓词,用于最小化流入 标量集合运算符的数据量。在此情况下,并行执行集合可能会毫无意义。

select count(*) from RA2 where a2 = 10 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


4 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|SCALAR AGGREGATE Operator

| Evaluate Ungrouped COUNT AGGREGATE.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and 1 Consumer processes.


|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

| |SCAN Operator

|

|

|

|

FROM TABLE

|

|

|

|

RA2

|

|

|

|

Table Scan.

|

|

|

|

Forward Scan.

|

|

|

|

Positioning at start of table.

|

|

|

|

Executed in parallel with a 2-way

partition scan.

| | | | Using I/O Size 2 Kbytes for data

pages.

| | | | With LRU Buffer Replacement

Strategy for data pages.


union all


union all 运算符使用同名的物理运算符来实现。 union all 是一种相当简单 的操作,仅在查询要移动大量数据时才应并行使用它。


并行 union all


要生成并行的 union all,唯一的条件是它的操作数必须具有相同的度,而 无论这些操作数具有何种分区类型。以下示例 (使用表 HA2)显示了要 并行处理的 union all 运算符。 exchange 运算符的位置高于 union all 运算 符,这表示它要由多个线程共同处理:

create table HA2(a1 int, a2 int, a3 int) partition by hash(a1, a2) (p1, p2)


select * from RA2 union all

select * from HA2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |UNION ALL Operator has 2 children.

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Table Scan.

. . . . . . . . . . . . . . . . . . .

| | | | Executed in parallel with a 2-way

partition scan.

. . . . . . . . . . . . . . . . . . .

| | |

|

|

|

|SCAN Operator

|

|

|

| FROM TABLE


| | | | HA2

| | | | Table Scan.

. . . . . . . . . . . . . . . . . . .

| | | | Executed in parallel with a 2-way

partition scan.


串行 union all


在下一示例中,来自 union 运算符每一侧的数据分别由每一侧的选择性 谓词加以限制。要通过 union all 运算符发送的数据量将很少,足以使 Adaptive Server 决定不并行运行联合。相反,通过在 union 的每一侧都 放置 2 1 exchange 运算符,将对表 RA2 HA2 的每次扫描进行组 织。结果操作数随后由 union all 操作符并行处理:

select * from RA2 where a2 > 2400 union all

select * from HA2 where a3 in (10,20)

Executed in parallel by coordinating process and 4 worker processes.


7 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|UNION ALL Operator has 2 children.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and 1 Consumer processes.


| |

| | |EXCHANGE:EMIT Operator

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Table Scan.

| | | | Executed in parallel with a 2-way

partition scan.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and 1


Consumer processes.


|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

| |SCAN Operator

|

|

| | FROM TABLE

|

|

| | HA2

|

|

| | Table Scan.

|

|

| | Executed in parallel with a 2-way

partition scan.


区分属性的操作的并行度

区分属性的操作包括连接、矢量集合和联合。


join


具有相同的有用分区 的表


如果要并行连接两个表, Adaptive Server 会尝试使用基于语义的分区来 提高连接操作的效率,具体取决于要连接的数据量和每个操作数所具有 的分区类型。如果要连接的数据量很少,但要为每个表扫描的页数很大, 则 Adaptive Server 将使每一侧的并行流串行化,从而以串行模式来运行 连接。在此情况下,查询优化程序会确定并行运行连接操作是次优的。 通常, join 运算符所使用的一个或两个操作数可能是任何中间操作数, 这与其它 join 或分组运算符类似,但使用的示例仅将扫描显示为操作数。

每个连接操作数的分区的有用性仅与 join 谓词相关。如果两个表具有相 同的分区,并且分区列是 join 谓词的子集,则可以说这两个表是等分区 的。例如,如果您使用以下命令创建另一个表 RB2,使其分区类似于 RA2 的分区:

create table RB2(b1 int, b2 int, b3 int) partition by range(b1,b2)

(p1 values <= (500,100), p2 values <= (1000, 2000))

然后将 RB2 RA2 连接起来,扫描和连接可并行执行,无需再进行重新 分区。 Adaptive Server 可以连接 RA2 的第一个分区与 RB2 的第一个分 区,然后再连接 RA2 的第二个分区与 RB2 的第二个分区。这称为等分区 连接,仅当两个表在列 a1b1 a2b2 上连接时,才可以执行此连 接,如下所示:

select * from RA2, RB2

where a1 = b1 and a2 = b2 and a3 < 0

QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


7 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |NESTED LOOP JOIN Operator

(Join Type:Inner Join)

| | |

| | | |RESTRICT Operator

| | | |

| | | | |SCAN Operator

| | | | | FROM TABLE

| | | | | RB2

| | | | | Table Scan.

| | | | | Forward Scan.

| | | | | Positioning at start of table.

| | | | | Executed in parallel with a

2-way partition scan.

|

|

|

|

|

|

|RESTRICT Operator

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

|

FROM TABLE

|

|

|

|

|

RA2

|

|

|

|

|

Table Scan.

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning at start of table.

|

|

|

|

|

Executed in parallel with a

2-way partition scan.

exchange 运算符显示在 nested-loop join 之上。这意味着 exchange 将生 成两个生产者线程:第一个将扫描 RA2 RB2 的第一个分区并执行 nested-loop join ;第二个扫描 RA2 RB2 的第二个分区以执行 nested- loop join。这两个线程使用多对一 (本示例中为二对一)的 exchange 运 算符来合并结果。


具有相同有用分区的表 之一

以下示例使用 alter table 命令,将表 RB2 重新分区为 b1 列上的三路散列 分区。

alter table RB2 partition by hash(b1) (p1, p2, p3)

现在,我们举一个稍加修改的 join 查询示例,如下所示:

select * from RA2, RB2 where a1 = b1

RA2 上的分区无用,因为分区列不是要连接的列的子集 (即给定连 接列 a1 的值后,无法指定它属于哪个分区)。但是, RB2 上的分区是有 帮助的,因为它与 RB2 的连接列 b1 相匹配。在此情况下,查询优化程 序将通过 RA2 a1 列 (连接列,后跟一个三路的 merge join)上的散列 分区,对表 RA2 重新分区,以与 RB2 的分区相匹配。位于 RA2 扫描之 上的多对多 (2 3exchange 运算符将执行此动态重新分区。 merge join 运算符之上的 exchange 运算符使用多对一 (本示例中为 3 1)的 exchange 运算符来合并结果。此查询的 showplan 输出如以下示例所示:

select * from RA2, RB2 where a1 = b1 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 5 worker processes.


10 operator(s) under root The type of query is SELECT.

ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |MERGE JOIN Operator (Join Type: Inner Join)

| | | Using Worktable3 for internal storage.

| | | Key Count: 1

| | | Key Ordering: ASC

| | |

| | | |SORT Operator

| | | |Using Worktable1 for internal storage.

| | | |

| | | | |EXCHANGE Operator (Repartitioned)

| | | | |Executed in parallel by 2 Producer

and 3 Consumer processes.


|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

| |

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

|

|

|

FROM TABLE

|

|

|

|

|

|

|

|

RA2

|

|

|

|

|

|

|

|

Table Scan.

|

|

|

|

|

|

|

|

Forward Scan.

|

|

|

|

|

|

|

|

Positioning at start

of table.

|

|

|

|

|

|

|

|

Executed in parallel

with a 2-way

partition scan.

|

|

|

|

|

|

|SORT Operator

|

|

|

|Using Worktable2 for internal storage.

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

|

FROM TABLE

|

|

|

|

|

RB2

|

|

|

|

|

Table Scan.

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning at start of table.

|

|

|

|

|

Executed in parallel with a

3-way partition scan.

两个都具有无用分区 的表

下一示例使用 join,其中两侧的表的本机分区无用。表 RA2 上的分区应 用于列 (a1a2),而 RB2 上的分区应用于列 ( b1 )join 谓词位于不同 的列集上,因而两个表的分区无法起到作用。一种选择是在连接两侧进 行动态重新分区。通过使用 M N 2 3)的 exchange 运算符对表 RA2 进行重新分区,Adaptive Server 会选择表 RA2 a3 列,因为该列包 含在与表 RB2 的连接中。同样,也对表 RB2 b3 列应用 3 路重新分区。 按照 join 谓词,连接的重新分区操作数是等分区的,这意味着将连接每 一侧的相应分区。通常,当需要在 join 运算符的两侧都进行重新分区时, Adaptive Server 将使用基于散列的分区方案。

select * from RA2, RB2 where a3 = b3 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 8 worker processes.


12 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |MERGE JOIN Operator

(Join Type:Inner Join)

| | | Using Worktable3 for internal storage.

| | | Key Count: 1

| | | Key Ordering: ASC

| | |

| | | |SORT Operator

| | | |Using Worktable1 for internal

storage.

| | | |

| | | | |EXCHANGE Operator (Repartitioned)

| | | | |Executed in parallel by 2

Producer and 3 Consumer processes.


|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

| |

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

| | | RA2

|

|

|

|

|

| | | Table Scan.

|

|

|

|

|

| | | Forward Scan.

|

|

|

|

|

| | | Positioning at

start of table.

| | | | | | | | Executed in

parallel with a 2-way partition scan.

| | |

| | | |SORT Operator

| | | |Using Worktable2 for internal storage.


|

|

|

|

|

|

|

|

|EXCHANGE Operator (Repartitioned)

|

|

|

|

|Executed in parallel by 3

Producer and 3 Consumer

processes.


|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

|

|

|

FROM TABLE

|

|

|

|

|

|

|

RB2

|

|

|

|

|

|

|

Table Scan.

|

|

|

|

|

|

|

Forward Scan.

|

|

|

|

|

|

|

Positioning at start

of table.

| | | | | | | Executed in parallel

with a 3-way partition scan.

通常,所有连接 (包括 nested-loopmerge hash 连接)的行为方式都 相似。 nested-loop joins 显示一个异常,指示无法在 nested-loop join 的内 部重新分区。之所以发生此限制,是因为在 nested-loop join 中,连接谓 词的列值是从外部推到内部的。

复制型 join 当需要使用 nested-loop join 索引时,复制型 join 非常有用。请考虑以下 情况:在某大表的连接列上设有有用的索引,但其分区无用,且该表连 接到一个已分区或未分区的小表。可将小表复制 N 路到内部表的分区 中,其中 N 是大表的分区数。大表的每个分区会与小表连接,由于连接 内部不需要 exchange 运算符,因而允许执行索引 nested-loop join

create table big_table(b1 int, b2 int, b3 int) partition by hash(b3) (p1, p2)


create index big_table_nc1 on big_table(b1)

create table small_table(s1 int, a2 int, s3 int) select * from small_table, big_table

where small_table.s1 = big_table.b1

QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 3 worker processes.


7 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

|

|

|

|

|

|

|EXCHANGE

Operator (Replicated)

|

|

|

|Executed

in parallel by 1 Producer

and 2

Consumer processes.

|

|

|

|

|

|

|EXCHANGE

Operator (Replicated)

|

|

|

|Executed

in parallel by 1 Producer

and 2

Consumer processes.

| | |NESTED LOOP JOIN Operator (Join Type: Inner Join)


|

|

|

|

|

|

|

| |EXCHANGE:EMIT Operator

|

|

|

| |

|

|

|

| | |SCAN Operator

|

|

|

| | | FROM TABLE

|

|

|

| | | small_table

|

|

|

| | | Table Scan.

|

|

|

|

|

|

|SCAN Operator

|

|

|

| FROM TABLE

|

|

|

| big_table

|

|

|

| Index : big_table_nc1

|

|

|

| Forward Scan.

|

|

|

| Positioning by key.

|

|

|

| Keys are:

|

|

|

| b1 ASC

|

|

|

| Executed in parallel with a

2-way hash scan.

并行重新格式化 并行重新格式化在您使用 nested-loop join 时特别有用。通常,重新格式 化是指将嵌套连接的内部实现为一个工作表,然后根据连接谓词创建索 引。使用并行查询和 nested-loop join,当连接列上不存在有用的索引或 nested-loop join 是查询的唯一可用选项 (根据服务器 / 会话 / 查询级设 置)时,重新格式化也很有用。这是 Adaptive Server 的一个重要选项。 外部可能包含有用的分区,如果不包含,则可以对其重新分区来创建有 用的分区。但对于 nested-loop join 的内部,任何重新分区都意味着必须 将表重新格式化为一个使用新分区策略的工作表。对 nested-loop join 的 内部扫描必须随后访问该工作表。


在下一示例中,对表 RA2 RB2 的重新分区将分别应用于列 (a1a2) 和 (b1b2)。运行查询时,该会话的 merge hash join 都将关闭。

select * from RA2, RB2 where a1 = b1 and a2 = b3


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 12 worker processes.


17 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|SEQUENCER Operator has 2 children.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 4 Producer and 1 Consumer processes.


|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

| |STORE Operator

|

|

| | Worktable1 created, in allpages

|

|

|

|

Creating clustered index.

|

|

|

|

|

|

|

|

|INSERT Operator

|

|

|

|

| The update mode is direct.

|

|

|

|

|

|

|

|

|

| |EXCHANGE Operator

(Repartitioned)

|

|

|

|

| |Executed in parallel by

|

|

|

|

Creating clustered index.

|

|

|

|

|

|

|

|

|INSERT Operator

|

|

|

|

| The update mode is direct.

|

|

|

|

|

|

|

|

|

| |EXCHANGE Operator

(Repartitioned)

|

|

|

|

| |Executed in parallel by

locking mode, for REFORMATTING.


|

|

|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

|

| |

|

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

|

| | | RB2

|

|

|

|

|

|

| | | Table Scan.

|

|

|

|

|

|

| | | Executed in

|

|

|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

|

| |

|

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

|

| | | RB2

|

|

|

|

|

|

| | | Table Scan.

|

|

|

|

|

|

| | | Executed in

2 Producer and 4 Consumer processes.



| | | | |

| | | | | TO TABLE

| | | | | Worktable1.

|

| |EXCHANGE Operator (Merged)

parallel with a 2-way

partition scan.

| |Executed in parallel by 4 Producer and 1 Consumer processes.


|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

| |NESTED LOOP JOIN Operator

(Join Type:Inner Join)

|

|

| |

|

|

| | |EXCHANGE Operator (Repartitioned)

|

|

| | |Executed in parallel by 2

Producer and 4 Consumer

|

|

|

|

|

|

|

|

|

|

|EXCHANGE: EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

| |

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

| | | RA2

|

|

|

|

|

| | | Table Scan.

|

|

|

|

|

| | | Executed in

|

|

|

|

|

|

|

|

|

|

|EXCHANGE: EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

| |

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

| | | RA2

|

|

|

|

|

| | | Table Scan.

|

|

|

|

|

| | | Executed in

processes.



| | | | |SCAN Operator

parallel with a 2-way partition scan.

|

|

|

|

|

FROM TABLE

|

|

|

|

|

Worktable1.

|

|

|

|

|

Using Clustered Index.

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning by key.


顺序运算符会执行其所有子运算符 (但最后一个子运算符除外),然后 执行最后一个子运算符。在此情况下,顺序运算符将执行第一个子运算 符,该运算符会使用列 b1 b3 上的四路散列分区,将表 RB2 重新格式 化为一个工作表。还将对表 RA2 执行四路重新分区,以与该工作表的存 储分区相匹配。

串行连接 有时,可能会因为要连接的数据量而使运行并行连接毫无意义。如果您 运行的查询与前面的连接查询相似,而现在每个表 (RA2 RB2)上都 设置了谓词,以致要连接的数据量不足,则可以用串行模式来执行连接。 在此情况下,这些表的分区方式无关紧要。查询仍能从表的并行扫描中 获益。

select * from RA2, RB2 where a1=b1 and a2 = b2 and a3 = 0 and b2 = 20


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 4 worker processes.


11 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|MERGE JOIN Operator (Join Type: Inner Join)

| Using Worktable3 for internal storage.

| Key Count: 1

| Key Ordering: ASC

|

| |SORT Operator

| | Using Worktable1 for internal storage.

| |

| | |EXCHANGE Operator (Merged)

| | |Executed in parallel by 2 Producer and

1 Consumer processes.


|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

| |

|

|

|

| | |SCAN Operator

|

|

|

| | | FROM TABLE

|

|

|

| | | RA2


| | | | | | Table Scan.

| | | | | | Executed in parallel with

a 2-way partition scan.

| |SORT Operator

| |Using Worktable2 for internal storage.

| |

| | |EXCHANGE Operator (Merged)

| | |Executed in parallel by 2 Producer and

1 Consumer processes.


|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

| |

|

|

|

| | |SCAN Operator

|

|

|

| | | FROM TABLE

|

|

|

| | | RB2

|

|

|

| | | Table Scan.

|

|

|

| | | Executed in parallel with

a 2-way partition scan.

半连接 展平 in/exist 子查询时将产生半连接,这种连接的行为方式与常规内部连 接相同。但是,复制型连接不能用于半连接,原因是在此情况下,外部 行会出现多次匹配。

外部连接 在外部连接的并行处理方面,不考虑复制型连接。其它一切方面的行为 方式均与常规内部连接相似。另一个不同点是,在属于外部组的外部连 接中,不对任何表执行分区排除。


矢量集合


矢量集合是指带有 group-by 的查询。 Adaptive Server 可通过多种不同的 方式来执行矢量集合。此处未描述实际算法;以下几节仅说明并行计算 的技术。

内分区的矢量集合 如果任何基关系或中间关系需要分组,并在 group by 子句中列的子集或 其本身上进行分区,则将在每个分区上并行执行分组操作,并使用简单 的 N 1 exchange 将生成的已分组流合并。这是因为给定的组不能出现 在多个流中。同样的限制也适用于在任何 SQL 查询上所执行的分组,前 提是对分组列或其子集应用基于语义的分区。此并行矢量集合的方法称 为内分区集合。


以下查询使用并行 in-partitioned 矢量集合,原因是范围分区在列 a1

a2 上定义,且后一列还正好是需要执行集合的列。

select count(*), a1, a2 from RA2 group by a1,a2 QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


4 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and

1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |HASH VECTOR AGGREGATE Operator

| | | GROUP BY

| | | Evaluate Grouped COUNT AGGREGATE.

| | | Using Worktable1 for internal storage.

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Table Scan.

| | | | Forward Scan.

| | | | Positioning at start of table.

| | | | Executed in parallel with a 2-way

partition scan.

| | | | Using I/O Size 2 Kbytes for data

pages.

| | | | With LRU Buffer Replacement

Strategy for data pages.


重新分区的矢量集合 有时,对表或中间结果分区可能不会对分组操作产生帮助。通过对源数 据重新分区以与分组列匹配,并随后应用并行矢量集合,并行执行分组 操作可能还是值得的。下面对此情况进行了说明,其中分区应用于列

a1a2),但查询需要对列 a1 执行矢量集合。

select count(*), a1 from RA2 group by a1


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 4 worker processes.


6 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |HASH VECTOR AGGREGATE Operator

| | | GROUP BY

| | | Evaluate Grouped COUNT AGGREGATE.

| | | Using Worktable1 for internal storage.

| | |

| | | |EXCHANGE Operator (Repartitioned)

| | | |Executed in parallel by 2 Producer

and 2 Consumer processes.


|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

| | FROM TABLE

|

|

|

|

| | RA2

|

|

|

|

| | Table Scan.

|

|

|

|

| | Forward Scan.

|

|

|

|

| | Positioning at start of

table.

|

|

|

|

| | Executed in parallel with

a 2-way partition scan.


两阶段矢量集合 对于上一示例中的查询,重新分区的开销可能是巨大的。另一种可行的 方案为,先执行一级分组,使用 N 1 exchange 运算符合并数据,随 后再执行另一级分组。这种方式称为两阶段 矢量集合。根据分组列的重 复数,Adaptive Server 可通过 N 1 exchange(可降低第二级分组操 作的开销)来减少数据流的基数。

select count(*), a1 from RA2 group by a1


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


5 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|HASH VECTOR AGGREGATE Operator

| GROUP BY

| Evaluate Grouped SUM OR AVERAGE AGGREGATE.

| Using Worktable2 for internal storage.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and

1 Consumer processes.

| |

| | |EXCHANGE:EMIT Operator

| | |

| | | |HASH VECTOR AGGREGATE Operator

| | | | GROUP BY

| | | | Evaluate Grouped COUNT AGGREGATE.

| | | | Using Worktable1 for internal storage.

| | | |

| | | | |SCAN Operator

| | | | | FROM TABLE

| | | | | RA2

| | | | | Table Scan.

| | | | | Executed in parallel with

a 2-way partition scan.


串行矢量集合 与前面的某些示例相似,如果通过谓词来限制流入分组运算符的数据量, 则并行执行该查询的意义可能不大。在此情况下,将并行扫描分区,并使 用 N 1 exchange 运算符来串行化数据流,然后再执行串行矢量集合:

select count(*), a1, a2 from RA2 where a1 between 100 and 200 group by a1, a2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and

2 worker processes.


4 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|HASH VECTOR AGGREGATE Operator

| GROUP BY

| Evaluate Grouped COUNT AGGREGATE.

| Using Worktable1 for internal storage.

|

| |EXCHANGE Operator (Merged)

| |Executed in parallel by 2 Producer and 1 Consumer processes.

| |

| | |EXCHANGE:EMIT Operator

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Positioning at start of table.

| | | | Executed in parallel with a 2-way

partition scan.

您不能始终对分区列进行分组,或利用已在分组列上进行分区的表。查 询优化程序可确定以下哪种方式更为合适:重新分区且并行执行分组; 合并分区表中的数据流并使用串行模式或两阶段集合来执行分组。


distinct 具有 distinct 操作的查询与不带集合分量的分组矢量集合相同。例如:

select distinct a1, a2 from RA2

等同于:

select a1, a2 from RA2 group by a1, a2

所有适用于矢量集合的方法在此处同样适用。

使用 in 列表的查询 Adaptive Server 使用优化的技术来处理 in 列表。这是一种常见的 SQL 构 造。因此,其构造类似于:

col in (value1, value2,..valuek)

等同于:

col = value1 OR col = value2 OR .... col = valuek

in 列表中的值被置于内存中的特殊表内,并已经过排序删除了重复项。 随后,使用索引 nested-loop join 将该表连接回基表。下面的示例对此进行 了说明,其中 in 列表中包含两个值,它们与 or 列表中的两个值相对应:

SCAN Operator FROM OR List

OR List has up to 2 rows of OR/IN values. select * from RA2 where a3 in (1425, 2940)

QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


6 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |NESTED LOOP JOIN Operator (Join Type: Inner Join)

| | |


|

|

|

|

|

|

|

|

|

|SCAN Operator

| FROM OR List

| OR List has up to 2 rows of OR/IN


|

|


|

|


|

|

values.


|RESTRICT Operator

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

|

FROM TABLE

|

|

|

|

|

RA2

|

|

|

|

|

Index : RA2_NC1

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning by key.

|

|

|

|

|

Keys are:

|

|

|

|

|

a3 ASC

|

|

|

|

|

Executed in parallel with a

2-way hash scan.

使用 or 子句的查询 Adaptive Server 使用分离性谓词 (如 or 子句)并单独应用分离的每一 侧,以限定一组行 ID (RID)。在分离每一侧所应用的分离性谓词集必须 是可索引的。此外,分离每一侧的分离性谓词内部不能再进一步分离; 也就是说,对分离性和结合性子句应用任意深度的嵌套毫无意义。在下 一示例中,将在同一列上采用分离性谓词 (可在不同的列上设置分离 性谓词,前提是您具有的索引可执行开销不大的扫描),但这些谓词可 能限定多个重叠的数据行集。 Adaptive Server 在分离的每一侧单独应用 谓词,并限定一组行 ID。这些行 ID 随后将易于排除重复项。

select a3 from RA2 where a3 = 2955 or a3 > 2990


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


8 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |RID JOIN Operator


|

|

|

Using Worktable2 for internal storage.

|

|

|

|

|

|

|HASH UNION Operator has 2 children.

|

|

|

| Using Worktable1 for internal storage.

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

| | FROM TABLE

|

|

|

| | RA2

|

|

|

| | Index : RA2_NC1

|

|

|

| | Forward Scan.

|

|

|

| | Positioning by key.

|

|

|

| | Index contains all needed

columns. Base table will not

be read.

|

|

|

| | Keys are:

|

|

|

| | a3 ASC

|

|

|

| | Executed in parallel with a

2-way hash scan.

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

| | FROM TABLE

|

|

|

| | RA2

|

|

|

| | Index : RA2_NC1

|

|

|

| | Forward Scan.

|

|

|

| | Positioning by key.

|

|

|

| | Index contains all needed

columns. Base table will

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

Keys are: a3 ASC

Executed in parallel with a

2-way hash scan.

|

|

|

|

|

|

|

|

|

|RESTRICT Operator

|

| |SCAN Operator

|

|

|

|

|

FROM TABLE

|

|

|

|

|

RA2

|

|

|

|

|

Using Dynamic Index.

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning by Row IDentifier

(RID.)

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

Keys are: a3 ASC

Executed in parallel with a

2-way hash scan.

|

|

|

|

|

|

|

|

|

|RESTRICT Operator

|

| |SCAN Operator

|

|

|

|

|

FROM TABLE

|

|

|

|

|

RA2

|

|

|

|

|

Using Dynamic Index.

|

|

|

|

|

Forward Scan.

|

|

|

|

|

Positioning by Row IDentifier

(RID.)

not be read.


| | | | | Using I/O Size 2 Kbytes for

data pages.

| | | | | With LRU Buffer Replacement

Strategy for data pages.



使用 order by 子句的 查询

示例通过索引 RA2_NC1 使用了两个单独的索引扫描,该索引在列 a3 上 定义。随后,将在行 ID 的限定集合中检查重复的行 ID,并最终将其连 接回基表。请注意代码行 Positioning by Row Identifier (RID)。 可为分离的每一侧使用不同的索引,但前提条件是谓词是可索引的。为 确定这一点,一种简单的方法是使用分离的每一侧单独运行查询,以确 保谓词是可索引的。如果求索引交集比对表执行单个扫描看上去开销要 大,则 Adaptive Server 可能不会选择求索引交集。

如果查询因使用了 order by 子句而要求对输出排序,则 Adaptive Server 可并行应用 sort。首先,如果存在某些可用的固有排序,Adaptive Server 将尝试避免排序操作。如果 Adaptive Server 强制排序,它将检查并确定 是否可以并行执行排序。为此, Adaptive Server 可以对现有数据流重新 分区,也可以使用现有的分区方案,然后对每个要素流应用排序。将使 用 N 1 的顺序合并结果数据,并保留 exchange 运算符。

select * from RA2 order by a1, a2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


4 operator(s) under root The type of query is SELECT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and

1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |SORT Operator

| | | Using Worktable1 for internal storage.

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Index : RA2_NC2L

| | | | Forward Scan.

| | | | Positioning at index start.

| | | | Executed in parallel with a

2-way partition scan.


根据要排序的数据量和可用的资源, Adaptive Server 可能对数据流重新 分区,以使其分区度高于该数据流的当前分区度,从而提高 sort 操作的 执行速度。排序的分区度取决于并行执行 sort 所带来的益处是否明显大 于重新分区所产生的开销。


子查询


Adaptive Server 会使用不同的方法来降低处理子查询的开销。并行优化 取决于子查询的类型:

实现子查询 — 在实现步骤中不考虑并行查询方法。

展平子查询 — 仅当将子查询展平为常规内部连接或半连接时,才 会考虑并行查询优化。

嵌套子查询 — 对于包含子查询的查询的最外层查询块考虑执行并 行操作;内部、嵌套的查询始终串行执行。这意味着,嵌套子查询 中的所有表都将被串行访问。在下面的示例中,将并行访问表 RA2, 但在访问子查询前,将使用 2 1 exchange 运算符对该表进行序 列化。将并行访问子查询中的表 RB2

select count(*) from RA2 where not exists (select * from RB2 where RA2.a1 = b1)


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


8 operator(s) under root


The type of query is SELECT. ROOT:EMIT Operator

|SCALAR AGGREGATE Operator

| Evaluate Ungrouped COUNT AGGREGATE.

|

| |SQFILTER Operator has 2 children.

| |

| | |EXCHANGE Operator (Merged)

| | |Executed in parallel by 2 Producer and 1 Consumer processes.


|

|

|

|

|

|

|EXCHANGE:EMIT Operator


|

|

| |

|

|

| | |RESTRICT Operator

|

|

| | |

|

|

| | | |SCAN Operator

|

|

| | | | FROM TABLE

|

|

| | | | RA2

|

|

| | | | Index : RA2_NC2L

|

|

| | | | Forward Scan.

|

|

| | | | Executed in parallel with

a 2-way partition scan.

|

|

|

|

Run subquery 1 (at nesting level 1).

|

|

|

|

QUERY PLAN FOR SUBQUERY 1 (at nesting

level 1 and at line 2).

|

|

|

|

Correlated Subquery.

|

|

Subquery under an EXISTS predicate.

|

|

|

|

|SCALAR AGGREGATE Operator

|

|

| Evaluate Ungrouped ANY AGGREGATE.

|

|

| Scanning only up to the first

qualifying row.

|

|

|

|

|

| |SCAN Operator

|

|

| | FROM TABLE

|

|

| | RB2

|

|

| | Table Scan.

|

|

| | Forward Scan.

|

|

|

|

END OF QUERY PLAN FOR SUBQUERY 1.

下面的示例演示展平为半连接的 in 子查询。 Adaptive Server 将该子查询 转换为内连接,以便在按连接顺序移动表时提供更大的灵活性。从下面 可以看出,最初位于子查询中的表 RB2 现在可进行并行访问。

select * from RA2 where a1 in (select b1 from RB2)


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 5 worker processes.


10 operator(s) under root


The type of query is SELECT.


ROOT:EMIT Operator


|EXCHANGE Operator (Merged)

|Executed in parallel by 3 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |MERGE JOIN Operator (Join Type: Inner Join)

| | | Using Worktable3 for internal storage.

| | | Key Count: 1

| | | Key Ordering: ASC

| | |

| | | |SORT Operator

| | | | Using Worktable1 for internal storage.

| | | |

| | | | |SCAN Operator

| | | | | FROM TABLE

| | | | | RB2

| | | | | Table Scan.

| | | | | Executed in parallel with a

3-way partition scan.

| | |

| | | |SORT Operator

| | | | Using Worktable2 for internal storage.

| | | |

| | | | |EXCHANGE Operator (Merged)

| | | | |Executed in parallel by 2

Producer and 3 Consumer processes.


|

|

|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

|

|

|

|

|

| |

|

|

|

|

|

| | |SCAN Operator

|

|

|

|

|

| | | FROM TABLE

|

|

|

|

|

| | | RA2

|

|

|

|

|

| | | Index : RA2_NC2L

|

|

|

|

|

| | | Forward Scan.

|

|

|

|

|

| | | Positioning at

index start.


| | | | | | | | Executed in

parallel with a 2-way

partition scan.


select into 子句


包含 select into 子句的查询会创建一个新表以在其中存储该查询的结果 集。Adaptive Server 会优化 select into 命令的基查询部分,其优化方式与 它处理标准查询时的方式相同,二者都会考虑并行和串行访问方法。并 行执行的 select into 语句:

使用 select into 语句中指定的列创建新表。

在新表中创建 N 个分区,其中 N 是优化程序为查询中的 insert 操作 选择的并行度。

使用 N 个工作进程在新表中填充查询结果。

如果不需要特定的目标分区,则取消对新表的分区。

并行执行 select into 语句比等效的串行查询计划需要更多的步骤。以下 是并行执行的简单 select into

select * into RAT2 from RA2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


4 operator(s) under root The type of query is INSERT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |

| | |INSERT Operator

| | | The update mode is direct.

| | |

| | | |SCAN Operator

| | | | FROM TABLE


|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

RA2

Table Scan. Forward Scan.

Positioning at start of table. Executed in parallel with a 2-way

partition scan.

|

|

|

|

|

|


TO TABLE

|

|

|

|

|

|

RAT2

Using I/O Size 2 Kbytes for data

pages.

Adaptive Server 不会尝试提高对表 RA2 扫描所产生的数据流的分区度, 而是将其并行插入目标表中。目标表最初使用分区度为 2 的循环分区创 建。插入后,将对表取消分区。

如果要插入的数据集不够大,Adaptive Server 可能选择串行插入此数据。 对源表的扫描仍可并行执行。目标表随后会被创建为未分区的表。

select into 允许指定目标分区。在此情况下,将使用该分区创建目标表, 并且 Adaptive Server 会找出插入数据的最优方式。如果目标表的分区方 式必须与源数据的分区方式相同,并且要插入的数据也足够多,则将并 行执行 insert 运算符。

下一示例显示了源表和目标表的相同分区,并说明 Adaptive Server 是如 何识别此情况并选择不对源数据重新分区的。

select * into new_table partition by range(a1, a2)

(p1 values <= (500,100), p2 values <= (1000, 2000)) from RA2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 2 worker processes.


4 operator(s) under root


The type of query is INSERT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|


| |EXCHANGE:EMIT Operator

| |

| | |INSERT Operator

| | | The update mode is direct.

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Table Scan.

| | | | Forward Scan.

| | | | Positioning at start of table.

| | | | Executed in parallel with a 2-way

partition scan.

| | |

| | | TO TABLE

| | | RRA2

| | | Using I/O Size 16 Kbytes for data

pages.

如果源分区与目标表的分区不匹配,则必须对源数据重新分区。下一示 例对此进行了说明,其中使用 2 2 exchange 运算符将数据从范围分 区转换为散列分区,在对数据重新分区后,它使用两个工作进程并行执 行插入操作。

select * into HHA2 partition by hash(a1, a2) (p1, p2)

from RA2


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 4 worker processes.


6 operator(s) under root


The type of query is INSERT. ROOT:EMIT Operator

|EXCHANGE Operator (Merged)

|Executed in parallel by 2 Producer and 1 Consumer processes.


|

| |EXCHANGE:EMIT Operator

| |


| | |INSERT Operator

| | | The update mode is direct.

| | |

| | | |EXCHANGE OperatorEXCHANGE Operator (

Merged)

| | | |Executed in parallel by 2 Producer

and 2 Consumer processes.


|

|

|

|

|

|

|

|

|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

| |SCAN Operator

|

|

|

|

|

|

FROM TABLE

|

|

|

|

|

|

RA2

|

|

|

|

|

|

Table Scan.

|

|

|

|

|

|

Forward Scan.

|

|

|

|

|

|

Positioning at start of table.

|

|

|

|

|

|

Executed in parallel with a

|

|

|

|

|

|

TO TABLE

|

|

|

HHA2

|

|

|

Using I/O Size 16 Kbytes for data

|

|

|

|

|

|

TO TABLE

|

|

|

HHA2

|

|

|

Using I/O Size 16 Kbytes for data

2-way partition scan.


pages.


insert/delete/update


Adaptive Server 中, insertdelete update 操作以串行模式执行。但 是,除查询中用于限定要删除或更新的行的目标表外,所有其它表均可 并行访问。

delete from RA2 where exists (select * from RB2

where RA2.a1 = b1 and RA2.a2 = b2)


QUERY PLAN FOR STATEMENT 1 (at line 1).

Executed in parallel by coordinating process and 3 worker processes.


9 operator(s) under root The type of query is DELETE. ROOT:EMIT Operator


|DELETE Operator

| The update mode is deferred.

|

| |NESTED LOOP JOIN Operator (Join Type:Inner Join)

| |

| | |SORT Operator

|

|

|

Using Worktable1 for internal storage.

|

|

|

|

|

|

|EXCHANGE Operator (Merged)

|

|

|

|Executed in parallel by 3 Producer

and 1 Consumer processes.


|

|

|

|

|

|

|

|


|EXCHANGE:EMIT Operator

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

|

| |RESTRICT Operator

| |

| | |SCAN Operator

| | | FROM TABLE

| | | RB2

| | | Table Scan.

| | | Forward Scan.

| | | Positioning at start


of

table.

|

|

|

|

|

|

|

Executed in parallel

a 3-way partition

with

scan.

| | | | | | | Using I/O Size 2 Kbytes

for data pages.

| | | | | | | With LRU Buffer Replacement

Strategy for data pages.

| |

| | |RESTRICT Operator

| | |

| | | |SCAN Operator

| | | | FROM TABLE

| | | | RA2

| | | | Index : RA2_NC1

| | | | Forward Scan.

| | | | Positioning by key.

| | | | Keys are:

| | | | a3 ASC

|

| TO TABLE

| RA2

| Using I/O Size 2 Kbytes for data pages.


应对要删除的表 RB2 串行执行扫描和删除。但是,对表 RA2 并行执行了 扫描。此情况同样适用于 update insert 语句。


分区排除


语义分区的一个优点是,查询处理器能够利用该分区并在编译时间排除 rangehash list 分区。对于 hash 分区,只能使用等同性谓词,而对 于 range list 分区,等同性和非等同性谓词均可用于排除分区。例如, 请考虑表 RA2,其语义分区在列 a1a2 上定义 (其中 p1 <= (500,100)p2 <= (1000, 2000))。如果在 a1 列或在 a1 a2 列上设置 了谓词,则可以执行某些分区排除。例如,以下语句不限定任何数据:

select * from RA2 where a1 > 1500

可以在 showplan 输出中查看此情况。

QUERY PLAN FOR STATEMENT 1 (at line 1).

................................

| | |SCAN Operator

|

|

|

FROM TABLE

|

|

|

RA2

|

|

|

[ Eliminated Partitions : 1 2 ]

|

|

|

Index : RA2_NC2L

短语 Eliminated Partitions 依据分区的创建方式来标识分区并分配 一个序号以便确认。对于表 RA2,由 p1 (其中,(a1a2<= (500, 100))表示的分区被视为分区号一,而由 p2 (其中,(a1a2> (500,

100) <= (1000, 2000))表示的分区被标识为分区号二。

请考虑对散列分区表执行等同性查询,其中散列分区中的所有键都具有 一个 equality 子句。可通过采用表 HA2 来说明这一点,该表在列 (a1a2)上进行了两路散列分区。列号将引用分区在 sp_help 输出中列出的 顺序。

select * from HA2 where a1 = 10 and a2 = 20


QUERY PLAN FOR STATEMENT 1 (at line 1).

................................


|SCAN Operator

| FROM TABLE

| HA2

| [ Eliminated Partitions : 1 ]

| Table Scan.


分区倾斜


在确定是否可以使用并行分区扫描时,分区倾斜可发挥重要的作用。 Adaptive Server 分区倾斜定义为分区的最大大小与平均大小的比率。请 考虑具有 4 个分区的表,这些分区的大小分别为 202035 80 页。

分区的平均大小为 (20 + 20 + 35 + 85)/4 = 40 页。最大的分区包含 85 页, 因此分区倾斜应计算为 85/40 = 2.125。对于分区扫描,执行并行扫描的 开销与对最大分区进行扫描的开销相同。与此相反,基于散列的分区可

能会非常迅速,这是因为每个工作进程均可以在一个页号或分配单元上 应用散列,并仅扫描属于它的数据部分。倾斜分区会导致性能降低,这

种影响并不总是发生在扫描级别,而是在对数据建立更复杂运算符 (如 若干 join 操作)时。在此类情况下,出错空间呈指数增加。

对表运行 sp_help 可查看分区倾斜:

sp_help HA2


........

name type partition_type partitions partition_keys

------ -------------------- -------------- -----------

HA2 base table hash 2 a1, a2


partition_name partition_id pages segment create_date

-------------------------- ------------ ----------- --

------------

--------------------------

HA2_752002679 752002679 324 default

Aug 10 2005 2:05PM

HA2_768002736 768002736 343 default

Aug 10 2005 2:05PM


Partition_Conditions

-------------------- NULL

Avg_pages Max_pages Min_pages Ratio(Max/Avg) Ratio(Min/Avg)

----------- ----------- ----------- ------------------

---------

---------------------------

333 343 324 1.030030

0.972973

或者,通过查询 systabstats 系统目录 (其中列出每个分区中的页数), 也可以计算倾斜。


查询为何不并行运行

Adaptive Server 会在以下情况中以串行模式运行查询:

数据不足,无法从并行访问中获益。

查询中不包含等同性连接谓词,例如:

select * from RA2, RB2 where a1 > b1

资源 (如线程或内存)不足,无法并行运行查询。

对全局非聚簇索引使用覆盖扫描。

在无法展平的嵌套子查询内部访问表和索引。


运行期调整


如果运行期没有足够的工作进程可用,则执行引擎将尝试减少计划中

exchange 运算符所使用的工作进程数。

首先,尝试减少查询计划中某些 exchange 运算符所使用的工作进 程,而不是依靠对查询进行串行重新编译。根据查询计划的语义, 某些 exchange 运算符可进行调整,而某些则不可以。某些还对可以 调整的方式进行了限制。

并行查询计划需要在保证一个最低的工作进程数时才能运行。如果 没有足够的工作进程可用,将以串行模式重新编译查询。如果无法 重新编译,则查询会中止并将生成相应的错误消息。

它通过以下两种方式实现此目的:

Adaptive Server 支持串行重新编译以下类型的查询:

即席的 select 查询,但 select intoalter table execute immediate 查 询除外。

存储过程,但 select into alter table 查询除外。


识别和管理运行期调整

Adaptive Server 提供了两种机制来帮助您观察查询计划的运行期调整:

发生运行期调整时,使用 set process_limit_action 可以中止批处理或 过程。

发生运行期调整并且 showplan 有效时, showplan 将输出调整的查询 计划。


使用 set process_limit_action

使用 set 命令的 process_limit_action 选项可在会话或存储过程级别监控调 整的查询计划的使用。将 process_limit_action 设置为 “abort”时,如果 需要调整的查询计划,则 Adaptive Server 将记录错误 11015 并中止查询。 将 process_limit_action 设置为 “warning”时, Adaptive Server 将记录错 误 11014,但仍执行查询。例如,在运行期调整查询时,下面的命令将 中止批处理:

set process_limit_action abort

通过在错误日志中检查错误 11014 11015 所发生的次数,可以确定 Adaptive Server 使用调整的查询计划代替优化的查询计划的程度。要解 除限制并允许运行期调整,请使用:

set process_limit_action quiet

请参见 《参考手册:命令》中的 set


使用 showplan


使用 showplan 时, Adaptive Server 将在运行给定查询前显示该查询的优 化计划。如果查询计划包含并行处理并进行了运行期调整, showplan 会 显示此信息,后跟调整的查询计划:

AN ADJUSTED QUERY PLAN IS BEING USED FOR STATEMENT 1 BECAUSE NOT ENOUGH WORKER PROCESSES ARE CURRENTLY AVAILABLE.


ADJUSTED QUERY PLAN:

当使用 set notexec 时, Adaptive Server 不会尝试执行查询,因此从不会 显示运行期计划。


减小运行期调整的可能性

若有减少运行期调整的次数,请增加可用于并行查询的工作进程数。为 此,可使用以下任一选项增大系统的工作进程总数,或者限制或取消非 关键查询的并行执行:

set parallel_degree ,可对并行度设置会话级限制,或者

查询级 parallel 1 parallel N 子句,可限制各个语句使用的工作进 程数。

要减少系统过程的运行期调整次数,请在改变服务器级或会话级的并行 度后重新编译这些过程。请参见 《Adaptive Server 参考手册:过程》中 的 sp_recompile



--------------------------------------华丽的分割线-------------------------------------------------------------------------

Sybase SQL Anywhere数据库恢复工具ReadASADB:

之前就已经研发成功了能够从Sybase SQL Anywhere的DB文件中恢复数据的工具: ReadASADB。
此工具支持ASA v5.0, v6.0, v7.0, v8.0, v9.0, v10.0, v11.0, v12.0, v16.0, v17.0等版本。
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具。
恢复Sybase SQL Anywhere的工具在国内处于领先水平。

Sybase SQL Anywhere数据库恢复工具ReadASADB功能
能够从损坏的SQL Anywhere数据文件(.db)和UltraLite数据文件(.udb)上提取数据的非常规恢复工具
  1. 适用于所有的SQL Anywhere版本    包括:5.x,6.x,7.x,8.x,9.x,10.x,11.x,12.x,16.x,17.x
  2. 适用于所有的UltraLite版本
  3. 能够恢复出来表结构和数据
  4. 能够恢复自定义数据类型
  5. 能够恢复存储过程等对象的语法
  6. 能够导出到目标数据库
  7. 能够导出到SQL文件并生成导入脚本
  8. 支持多种字符集,包括:cp850、cp936、gb18030、utf8等
  9. 能够恢复未加密或者简单加密类型的数据
  10. 简单易用
  11. 限制:不支持AES加密的数据文件
请参考:研发成功了从Sybase SQL Anywhere的DB文件上恢复数据的工具
            SQL Anywhere数据库非常规恢复工具ReadASADB使用介绍

Sybase SQL Anywhere数据库恢复工具ReadASADB适用场景

各种误操作:

  1. 误截断表(truncate table)
  2. 误删除表(drop table)
  3. 错误的where条件误删数据
  4. 误删除db或log文件
  5. 误删除表中的字段

Sybase SQL Anywhere数据库恢复工具ReadASADB的应用场景:

1.因为物理磁盘故障、操作系统、系统软件方面或者掉电等等原因导致的Sybase SQL Anywhere数据库无法打开的情况;
2.误操作,包括truncate table,drop table,不正确的where条件导致的误删除等;
Sybase SQL Anywhere无法打开时,比较常见的错误是:Assertion failed。
如:
1、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Checkpoint log: invalid bitmap page -- transaction rolled back
2、Internal database error *** ERROR *** Assertion failed:201819 (8.0.1.2600) Page number on page does not match page requested -- transaction rolled back
3、Internal database error *** ERROR *** Assertion failed:200502 (9.0.2.2451) Checksum failure on page 23 -- transaction rolled back
4、File is shorter than expected
5、Internal database error *** ERROR *** Assertion failed: 201116 Invalid free list index page found while processing checkpoint log -- transaction rolled back
6、*** ERROR *** Assertion failed: 51901 Page for requested record not a table page or record not present on page
7、*** ERROR *** Assertion failed: 201417 (7.0.4.3541) Invalid count or free space offset detected on a table page
8、Internal database error *** ERROR *** Assertion failed: 201425 (8.0.3.5594) Invalid count or free space offset detected on a free list page -- transaction rolled back.
9、Internal database error *** ERROR *** Assertion failed: 100702 (8.0.1.2600) Unable to modify indexes for a row referenced in rollback log -- transaction rolled back


-------------------------------------------------------------------------------------------

Sybase ASE数据库恢复工具READSYBDEVICE:

一个不依赖数据库管理系统、直接从Sybase数据库设备文件上提取数据的业内领先的恢复工具!
能够从损坏的Sybase ASE设备文件(.dat)上提取数据的非常规恢复工具。

Sybase ASE数据库恢复工具READSYBDEVICE的主要功能:

  1. 被勒索病毒加密数据文件及备份文件情况下的恢复;
  2. 系统崩溃只剩下数据文件的情况下的恢复,甚至数据库文件不存在而只有损坏的备份文件情况下的恢复;
  3. 因断电、硬盘坏道等造成数据库文件损坏情况下的恢复;
  4. delete数据恢复、误update数据恢复、误删除表(drop)恢复、误truncate表恢复 等;
  5. 各种Sybase内部系统表损坏、索引错误的修复;
  6. master数据库损坏而无法正常运行情况下的恢复;
  7. Sybase数据库被标记为可疑,不可用等情况的恢复;
  8. Sybase数据库中数据文件内部出现坏块情况下的恢复;
  9. Sybase数据库无数据文件但有日志文件的情况下的恢复;
  10. Sybase数据库只有数据文件无任何日志文件的情况下的恢复;
  11. Sybase数据文件被误删除情况下的碎片提取恢复;
  12. 磁盘阵列上的Sybase数据库被误格式化情况下的数据库恢复;
  13. 数据库sysobjects等系统表损坏无法正常应用情况下的恢复;
  14. Sybase数据库还原数据库出现失败情况下的恢复;
  15. Sybase数据库只剩下损坏的备份文件情况下的恢复。

Sybase ASE数据库恢复工具READSYBDEVICE支持的版本:

Sybase ASE 11.0.x,11.5.x,11.9.x,12.0.x,12.5.x,15.0.x,15.5.x,15.7.x,16.0.x


-------------------------------------------------------------------------------------------

SQL Server数据库恢复工具SQLRescue:

一个不依赖数据库管理系统、直接从SQL Server数据库文件上提取数据的业内领先的恢复工具!
能够从损坏的SQL Server数据库文件(.mdf)上提取数据的非常规恢复工具。

SQL Server数据库恢复工具SQLRescue的主要功能:

  1. 系统崩溃只剩下数据文件的情况下的恢复,即无日志文件或者日志文件损坏情况下的恢复;
  2. 断电导致数据库文件损坏情况下的恢复;
  3. 硬盘坏道造成数据库损坏情况下的恢复;
  4. 数据文件内部存在坏页情况下的恢复;
  5. 企业管理器误删除数据表记录,管理软件误删除数据表记录的恢复;
  6. 并闩锁错误、格式化、误删除后导致软件不能使用的情况;
  7. 无法读取并闩锁页sysindexes失败情况下的修复;
  8. 数据文件被误删除情况下的碎片提取恢复;
  9. 系统表损坏、索引错误、误删除数据库表、删除记录的数据找回;
  10. master数据库损坏而无法正常运行情况下的恢复;
  11. 数据文件无法附加情况下的数据恢复;
  12. 数据库被标记为可疑,质疑,不可用等情况的恢复;
  13. 数据库sysobjects等系统表损坏情况下的恢复;
  14. 数据被误(drop、delete、truncate)删除表数据的恢复,误update后的数据恢复等;
  15. 还原时报一致性错误,错误823等情况下的数据恢复,各种错误提示的数据库文件修复;
  16. 数据库被误格式化等情况下的数据库恢复;
  17. 日志收缩造成数据库损坏情况下的恢复;
  18. 仅剩损坏的备份文件情况下的恢复。

SQL Server数据库恢复工具SQLRescue技术特点:

只要SQL Server数据库的数据文件存在,我们就有办法帮您从数据文件中找回重要数据。
  1. 从数据文件中直接恢复数据
  2. 不能附加时直接恢复数据并生成新的数据库
  3. 系统表损坏的数据库修复
  4. 快速修复SQL 823错误、连接中断错误

SQL Server数据库恢复工具SQLRescue支持的版本:

Microsoft SQL Server 7.0, 2000, 2005, 2008, 2008R2, 2012, 2014, 2016, 2017,2019。
+-------------------------------------华丽的分割线-------------------------------------------------------------------------