存储系统能调优是 数据库调优是什么

seosqwseo4周前 (08-24)测评日记19

一、rocksdb性能调优

一、关键参数

create_if_missing:创建缺失表

num_levels:层次数量,默认是7。如果L0大小有512MB,6层能容纳512M+512M+5G+50G+500G+5T,如果配置是7,在数据量少于前面计算的5T+的数据之前,后一层是不会被使用的。如果num_levels配置为6,那么下面一层数据量会大于5T

max_background_flushes:memtable dump成sstable的并发线程数。默认是1,线程数小,当写入量大时,会导致无法写入。

max_background_compactions:底层sst向高层sst compact的并发线程数。并发compaction会加快compaction的速度,如果compaction过慢,达到soft_pending_compaction_bytes_limit会发生阻塞,达到hard_pending_compaction_bytes会停写。

max_write_buffer_number:指定memtable和immutable memtable总数。当写入速度过快,或者flush线程速度较慢,出现memtable数量超过了指定大小,请求会无法写入

write_buffer_size:单个memtable的大小,当memtable达到指定大小,会自动转换成immutable memtable并且新创建一个memtable

max_bytes_for_level_base:L1的总大小,L1的大小建议设置成和L0大小一致,提升L0->L1的compaction效率

min_write_buffer_number_to_merge:immutable memtable在flush之前先进行合并,比如参数设置为2,当一个memtable转换成immutable memtable后,RocksDB不会进行flush*作,等到至少有2个后才进行flush*作。这个参数调大能够减少磁盘写的次数,因为多个memtable中可能有重复的key,在flush之前先merge后就避免了旧数据刷盘;但是带来的问题是每次数据查找,当memtable中没有对应数据,RocksDB可能需要遍历所有的immutable memtable,会影响读取性能。

level0_file_num_compaction_trigger:L0达到指定个数的sstable后,触发compaction L0->L1。所以L0稳定状态下大小为write_buffer_size min_write_buffer_number_to_merge level0_file_num_compaction_trigger

statistics:统计系统性能和吞吐信息,开启statistics会增加5%到10%的额外开销

stats_dump_period_sec:统计信息导出日志时间间隔

compression_type:压缩类型

bloom_filter_**ts:使用bloom过滤器来避免不必要的磁盘访问

lru_cache_size:cache大小

max_open_files:大打开文件句柄

skip_stats_update_on_db_open:打开db时,是否跳过stats。建议设为false

二、wirte sall常见情况及解决方法

(1)RocksDB在flush或compaction速度来不及处理新的写入,会启动自我保护机制,延迟写或者禁写。主要有几种情况:

写限速:如果max_write_buffer_number大于3,将要flush的memtables大于等于max_write_buffer_number-1,write会被限速。

禁写:memtable个数大于等于max_write_buffer_number,触发禁写,等到flush完成后允许写入。

写限速:L0文件数量达到level0_slowdown_writes_trigger,触发写限速。

禁写:L0文件数量达到level0_stop_writes_trigger,禁写。

写限速:等待compaction的数据量达到soft_pending_compaction_bytes,触发写限速。

禁写:等待compaction的数据量达到hard_pending_compaction_bytes,触发禁写。

(2)当出现write stall时,可以按具体的系统的状态调整如下参数:

调大max_background_flushes

调大max_write_buffer_number

调大max_background_compactions

调大write_buffer_size

调大min_write_buffer_number_to_merge

三、推荐配置示例

存储介质flash

options.optionspaction_style= kCompactionStyleLevel;

options.write_buffer_size= 67108864;// 64MB

options.max_write_buffer_number= 3;

options.target_file_size_base= 67108864;// 64MB

options.max_background_compactions= 4;

options.level0_file_num_compaction_trigger= 8;

options.level0_slowdown_writes_trigger= 17;

options.level0_stop_writes_trigger= 24;

options.num_levels= 4;

options.max_bytes_for_level_base= 536870912;// 512MB

options.max_bytes_for_level_multiplier= 8;

全内存

options.allow_mmap_reads= true;

