ITPub博客

首页 > 数据库 > 国内数据库 > GBase8s数据库调优-1

GBase8s数据库调优-1

原创 国内数据库 作者:DMD_202007 时间:2020-08-24 17:45:32 0 删除 编辑

影响GBase8s 数据库性能的主要参数

影响 CPU 使用率的配置参数和环境变量

Online 配置文件 onconfig 中的下列参数对 CPU 的利用率有明显的影响 :

·   NUMCPUVPS

·   SINGLE_CPU_VP

·   MULTIPROCESSOR

·   AFF_NPROCS

·   AFF_SPROC

·   NUMAIOVPS

·   OPTCOMPAND

·   NETTYPE

NUMCPUVPS 、 MULTIPROCESSOR 和 SINGL_CPU_VP

NUMCPUVPS 参数规定了 Online 开始启动的 CPU VP 的数量。分配的 CPU VP 的个数不要超过可以为它们服务的 CPU 的个数。

·   对于单处理器的计算机系统,建议使用一个 CPU VP 。

·   对于有 4 个以上 CPU ,主要用做数据库服务器的多处理器系统,建议设置 NUMCPUVPS 的值等于处理器总数减一。

·   对于双处理器系统,运行两个 CPU VP 可能会改善性能。这需要监控操作系统的 CPU 使用情况。可以使用操作系统命令 sar 或 vmstat 。

如果运行多个 CPU VP ,应将 MULTIPROCESSOR 设置为 1 ,当设置 MULTIPROCESSOR 为 1 时, Online 以对应于多处理器的方式执行锁定。否则,设置该参数为 0 。

注意:如果设置 SINGLE_CPU_VP 参数为,则 NUMCPUVPS 参数的值也必须是 1 ,如果后者大于 1 , Online 就不能初始化并显示下面的错误信息:

Cannot have 'SINGLE_CPU_VP' now-zero and 'NUMCPUVPS' greater than 1

AFF_NPROCS 和 AFF_SPROC

在支持 Online 和客户应用的系统上,可以通过操作系统把应用连接到某些特定的 CPU 。这样做可以有效地保留剩余的 CPU 给 Online CPU VP 使用,它们是用 AFF--NPROCES 和 AFF_SPROC 配置参数连接到剩余 CPU 的。

AFF_NPROCS 指定了连接到 Online 的 CPU VP 上的 CPU 的个数。连接一个 CPU VP 到一个 CPU 会引起该 CPU VP 在这个 CPU 上的排它性运行。

AFF_SPROC 指定了 Online 把 CPU VP 连接到 CPU 上时所启动的 CPU 。

AFF_NPROCS 规定了计算机上可以帮定 CPU VP 的 CPU 的数目。 NUMCPUVPS 参数指定了 Online 将启动的 CPU VP 的数目, AFF_SPROC 参数指定了 Online 连接第一个 CPU 序号。例如,某个 Online 系统所在的硬件平台有 8 个 CPU , AFF_NPROCS 设置为 8 (即可用于帮定 CPU VP 的 CPU 有 8 个), NUMCPUVPS 设置为 3 , AFF_SPROC 设置为 5 ,则 3 个 CPU VP 需要帮定到 CPU 上,是从第五个 CPU 开始,帮定到第五、六、七个 CPU 上。需要注意的是, AFF_SPROC 的取值是在 0 和( AFF_NPROCS - NUMCPUVPS + 1) 这两个值之间的,不能大于后者。

NUMAIOVPS

参数 NUMAIOVPS 指定最初产生的 AIO VP 的数目。如果所在的操作系统不支持核心异步 I/O ( KAIO ), Online 使用 AIP VP 来处理所有数据库 I/O 请求。

推荐的 AIP VP 数目取决于 Online 使用的硬盘个数。如果所在操作系统不支持或没有使用 KAIO ,则建议对包含数据库表的每一个磁盘分配一个 AIO VP 。可以对 Online 频繁访问的每六块增加额外的 AIO VP 。

如果所在的操作系统使用 KAIO VP , CPU VP 将直接向操作系统发出原始的 I/O 请求。在这种情况下,可以只配置一个 AIO VP ,此时 AIO VP 只处理文件系统方式的 chunk 。如果文件系统方式的 chunk 有增加时,可以增大 AIO VP 的数目。

分配 AIO VP 的目的是要分配足够的 AIO VP 以便 I/O 请求队列的长度保持很短,即队列中保持尽可能少的 I/O 请求。

