1.优化硬件/操作系统
当硬件/操作系统进行优化时,可以设置一些参数来影响处理器操作进程的方式。这里一共有三个参数,它们的值由计算机上的处理器数量决定:
-
MULTIPROCESSOR 告诉数据库服务器它是否对多处理器机器需要额外的开销
-
AFF_NPROCS 和 AFF_SPROC 能够绑定 CPUVPs 到指定的 CPU 上
-
NOAGE可以关闭优先级的老化机制
1.1 MULTIPROCESSOR
MULTIPROCESSOR 设定数据库是以单处理器还是多处理器计算机的方式来锁定进程:
- 0 = 单处理器计算机
- 1 = 多处理器计算机
如果您正在一个多处理器计算机上运行多个 CPU 虚拟处理器,将 ONCONFIG 文件中的MULTIPROCESSOR参数设置为 1。MULTIPROCESSOR 设置为 1,数据库服务器将以适合多处理器计算机的方式锁定进程。
设置 MULTIPROCESSOR 为 0 将使得数据库服务器不使用在多处理器计算机上处理多线程的锁的方式。
1.2 AFF_NPROCS 与 AFF_SPROC
在支持处理器关联性的多处理器计算机上,CPU编号是从0开始,AFF_SPROC 指定了数据库服务器可以从哪一个CPU开始将 CPU 虚拟处理器绑定到CPU。AFF_NPROCS 参数则指定了数据库服务器会绑定的 CPU 的数量。NUMCPUVPS 参数指定了数据服务器会启动的 CPU 虚拟处理器的数量,AFF_SPROC 参数指定了 CPU编号,数据库管理器将把第一个虚拟处理器运行在上面,AFF_NPROCS 指定了可绑定的CPU数量。例如,如果您的平台有 8 个 CPU,您将 AFF_NPROCS 设置为 3,AFF_SPROC 设置为 5,数据库服务器将会把 CPU 虚拟处理器绑定到编号为 6、7 或 8 的CPU 上。
1.3 NOAGE
一些操作系统会在进程运行时间过长的情形下降低进程的优先级别。将 NOAGE 设置为 1会禁用操作系统对CPU虚拟处理器的优先级老化。。而将 NOAGE 设置为缺省的 0,会使得操作系统随着累积的处理时间而降低 CPU 虚拟处理器的优先级别,就跟它降低其它处理器的优先级一样。SinoDB 推荐将 NOAGE 设置为 1。
2. 预读Read-ahead
当有更多的数据可以从共享存储而不是磁盘中读取时,应用程序反应速度会更快。服务器使用一种叫做预读 的机制来将数据页提前从磁盘读到共享存储,来参与用户对数据页的读取过程。预读发生在当服务器发现 SELECT 语句或其他操作需要对表或索引进行顺序读取而所需的页又不在共享存储缓冲池中的情形下。
有两个配置参数可以用来选择顺序数据页预读操作。第一个是 RA_PAGES,它是指定服务器执行顺序读取时,预读的页数。第二个是 RA_THRESHOLD,也就是预读到剩余多少页数时,会触发下一个预读。
示例:
假设 RA_PAGES 设置为 10,RA_THRESHOLD 设置为 7。这意味着,发现需要进行顺序读取时,AIO VP 首先为请求者立即读取需要的初始页。额外申请10 页的独立请求也会被置于 AIO 队列中。预读的页从磁盘中读出,然后放入到共享存储。如果请求者已经从共享存储中访问了 10 页中的 3 页,则阈值为 7 页,将在此时从磁盘中再读取 10 页然后放入共享存储。
2.1 预读类型
下列情况中会使用预读:
- 顺序扫描——当查询计划要求顺序读取数据页时会触发预读机制。预读通常发生在SELECT 语句没有 WHERE 子句或者索引建立时的情形下。如果表没有可用的索引,也会使用顺序扫描。以下就是可能触发顺序预读的SELECT语句例子:
SELECT * FROM customer
- Key-only搜索——这种预读发生在仅需读取索引时。也就是说需要利用索引进行数据检索,而SELECT 子句中需要的的字段又都是索引的一部分时,这些情况下将使用Key-only搜索。例如,如果customer_num 有索引,下列 SELECT 语句可能触发Key-only搜索:
SELECT customer_num FROM customer WHERE customer_num > 200
- 使用索引的顺序扫描——在某些情况下,当SELECT 语句需要读取一系列数据时,会使用逻辑 扫描而不是顺序扫描数据页。换句话说,数据库服务器首先顺序读取索引叶节点,但是接着会去读取与键值相关的数据页,因此这时有可能不是顺序读取。
在最后两种情况下,服务器不需要读取完索引 B 树来获取索引数据。B 树的叶节点上有指针指向下一个叶节点,因此也能被顺序读取。
Key-only预读取
使用Key-only搜索和索引顺序扫描进行预读这两种方式和仅仅是顺序扫描的预读工作方式是不同的。
预读时数据库服务器从1级页面(0级以上的页,或叶页面)开始读取,接着读取1级页面指向的所有叶页面。
以下情况的表示预读完成:
- 数据库服务器到达查询范围的键的尽头。
- 数据库服务器预读完成1级页面指向的所有叶页面。
- 达到预读页数限制。页数限制为以下两个运算结果的最大值:
— (# buffers /#sessions )
— 缓冲区总数量的 75%
如果两个运算结果均小于 RA_PAGES,则将 RA_PAGES 作为预读取页数限制。
使用索引进行扫描的预读
使用索引进行顺序扫描的预读,必须预读索引页和数据页。预读时数据库服务器从叶页面开始读取,接着读取叶页面指向的所有数据页。
以下情况的发生标志着预读完成:
- 数据库服务器到达查询键范围尽头。
- 数据库服务器读取当前叶页面指向的所有数据页面。
- 达到预读页数限制。页数限制为以下运算结果的最大值:
— (# buffers / #sessions )
— 缓冲区总数量的 75%
如果两个运算结果均小于 RA_PAGES,则将 RA_PAGES 作为预读取页数限制。
3. 恢复线程
恢复线程变量:
- OFF_RECVRY_THREADS: 执行快速恢复或是离线恢复时并行工作线程的数量.
- ON_RECVRY_THREADS:联机恢复时并行工作线程的数量.
恢复期间,用于前滚逻辑日志的线程数量是由OFF_RECVRY_THREADS 和ON_RECVRY_THREADS 配置参数来指定的。OFF_RECVRY_THREADS 指定当系统处于恢复模式时进行恢复所分配的线程数量。这些线程也用于快速恢复期间的前滚逻辑日志。ON_RECVRY_THREADS 配置参数指定当系统处于联机模式时进行恢复所分配的线程数量。
配置指南
由于脱机状态下系统中没有用户,因此大多数情况下,需要配置较多的脱机恢复线程。首先配置OFF_RECVRY_THREADS数量为系统中接受大量事务的表的大致数量。对于单处理器机器来说,脱机恢复中,配置的线程最好不要超过 30-40 个。
4. 使用操作系统时间
USEOSTIME 配置参数指定了获取时间的方法。若 USEOSTIME 设为 1,则使用操作系统调用获取时间。对于 SQL 语句时间精确度要求为亚秒的系统,使用这种方法更好。但是,这种方法不够高效。若 USEOSTIME 设为 2,则服务器从操作系统中每隔一秒获取一次时间。系统默认值为 0,这是最高效的选项。
如果 USEOSTIME 设为0 ,则应用程序不能在SELECT语句中使用 CURRENT 函数来得到当前时间一秒中的小数部分。当前时间返回值的精确度为一秒。
5. 并发数据查询 (PDQ)
PDQ充分运用到多处理器的计算机的处理能力将大型的数据查询分解成多个并行任务来达到最佳的效能。并行 PDQ 操作包括:
- 并行扫描
- 并行联接
- 并行排序
- 并行分组
- 并行聚集
并行数据库查询(PDQ)将整个 SQL 查询任务的执行分发给几个处理器。PDQ 的目标是提升复杂数据查询的性能,这种复杂数据查询是许多决策支持系统的基础。
PDQ 并行组件
PDQ 由五个并行组件构成:并行扫描、并行联接、并行排序、并行聚合和并行分组。查询被并行处理时,会为每个并行组件启动多个线程,每个线程完成任务的一个子集。这些线程可以 在不同 CPU VP 上运行,也就是说这些线程也可以运行在在不同物理处理器上。 多个物理处理器可以为一个用户开展工作从而使真正的并行得以实现。
无并行操作
下列情况下不能调用 PDQ 线程:
- 没有并行操作的查询,如上所示。
- 使用 CURSOR STABILITY 隔离模式优化的查询。
- 查询中含有 FOR UPDATE 或 WITH HOLD。
- 包含相关子查询的父查询。
- 含有 SPL 调用的查询;如:
SELECT col FROM tab WHERE col2 = PROC(col3)
5.1 PDQ管理
PDQ 管理涉及了为并行数据库查询分配资源,通过以下设置来完成:
- 配置参数
- 环境变量
通常情况下,并行数据库查询为涉及大量数据的复杂查询,因此需要大量系统资源,特别是内存方面的资源。使用 PDQ 时,管理资源是系统管理不可缺少且关键的一部分。PDQ 管理提供:
- 在会话和系统级别,管理分配给并行查询的资源的方法。
- 在各查询之间平衡资源的方法。
5.2 PDQ配置参数
默认的PDQ 配置参数值:
MAX_PDQPRIORITY 100 # 允许最大的 pdqpriority值
DS_MAX_QUERIES # 最大的决策支援查询个数
DS_TOTAL_MEMORY # 决策支援可用内存空间大小(KB)
DS_MAX_SCANS 1048576 # 最大决策支援扫描的个数
DATASKIP # 可省略不扫描的dbspace列表
用于配置PDQ 的配置参数如上所示。
- MAX_PDQPRIORITY 指定了 PDQ 查询可获得的资源数量限制。PDQPRIORITY 乘以 MAX_PDQPRIORITY 的值决定并行查询执行时的优先级别。系统管理员可以使用 MAX_PDQPRIORITY 来平衡 OLTP 和 DSS 查询之间的资源分配。例如,在白天 OLTP 活动率最高的时候,应该减少 DSS 查询可用资源。晚上 OLTP 活动减弱时,可以增加 MAX_PDQPRIORITY 以允许 DSS 查询使用更多资源。
- DS_MAX_QUERIES 限制了可以同时运行的并行查询数量。
- DS_TOTAL_MEMORY 限制了并行数据库查询的可用共享内存总量。并行查询的共享内存被分配在数据库服务器的虚拟内存中。
- DS_MAX_SCANS 限制了服务器可以运行的扫描线程总数量。系统会为每个待检查的片段启动一个扫描线程。
- DATASKIP 可以让服务器在查询时跳过对处于脱机模式的chunk的扫描。
5.3 内存授权管理器(MGM)
内存授权管理器(MGM)控制并保留并行数据库查询使用的资源。包括:
- 并发并行查询数量。
- 为服务器启动的扫描线程数量以及为每个并行查询启动的扫描线程数量。
- 每个并行查询可用的内存数量。
PDQPRIORITY 大于 0的所有并行数据库查询都必须经过内存授权管理器 (MGM)。
如要监控MGM的活动,可以运行 onstat -g mgm 指令。
6. SQL语句高速缓存SQL Statement Cache
SQL 语句高速缓存(SSC) 提高了多个会话执行相同语句时的OLTP 性能:
- SQL 语句置于共享区域
- 减少会话级别内存所需的空间
- 避免对相同语句的进行重复解析
SinoDB动态服务器允许会话共享 SQL 语句信息。因此,执行相同语句的多个会话可以共享存储在内部数据结构中的信息。SQL 语句高速缓存功能可降低会话级别的内存利用率,并消除重新分析语句的需要。
数据库服务器使用共享内存虚拟部分中一个名为 SQL语句高速缓存(SSC)的区域来存储能够被其他用户执行的已解析并优化好的查询。
对于一个拥有大量潜在可共享预编译语句(即许多语句是相同的)的公司来说,SSC 功能十分强大。SSC 的主要目标是减少应用程序环境的内存消耗。
仅数据操作语言 (DML)(选择、插入、更新和删除)可以被高速缓存。此功能默认是关闭的。
6.1 配置参数
-
STMT_CACHE
— 0 = Disabled
— 1 = Enabled, Sessions off
— 2 = Enabled, Sessions on -
STMT_CACHE_SIZE:72KB 系统默认值
可在不同级别控制此功能。全局级别的控制可以通过配置参数 STMT_CACHE 和 STMT_CACHE_SIZE 来实现。当会话或应用程序级别没有设置配置参数时,这些参数将作为系统默认值来使用。
STMT_CACHE
这个配置参数是语句高速缓存功能。数值 0 会禁用语句高速缓存。数值 1 启动不带会话默认值的语句高速缓存。数值 2 开启带有会话默认值的语句高速缓存。默认值为 0。
STMT_CACHE_SIZE
SQL 语句高速缓存的大小是通过设置STMT_CACHE_SIZE来实现的。如果没有设置此配置参数,系统默认值 72 千字节。无论参数值的大小,如果高速缓存已满且所有语句仍在活动中,新的语句将使得高速缓存继续增长。然后,当SQL 语句不再被使用时,内存会被释放直到大小小于或等于 STMT_CACHE_SIZE 。
6.2 环境变量和SQL选项
-
STMT_CACHE 环境变量 (仅当配置参数 STMT_CACHE > 0时)
— 0 = 关闭
— 1 = 开启
示例:export STMT_CACHE = 1 -
SQL 命令:SET STMT_CACHE
SQL 语句高速缓存既可以通过配置参数实现全局控制利用,也可从会话和应用程序级别对其进行控制。仅当 STMT_CACHE 配置参数设为 1(有效)时,会话和应用程序控制才有效。动态服务器为环境变量 STMT_CACHE 设置为 1 或在应用程序中执行 SET STATEMENT CACHE ON 命令的用户启动 SQL 语句高速缓存。STMT_CACHE 值为 0 时,语句高速缓存被禁用。
环境变量语法:
export STMT_CACHE={0|1}
SQL 命令语法:
SET STMT_CACHE {ON|OFF}