BlockBasedTableOptions table_options;

table_options.filter_policy.reset(NewBloomFilterPolicy(10, true));

table_options.no_block_cache= true;

table_options.block_restart_interval= 4;

options.table_factory.reset(NewBlockBasedTableFactory(table_options));

options.level0_file_num_compaction_trigger= 1;

options.max_background_flushes= 8;

options.max_background_compactions= 8;

options.max_subcompactions= 4;

options.max_open_files=-1;

ReadOptions.verify_checksums= false

二、数据库调优是什么

一、概述

随着数据库在各个领域的使用不断增长,越来越多的应用提出了高性能的要求。数据库性能调优是知识密集型的学科,需要综合考虑各种复杂的因素:数据库缓冲区的大小、索引的创建、语句改写等等。总之,数据库性能调优的目的在于使系统运行得更快。

调优需要有广泛的知识,这使得它既简单又复杂。

说调优简单,是因为调优者不必纠缠于复杂的公式和规则。许多学术界和业界的研究者都在尝试将调优和查询处理建立在数学基础之上。

称调优复杂,是因为如果要完全理解常识所依赖的原理,还需要对应用、数据库管理系统、*作系统以及硬件有广泛而深刻的理解。

数据库调优技术可以在不同的数据库系统中使用。如果需要调优数据库系统,好掌握如下知识:1)查询处理、并发控制以及数据库恢复的知识;2)一些调优的基本原则。

这里主要描述索引调优。

二、索引调优

索引是建立在表上的一种数据组织,它能提高访问表中一条或多条记录的特定查询效率。因此,适当的索引调优是很重要的。

对于索引调优存在如下的几个误区:

误区1:索引创建得越多越好?

实际上:创建的索引可能建立后从来未使用。索引的创建也是需要代价的,对于删除、某些更新、插入*作,对于每个索引都要进行相应的删除、更新、插入*作。从而导致删除、某些更新、插入*作的效率变低。

误区2:对于一个单表的查询,可以索引1进行过滤再使用索引2进行过滤?

实际上:假设查询语句如下select* from t1 where c1=1 and c2=2,c1列和c2列上分别建有索引ic1、ic2。先使用ic1(或ic2)进行过滤,产生的结果集是临时数据,不再具有索引,所以不可使用ic2(或ic1)进行再次过滤。

索引优化的基本原则:

1、将索引和数据存放到不同的文件组

没有将表数据和索引数据存储到不同的文件组,而不加区别地将它们存储到同一文件组。这样,不但会造成I/O竞争,也为数据库的维护工作带来不变。

2、组合索引的使用

假设存在组合索引it1c1c2(c1,c2),查询语句select* from t1 where c1=1 and c2=2能够使用该索引。查询语句select* from t1 where c1=1也能够使用该索引。但是,查询语句select* from t1 where c2=2不能够使用该索引,因为没有组合索引的引导列,即,要想使用c2列进行查找,必需出现c1等于某值。

根据where条件的不同,归纳如下:

1) c1=1 and c2=2:使用索引it1c1c2进行等值查找。

2) c1=1 and c2>2:使用索引it1c1c2进行范围查找,可以有两种方法。

方法1,使用通过索引键(1,2)在B树中命中一条记录,然后向后扫描找出第一条符合条件的记录,从此记录往后的每一条记录都是符合条件的。这种方法的弊端在于:如果c1=1 and c2=2对应的记录数很多,会产生很多无效的扫描。

方法2,如果c2对应的int型数据,可以使用索引键(1,3)在B树中命中一条记录,从此记录往后的每一条记录都是符合条件的。

本文中的例子均采用方法1。

3)c1>1 and c2=2:因为索引的第一个列不是等于号的,索引即使后面出现了c2=2,也不能将c2=2应用于索引查找。这里,通过索引键(1,-∞)在B树中命中一条记录,向后扫描找出第一条符合c1>1的记录,此后的每一条记录判断是否符合c2=2,如果符合则输出,否则过滤掉。这里我们称c2=2没有参与到索引运算中去。这种情况在实际应用中经常出现。