OPTCOMPIND

OPTCOMPIND 参数帮组优化程序为应用选择合适的访问方法。

·   如果 OPTCOMPIND 等于 0 ,优化程序给予现存索引优先权,即使在表扫描比较快时。

·   如果 OPTCOMPIND 设置为 1 ,给定查询的隔离级设置为 Repeatable Read 时,优化程序才使用索引。

·   如果 OPTCOMPIND 等于 2 ,优化程序选择基于开销选择查询方式。,即使表扫描可以临时锁定整个表。

NETTYPE

NETTYPE 参数为 Online 实例支持的每个连接类型配置轮询线索。如果 sqlhosts 文件中支持一个以上的接口或协议的连接,就必须对每个连接类型规定独立的 NETTYPE 参数。也即,每中与数据库服务器名字有关的连接类型都需要单独指定一个 NETTYPE 参数。

每个用 NETTYPE 表项配置或动态加入的轮询线索在不同的 VP 上运行,轮询线索可以在两类 VP 上运行: NET VP 和 CPU VP 。为得到最佳性能,建议使用 NETTYPE 表项为 CPU VP 类只分配一个轮询线索,将其余轮询线索轮询线索分配给 NET VP 。分配给任何一种连接类型的轮询线索不得超过 NUMCPUVPS 的取值。

单 CPU 计算机上每个轮询线索的最佳连接个数不超过 300 ,多 CPU 机上可多达 350 个。但一个轮询线索最多支持 1 , 024 甚至更多的连接。

NETTYPE 的配置格式如下:

NETTYPE connection_type , poll_threads , c_per_t , vp_class

·   connection_type 标识轮询线索分配的连接协议。

·   poll_threads 是分配给该连接类型的轮询线索数目。对任何连接类型,这个值不能超过 NUMCPUVPS 值。

·   c_per_t 是每个轮询线索的连接数目。可以用如下公式计算这个值:

c_per_t = connections / poll_threads

connections 是所希望指定的连接类型支持的最大连接数。对于共享内存连接( ipcshm) ,该值应该加倍以获得最好的性能。

·   vp_class 是可运行轮询线索的 VP 类。如果 CPU VP 上只运行一个轮询线索,那么指定为 CPU VP 。为了达到最好性能,当要求多个轮询线索时应该指定为 NET VP 。

如果 c_per_t 的值超过了 350 ,而当前连接的轮询线索数小于 NUMCPUVPS ,可以增加轮询线索数目,但不能超过 NUMCPUVPS ,然后重新计算 c_per_t 的取值。

注意:每个 ipcshm 连接需要一个信号量。当 c_per_t 的值很大时,对于某些操作系统要相应增加信号量。

如何监控系统 CPU 的使用情况:

1. 使用 UNIX 的监控工具 sar 或 vmstat 来监控 CPU 的使用情况。

例: sar 5 10

%usr %sys %wio %idle
10:06:22 34 1 0 65
10:06:27 34 2 0 64
10:06:32 34 1 0 65
10:06:37 17 1 0 82
10:06:47 1 1 0 98

连续监控 %idle 来确认 CPU 没有超载。如果 %sys 的值很大则可能应用有问题。

2. 监控 CPU vp 的方法

onstat -g glo
Individual virtual processors:
vp pid class usercpu syscpu total

可以通过该监控看出 CPU 忙占用的时间 ( 隔 60 秒分别监控结果)。如果非常忙,则需要增加 CPU VP 。

onstat -g rea
Ready threads
tid tcb rstcb prty status vp-class name

如果有大量的线索在等待队列中,则说明需要增加 CPU VP 。

影响内存使用效率的 Online 配置参数

·   SHMVIRTSIZE

·   SHMADD

·   BUFFERS

·   RESIDENT

·   STACKSIZE

·   LOCKS

·   LOGBUFF

·   PHYSBUFF

SHMVIRSIZE

SHMVIRTSIZE 参数规定了初始分配给 Online 的共享内存的虚拟区的大小。共享存储器的虚拟区存储与会话、请求有关的数据及其它信息。虽然 Online 按处理大型查询或高峰负荷的需要增加共享内存给虚拟区,但共享内存的分配增加事务处理的时间,建议设置 SHMVIRTSIZE 以提供一个满足一般日常操作需要的虚拟接口。

SHMADD