4)c1>1:通过索引键(1,-∞)在B树中命中一条记录,以此向后扫描找出第一条符合c1>1的记录,此后的每条记录都是符合条件的。

3、唯一索引与非唯一索引的差异

假设索引int1c1(c1)是唯一索引,对于查询语句select c1 from t1 where c1=1,达梦数据库使用索引键(1)命中B树中一条记录,命中之后直接返回该记录(因为是唯一索引,所以多只能有一条c1=1的记录)。

假设索引it1c2(c2)是非唯一索引,对于查询语句select c2 from t2 where c2=2,达梦数据库使用索引键(2)命中B树中一条记录,返回该记录,并继续向后扫描,如果该记录是满足c=2,返回该记录,继续扫描,直到遇到第一条不符合条件c2=2的记录。

于是,我们可以得知,对于不存在重复值的列,创建唯一索引优于创建非唯一索引。

4、非聚集索引的作用

每张表只可能一个聚集索引,聚集索引用来组织真实数据。语句“create table employee(id int cluster primary key,name varchar(20),addr varchar(20))”。表employee的数据用id来组织。如果要查找id=1000的员工记录,只要用索引键(1000)命中该聚集索引。但是,对于要查找name=’张三’的员工记录就不能使用该索引了,需要进行全表扫描,对于每一条记录判断是否满足name=’张三’,这样会导致查询效率非常低。

要使用聚集索引,必需提供id,我们只能提供name,于是需要引入一个辅助结构实现name到id的转换,这就是非聚集索引的作用。该非聚集索引的键是name,值是id。于是语句“select* from employee where name=’张三’”的执行流程是:通过键(’张三’)命中非聚集索引,得到对应的id值3(假设’张三’对应的id为3),然后用键(3)命中聚集索引,得到相应的记录。

5、是不是使用非聚集索引的查询都需要进行聚集的查询?

不是的,虽然在上一点中查询转换为聚集索引的查找,有时候可以只需要使用非聚集索引。

创建表并创建相应的索引:create table t1(c1 int,c2 int,c3 int);create index it1c2c3 on t1(c2,c3)。查询语句为:select c3 from t1 where c2=1。

因为索引it1c2c3(c2,c3)覆盖查询语句中的列(c2,c3)。所以,该查询语句的执行流程为:通过索引键(1,-∞)命中索引it1c2c3,对于该记录直接返回c3对应的值,继续向后扫描,如果索引记录中c1还是等于1,那么输出c3,以此类推,直到出现第一条c1不等于1的索引记录,结束查询。

6、创建索引的规则

创建索引首先要考虑的是列的可选择性。比较一下列中唯一键的数量和表中记录的行数,就可以判断该列的可选择性。如果该列的“唯一键的数量/表中记录行数”的比值越接近于1,则该列的可选择行越高。在可选择性高的列上进行查询,返回的数据就较少,比较适合索引查询。相反,比如性别列上只有两个值,可选择行就很小,不适合索引查询。

三、Oracle数据库系统调优方法

Oracle数据库广泛应用在社会的各个领域,特别是在Client/Server模式的应用,但是应用开发者往往碰到整个系统的性能随着数据量的增大显着下降的问题,为了解决这个问题,从以下几个方面:数据库服务器、网络I/O、应用程序等对整个系统加以调整,充分发挥Oracle的效能,提高整个系统的性能。

1调整数据库服务器的性能

Oracle数据库服务器是整个系统的核心,它的性能高低直接影响整个系统的性能,为了调整Oracle数据库服务器的性能,主要从以下几个方面考虑:

1.1调整

*作系统以适合Oracle数据库服务器运行

Oracle数据库服务器很大程度上依赖于运行服务器的*作系统,如果*作系统不能提供好性能,那么无论如何调整,Oracle数据库服务器也无法发挥其应有的性能。

1.1.1为Oracle数据库服务器规划系统资源

据已有计算机可用资源,规划分配给Oracle服务器资源原则是:尽可能使Oracle服务器使用资源大化,特别在Client/Server中尽量让服务器上所有资源都来运行Oracle服务。

1.1.2调整计算机系统中的内存配置

多数*作系统都用虚存来模拟计算机上更大的内存,它实际上是硬盘上的一定的磁盘空间。当实际的内存空间不能满足应用软件的要求时,*作系统就将用这部分的磁盘空间对内存中的信息进行页面替换,这将引起大量的磁盘I/O*作,使整个服务器的性能下降。为了避免过多地使用虚存,应加大计算机的内存。

1.1.3为Oracle数据库服务器设置*作系统进程优先级

不要在*作系统中调整Oracle进程的优先级,因为在Oracle数据库系统中,所有的后台和前台数据库服务器进程执行的是同等重要的工作,需要同等的优先级。所以在安装时,让所有的数据库服务器进程都使用缺省的优先级运行。

1.2调整内存分配

Oracle数据库服务器保留3个基本的内存高速缓存,分别对应3种不同类型的数据:库高速缓存,字典高速缓存和缓冲区高速缓存。库高速缓存和字典高速缓存一起构成共享池,共享池再加上缓冲区高速缓存便构成了系统全程区(SGA)。SGA是对数据库数据进行快速访问的一个系统全程区,若SGA本身需要频繁地进行释放、分配,则不能达到快速访问数据的目的,因此应把SGA放在主存中,不要放在虚拟内存中。内存的调整主要是指调整组成SGA的内存结构的大小来提高系统性能,由于Oracle数据库服务器的内存结构需求与应用密切相关,所以内存结构的调整应在磁盘I/O调整之前进行。

1.2.1库缓冲区的调整

库缓冲区中包含私用和共享SQL和PL/SQL区,通过比较库缓冲区的命中率决定它的大小。要调整库缓冲区,必须首先了解该库缓冲区的活动情况,库缓冲区的活动统计信息保留在动态性能表v$librarycache数据字典中,可通过查询该表来了解其活动情况,以决定如何调整。

1.2.2数据字典缓冲区的调整

数据字典缓冲区包含了有关数据库的结构、用户、实体信息。数据字典的命中率,对系统性能影响极大。数据字典缓冲区的使用情况记录在动态性能表v$librarycache中,可通过查询该表来了解其活动情况,以决定如何调整。

1.2.3缓冲区高速缓存的调整

用户进程所存取的所有数据都是经过缓冲区高速缓存来存取,所以该部分的命中率,对性能至关重要。缓冲区高速缓存的使用情况记录在动态性能表v$sysstat中,可通过查询该表来了解其活动情况,以决定如何调整。

2调整 Client/Server模式下的网络 I/O

Client/Server环境中的应用处理是分布在客户应用程序和数据库服务程序之间的。在 Client/Server环境中Client与Server之间的网络I/O是整个系统性能提高的瓶颈,一个客户应用程序引起的网络I/O越少,应用及整个系统的性能越好。减少网络I/O的重要的一条原则:将应用逻辑集中在数据库服务器中。

2.1使用Oracle数据库的完整约束性

当为应用建表时,应当为一些有特殊要求的数据加上适当的完整性约束,这样就能实现由数据库本身而不是应用程序来约束数据符合一定的条件。数据库服务器端的完整约束的执行*作是在比SQL语句级别更低的系统机制上优化,它与客户端无关,只在服务器中运行,不需在Client端和Server端之间传递SQL语句,有效地减轻网络I/O负担。

2.2使用数据库触发器

完整约束性只能实现一些较简单的数据约束条件,对一些较复杂的事物处理规则就无能为力,这时好不要在应用程序中实施复杂的程序控制,而是应当采用数据库触发器来实施复杂的事物规则。数据库触发器能实现由数据库本身,而不是应用程序,来约束数据符合复杂的事物处理规则,并且容易创建,便于管理,避免大量的网络I/O。

2.3使用存储过程、存储函数和包