SHMADD 参数规定 Online 自动加到虚拟区的共享内存增量的大小。在决定该值的大小时有些折中因素。增加共享内存要占用 CPU 周期:每次的增加量越大,增加次数就越少,留给其它的进程的内存也越少。通常采用大增加量,但当内存负荷很重时,少量增加使其他程序更好的共享内存资源。有如下建议:

内存大小

SHMADD

<=256MB

8192KB(default)

256--512MB

16,384KB

>=512

32,768KB

BUFFERS

BUFFERS 是可以用于 Online 的数据缓冲区数。这些缓冲区驻留在驻留区,用来缓存主存中的数据库的数据页。可用的缓冲区越多,所需的数据页就越可能用于前一次请求而已经在内存里。这个参数对数据库 I/O 和事务处理吞吐量有明显的影响。但是,分配过多的缓冲区会影响内存系统并导致过多的页面活动。

8s 建议设置 BUFFERS 为物理内存 ( 以 MB 为单位 ) 的 20% 到 25% 。实际 BUFFERS 的单位为页,不同操作系统的页大小是不同的,因此需要计算。

使用 onstat -p 监控读缓存的频率。这个频率代表一个查询请求的数据库页已经在共享内存里的百分比。(还没有存在的页必须从磁盘拷贝到内存中)。如果此值很低,可增加 BUFFERS 并重新启动 Online 。在增加 BUFFERS 值时,到达某一点后,增加 BUFFERS 也不再明显改善读缓存的频率,或者达到操作系统共享内存分配的上限。 如果读高速缓存的比率很高,则应下调 BUFFERS 并重启动 Online 。

RESIDENT

RESIDENT 参数规定是否强制共享内存驻留作为 Online 共享内存驻留区。这个参数只对支持强制驻留的机器有效。 Online 中的驻留区,包含用于数据库读写作业的 LRU 队列。

LOCKS

参数 LOCKS 设置任意时刻可用的锁的最大数量。 Online 中每个锁需要占用驻留区段的 44 个字节,分配共享内存时要考虑锁所用的资源。一般锁可以分配的大些,对应用比较忙的系统可以到 800 万以上。

LOGBUFF

参数 LOGBUFF 指定为三个用来保存逻辑日志记录的缓冲区分别保留的共享内存的数量。这些缓冲区保存着逻辑日志记录,直到它们被刷新到硬盘上的逻辑日志文件。缓冲区的大小决定了它被添满的频率,从而决定了它必须被刷新到硬盘上的逻辑文件中的频率。

PHYSBUFF

参数 PHYSBUFF 指定为两个用来暂时保存将被修改的数据页的缓冲区分别保留的共享内存的数量。缓冲区的大小决定了它被添满的频率,从而也决定了它被写到硬盘上的物理日志的频率。

如何监控内存使用情况:

1. 使用 onstat -g seg 命令监控共享内存的 segments 。

onstat -g seg
Segment Summary
(resident segments are not locked)
id key addr size ovhd class blkused blkfree

这里三行分别代表了驻留内存段( class 为 R) 、虚拟内存段 (class 为 V) 、消息内存段 (class 为 M) 。 blkused 和 blkfree 分别代表使用空间和空闲空间。如果虚拟内存段的 blkused 频繁增加,则需要将 SHMVIRTSIZE 和 SHMADD 相应调大,调整后重新启动 Online 。

2. 使用 onstat -p

1 ) ovlock 指出分配的 locks 的不足量,如果该值持续增长,则需要增大参数 LOCKS 的值。。

2 ) ovbuf 指出分配的 buffers 的不足量,如果该值持续增长,则需要增大参数 BUFFERS 的值。。

3 ) lockwaits/lockreqs * 100 应该小于 1% ,如果这个计算值比较高,则应有如下考虑:。

·   是否用了太多的 page level locks 。如果是,可以考虑用 row level locks 。

·   考虑用了 table level lock 的应用是否可以用其它类型的 lock 。

·   是否有太多的 isolation 设置为 Repeatable Read 和 Cursor Stability 。确定是否可以使用更多的 Dirty Read 来替代。

4 ) bufreads %cached 的值指出 buffer 读的百分比,该值建议大于 95% ,否则增大 BUFFERS , bufwrits %cached 的值指出 buffer 写的百分比,该值建议大于 85% ,但太大如大于 97% 则可以将 BUFFERS 相应减少些。 。

影响 I/O 的配置参数

·   CKPTINTVL