Oracle的存储过程和存储函数是命名的能完成一定功能并且存储在Server端的PL/SQL的**。包是一种把有关的过程和函数组织封装成一个数据库程序单元的方法。它们相对于应用程序的过程、函数而言,把SQL命令存储在Server端。使用存储过程和存储函数,应用程序不必再包含多个网络*作的SQL语句去执行数据库服务器*作,而是简单调用存储过程和存储函数,在网络上传输的只是调用过程的名字和输出结果,这样就可减少大量的网络I/O。

3应用程序的调整

3.1 SQL语句的优化

SQL语句的执行速度,可以受很多因素的影响而变化。但主要的影响因素是:驱动表、执行*作的先后顺序和索引的运用。可以由很多不同的方法间接地改变这些因素,以达到优的执行速度。这里主要探讨当对多个表进行连接查询时应遵循的优化原则:

3.2建立和使用视图、索引

利用视图可以将基表中的列或行进行裁减、隐藏一部分数据,并且能够将涉及到多个表的复杂查询以视图的方式给出,使应用程序开发简洁快速。利用索引可以提高查询性能,减少磁盘 I/O,优化对数据表的查询,加速SQL语句的执行。但任何时候建立索引都能提高性能,何时建立索引应当遵循以下原则:该表常用来在索引列上查询,该表不常更新、插入、删除等*作,查询出来的结果记录数应控制在原表的2%~4%。

3.3使用 Oracle的数组接口

当一个客户应用程序插入一行或用一个查询来向服务器请求某行时,不是发送具有单个行的网络包,而是采用数组处理,即把要插入的多个行或检索出的多个行缓冲在数组中,然后通过很少的几个包就可在网上传送这些数组。例如,一个给定的Select语句返回2000行数据,每行平均大小为40个字节,数据包的大小为4kB,而数组大小参数(arraysize)设置为20,则需从服务器发送100个数据包到客户机。如果简单地把(arraysize)设置为2000,那么同样的*作只需要传送 20个数据包。这样就减少了网络的传输量,提高了所有应用的性能。

4总结

我们在开发应用程序时,遵循上述的方法和原则,对系统进行调整,收到了令人满意的效果。但是应当指出,由于客户机、网络、服务器这3个相互依存的组成部分都必须调整和同步才能产生佳的性能,因此还应根据系统的具体情况,具体分析和调整。

相关文章

Vidda海信43V1G-J电视43英寸高清全面屏8G智能网络wifi液晶平板电视机EA43S好不好用

Vidda海信43V1G-J电视43英寸高清全面屏8G智能网络wifi液晶平板电视机EA43S好不好用

很多小伙伴在关注Vidda海信43V1G-J电视43英寸高清全面屏8G智能网络wifi液晶平板电视机EA43S怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分...

海信(Hisense)65英寸EK65测评怎么样

海信(Hisense)65英寸EK65测评怎么样

很多小伙伴在关注海信(Hisense)65英寸EK65怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来...

长虹65A6UPRO怎么样?质量测评好不好用?

长虹65A6UPRO怎么样?质量测评好不好用?

很多小伙伴在关注长虹65A6UPRO怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...

爱百分英语点读笔万能通用扫描笔小学初中高中生课本同步幼儿童启蒙绘本书阅读翻译词典全科扫读笔学习机使用感受如何

爱百分英语点读笔万能通用扫描笔小学初中高中生课本同步幼儿童启蒙绘本书阅读翻译词典全科扫读笔学习机使用感受如何

很多小伙伴在关注爱百分英语点读笔万能通用扫描笔小学初中高中生课本同步幼儿童启蒙绘本书阅读翻译词典全科扫读笔学习机怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用...

适马(SIGMA)Art85mm质量测评好不好

适马(SIGMA)Art85mm质量测评好不好

很多小伙伴在关注适马(SIGMA)Art85mm怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧...

小米智能摄像机3质量好不好

小米智能摄像机3质量好不好

很多小伙伴在关注小米智能摄像机3怎么样?质量好不好?使用测评如何?本文综合已购用户的客观使用分享和相应的优惠信息,为大家推荐一款高性价比的产品,一起来看看吧。...