·   PHYSFILE

·   CLEANERS

·   LRUS

·   LRU_MAX_DIRTY

·   LRU_MIN_DIRTY

CKPINTVL , PHYSFILE

CKPINTVL 参数指定检查点之间的时间间隔。当检查点间隔到了,则系统执行检查点操作。但如果这期间的所有数据物理上是一致的, Online 可以跳过检查点操作。另外,一旦物理日志( PHYSFILE )的 75% 已满,检查点也会发生。通过设置 CKPTINTVL 为长时间间隔,可以利用物理日志容量来触发基于实际数据库活动而不是任意时间单位的检查点操作。但是,使用长检查点间隔回增加失败事件之后的恢复时间。

LRUS 、 LRU_MAX_DIRTY 和 LRU_MIN_DIRTY

LRUS 参数指示共享内存缓冲池中设置的最近最少使用( LRU )队列数目。配置较多的 LRU 队列将允许有更多的页清除器操作,并减少每个 LRU 队列的大小。对于单 CPU 系统,建议设置 LRUS 参数为最小值 4 。对于多 CPU 系统,建议设置 LRUS 为最小值 4 和 NUMCPUVPS 的取值之中较大的一个。

可以用 LRUS 和 LRU_MAX_DIRTY 及 LRU_MIN_DIRTY 来控制在满的检查点之间页被刷新到磁盘的频度。在某些情况下,通过设置这些参数,使得在检查点发生时需要刷新的修改的页数量很少,可以达到高的吞吐量;这样,检查点的主要功能是更新物理日志和逻辑日志文件。

CLEANERS

CLEANERS 参数指定执行的页清除线索的数目。对于少于 20 磁盘的系统, 8s 推荐 CLEANERS 的取值为磁盘的个数。对于 20 至 100 的磁盘的系统,推荐每两个磁盘分配一个 CLEANERS 。对于更多的磁盘系统,推荐每四个磁盘分配一个 CLEANERS 。

如何监控系统的 I/O 情况

使用 onstat -g ioq , onstat -g iof, onstat -d 监控磁盘的负载情况:

onstat -g ioq
AIO I/O queues:
class/hvp-id len maxlen totalops dskread dskwrite dskcopy

如果 aio 队列很大,则可增加一个 AIO VP 。

如果某些 class 为 gfd 所对应的 len 和 maxlen 非常大,则需要考虑你的数据分布是否合理,记住这些 gfd 所对应的 hvp-id 的值,再通过 onstat -g iof 查出是那几个设备 :

onstat -g iof
gfd pathname totalops dskread dskwriteio/s

这里 gfd 的值等于 onstat -g ioq 中那几个 hvp-id 的值所对应的 pathname 就是 I/O 负载较大的设备。用 onstat -d 可确定是哪个 dbspace 。则可以考虑重新分配磁盘

  查询优化技术

 

1 .合理使用索引

索引是数据库中重要的数据结构,它的根本目的就是为了提高查询效率。现在大多数的数据库产品都采用 ISAM 索引结构。索引的使用要恰到好处,其使用原则如下:

● 在经常进行连接,但是没有指定为外键的列上建立索引,而不经常连接的字段则由优化器自动生成索引。

● 在频繁进行排序或分组 ( 即进行 group by 或 order by 操作 ) 的列上建立索引。

● 在条件表达式中经常用到的不同值较多的列上建立检索,在不同值少的列上不要建立索引。比如在雇员表的 “ 性别 ” 列上只有 “ 男 ” 与 “ 女 ” 两个不同值,因此就无必要建立索引。如果建立索引不但不会提高查询效率,反而会严重降低更新速度。

● 如果待排序的列有多个,可以在这些列上建立复合索引 (compound index) 。

● 使用系统工具。如 8s 数据库有一个 tbcheck 工具,可以在可疑的索引上进行检查。在一些数据库服务器上,索引可能失效或者因为频繁操作而使得读取效率降低,如果一个使用索引的查询不明不白地慢下来,可以试着用 tbcheck 工具检查索引的完整性,必要时进行修复。另外,当数据库表更新大量数据后,删除并重建索引可以提高查询速度。

2 .避免或简化排序

应当简化或避免对大型表进行重复的排序。当能够利用索引自动以适当的次序产生输出时,优化器就避免了排序的步骤。以下是一些影响因素:

● 索引中不包括一个或几个待排序的列;

●group by 或 order by 子句中列的次序与索引的次序不一样;

● 排序的列来自不同的表。

为了避免不必要的排序,就要正确地增建索引,合理地合并数据库表 ( 尽管有时可能影响表的规范化,但相对于效率的提高是值得的 ) 。如果排序不可避免,那么应当试图简化它,如缩小排序的列的范围等。

3 .消除对大型表行数据的顺序存取

在嵌套查询中,对表的顺序存取对查询效率可能产生致命的影响。比如采用顺序存取策略,一个嵌套 3 层的查询,如果每层都查询 1000 行,那么这个查询就要查询 10 亿行数据。避免这种情况的主要方法就是对连接的列进行索引。例如,两个表:学生表 ( 学号、姓名、年龄 ……) 和选课表 ( 学号、课程号、成绩 ) 。如果两个表要做连接,就要在 “ 学号 ” 这个连接字段上建立索引。

还可以使用并集来避免顺序存取。尽管在所有的检查列上都有索引,但某些形式的 where 子句强迫优化器使用顺序存取。下面的查询将强迫对 orders 表执行顺序操作:

SELECT * FROM orders WHERE (customer_num=104 AND order_num>1001) OR order_num=1008

虽然在 customer_num 和 order_num 上建有索引,但是在上面的语句中优化器还是使用顺序存取路径扫描整个表。因为这个语句要检索的是分离的行的集合,所以应该改为如下语句:

SELECT * FROM orders WHERE customer_num=104 AND order_num>1001
UNION
SELECT
* FROM orders WHERE order_num=1008

这样就能利用索引路径处理查询。

4 .避免相关子查询

一个列的标签同时在主查询和 where 子句中的查询中出现,那么很可能当主查询中的列值改变之后,子查询必须重新查询一次。查询嵌套层次越多,效率越低,因此应当尽量避免子查询。如果子查询不可避免,那么要在子查询中过滤掉尽可能多的行。

5 .避免困难的正规表达式

MATCHES 和 LIKE 关键字支持通配符匹配,技术上叫正规表达式。但这种匹配特别耗费时间。例如:

SELECT * FROM customer WHERE zipcode LIKE “98_ _ _”

即使在 zipcode 字段上建立了索引,在这种情况下也还是采用顺序扫描的方式。如果把语句改为 SELECT * FROM customer WHERE zipcode >“98000” ,在执行查询时就会利用索引来查询,显然会大大提高速度。

另外,还要避免非开始的子串。例如语句:

SELECT * FROM customer WHERE zipcode[2 , 3] >“80”

在 where 子句中采用了非开始子串,因而这个语句也不会使用索引。

6 .使用临时表加速查询

把表的一个子集进行排序并创建临时表,有时能加速查询。它有助于避免多重排序操作,而且在其他方面还能简化优化器的工作。例如:

SELECT cust.name , rcvbles.balance , ……other columns
FROM cust
, rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
AND cust.postcode>“98000”
ORDER BY cust.name

如果这个查询要被执行多次而不止一次,可以把所有未付款的客户找出来放在一个临时文件中,并按客户的名字进行排序:

SELECT cust.name , rcvbles.balance , ……other columns
FROM cust
, rcvbles
WHERE cust.customer_id = rcvlbes.customer_id
AND rcvblls.balance>0
ORDER BY cust.name
INTO TEMP cust_with_balance

然后以下面的方式在临时表中查询:

SELECT * FROM cust_with_balance
WHERE postcode>“98000”

临时表中的行要比主表中的行少,而且物理顺序就是所要求的顺序,减少了磁盘 I/O ,所以查询工作量可以得到大幅减少。

注意:临时表创建后不会反映主表的修改。在主表中数据频繁修改的情况下,注意不要丢失数据。

7 .用排序来取代非顺序存取

非顺序磁盘存取是最慢的操作,表现在磁盘存取臂的来回移动。 SQL 语句隐藏了这一情况,使得我们在写应用程序时很容易写出要求存取大量非顺序页的查询。

有些时候,用数据库的排序能力来替代非顺序的存取能改进查询。
下面我们举一个制造公司的例子来说明如何进行查询优化。制造公司数据库中包括 3 个表,模式如下所示:

1 . part 表
零件号 零件描述 其他列
(part_num) (part_desc) (other column)
102
, 032 Seageat 30G disk ……
500
, 049 Novel 10M network card ……
……
2
. vendor 表
厂商号 厂商名 其他列
(vendor _num) (vendor_name) (other column)
910
, 257 Seageat Corp ……
 
……
3
. parven 表
零件号 厂商号 零件数量
(part_num) (vendor_num) (part_amount)
102
, 032 910 , 257 3,450,000
234
, 423 321 , 001 4 , 000 , 000
……

下面的查询将在这些表上定期运行,并产生关于所有零件数量的报表:

SELECT part_desc , vendor_name , part_amount
FROM part
, vendor , parven
WHERE part.part_num=parven.part_num
AND parven.vendor_num = vendor.vendor_num
ORDER BY part.part_num

如果不建立索引,上述查询代码的开销将十分巨大。为此,我们在零件号和厂商号上建立索引。索引的建立避免了在嵌套中反复扫描。关于表与索引的统计信息如下:

表
  (table)

行数量
  (row size)

行尺寸
  (Row count)

每页行数量
  (Rows/Pages)

数据页数量
  (Data Pages)

part

150

10 , 000

25

400

Vendor

150

1 , 000

25

40

Parven

13

15 , 000

300

50

索引
  (Indexes)

键尺寸
  (Key Size)

每页键数量
  (Keys/Page)

页面数量
  (Leaf Pages)


part

4

500

20


Vendor

4

500

2


Parven

8

250

60


看起来是个相对简单的 3 表连接,但是其查询开销是很大的。通过查看系统表可以看到,在 part_num 上和 vendor_num 上有簇索引,因此索引是按照物理顺序存放的。 parven 表没有特定的存放次序。这些表的大小说明从缓冲页中非顺序存取的成功率很小。此语句的优化查询规划是:首先从 part 中顺序读取 400 页,然后再对 parven 表非顺序存取 1 万次,每次 2 页 ( 一个索引页、一个数据页 ) ,总计 2 万个磁盘页,最后对 vendor 表非顺序存取 1.5 万次,合 3 万个磁盘页。可以看出在这个索引好的连接上花费的磁盘存取为 5.04 万次。

实际上,我们可以通过使用临时表分 3 个步骤来提高查询效率:

1 .从 parven 表中按 vendor_num 的次序读数据:

SELECT part_num , vendor_num , price
FROM parven
ORDER BY vendor_num
INTO temp pv_by_vn

这个语句顺序读 parven(50 页 ) ,写一个临时表 (50 页 ) ,并排序。假定排序的开销为 200 页,总共是 300 页。

2 .把临时表和 vendor 表连接,把结果输出到一个临时表,并按 part_num 排序:

SELECT pv_by_vn ,* vendor.vendor_num
FROM pv_by_vn
, vendor
WHERE pv_by_vn.vendor_num=vendor.vendor_num
ORDER BY pv_by_vn.part_num
INTO TMP pvvn_by_pn
DROP TABLE pv_by_vn

这个查询读取 pv_by_vn(50 页 ) ,它通过索引存取 vendor 表 1.5 万次,但由于按 vendor_num 次序排列,实际上只是通过索引顺序地读 vendor 表 (40 + 2=42 页 ) ,输出的表每页约 95 行,共 160 页。写并存取这些页引发 5 * 160=800 次的读写,索引共读写 892 页。

3 .把输出和 part 连接得到最后的结果:

SELECT pvvn_by_pn. *, part.part_desc
FROM pvvn_by_pn
, part
WHERE pvvn_by_pn.part_num=part.part_num
DROP TABLE pvvn_by_pn

这样,查询顺序地读 pvvn_by_pn(160 页 ) ,通过索引读 part 表 1.5 万次,由于建有索引,所以实际上进行 1772 次磁盘读写,优化比例为 30 ∶ 1 。笔者在 8s 数据库上做同样的实验,发现在时间耗费上的优化比例为 5 ∶ 1( 如果增加数据量,比例可能会更大 ) 。

小 结

20 %的代码用去了 80 %的时间,这是程序设计中的一个著名定律,在数据库应用程序中也同样如此。我们的优化要抓住关键问题,对于数据库应用程序来说,重点在于 SQL 的执行效率。查询优化的重点环节是使得数据库服务器少从磁盘中读数据以及顺序读页而不是非顺序读页。

 

 

官网:


来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69980677/viewspace-2714323/ ,如需转载,请注明出处,否则将追究法律责任。

请登录后发表评论 登录
全部评论

注册时间:2020-07-31

  • 博文量
    36
  • 访问量
    31943