当修改数据时,事务会被记录到日志文件中,事务日志的写入速度,直接影响了数据更新查询语句的执行效率。当数据库中存在大量的修改操作时,应该把日志文件存储到IO性能最优的硬盘上,以减少日志文件写入的时间延迟。
4,tempdb数据库文件
tempdb是数据库实例中最繁忙的数据库了,在查询语句执行的过程中,查询语句创建的各种临时表,系统创建的中间表都位于tempdb中,tempdb的数据文件和日志文件的读写性能,直接影响了查询语句的执行时间,应该把tempdb数据库的数据文件部分到不同的物理硬盘中,并且把tempdb的日志文件存放到IO性能最优的硬盘上去。
简而言之,对于数据库系统的优化配置是:
在OLTP系统中,合理的配置是把数据文件,日志文件和tempdb的文件分别存放到不同的物理硬盘上,从而分摊硬盘的IO争用。
在OLAP系统中,事务运行时间长,规模大,数据相对静态,每次返回的数据量较大,对IO吞吐量的要求较高,因此,尽可能分摊硬盘的IO争用。
5,创建合适的索引
如果一个查询需要进行表扫描,一般是因为缺失合适的索引或索引统计信息过时,过多的扫描操作会引起内存不足,使得缓存中的数据或执行计划被清除(或者被转移到硬盘),然后从硬盘加载数据到内存。理想情况下,常用的数据应该尽可能久地驻留在内存中,避免不必要的内存活动。
创建合适的索引,并保证统计信息及时更新,能够避免不必要的表扫描,只加载小的数据集,能够减少IO操作的次数,优化IO性能。
6,数据压缩
数据压缩会使得相同的存储空间能够存储更多的数据量,一次IO操作能够加载更多的数据,这也能减少IO操作的次数,优化IO性能。
五,IO统计IO请求的等待和挂起,数据库引擎记录对数据文件和日志文件的IO操作,缓存到函数:sys.dm_io_virtual_file_stats,对于数据文件,数据的物理读操作更为重要;对于日志文件,数据的读写操作都重要:
io_stall_read_ms:等待读操作的时间
io_stall_write_ms:等待写操作的时间
如果硬盘繁忙,数据库引擎发送的IO请求,可能会被IO子系统挂起(pending),数据库引擎把pending的IO请求缓存到视图:sys.dm_io_pending_io_requests,
io_pending:指定是否有IO请求挂起或完成
1,查看数据库文件的IO和等待IO完成的时间
select db_name(vfs.database_id) as db_name, --vfs.file_id, mf.name as file_name, mf.type_desc as file_type, vfs.sample_ms/1000/60/60 as sample_h, vfs.io_stall_read_ms/vfs.num_of_reads as avg_stall_read_ms, vfs.io_stall_write_ms/vfs.num_of_writes as avg_stall_write_ms, vfs.num_of_reads as physical_reads, vfs.num_of_bytes_read/vfs.num_of_reads/1024 as avg_read_kb, vfs.num_of_writes as physical_writes, vfs.num_of_bytes_written/vfs.num_of_writes/1024 as avg_written_kb, cast(vfs.size_on_disk_bytes/1024/1024/1024.0 as decimal(10,2)) as disk_size_gb, --cast(mf.size/1024*8/1024.0 as decimal(10,2)) as file_size_gb, vfs.file_handle from sys.master_files mf cross apply sys.dm_io_virtual_file_stats(mf.database_id,mf.file_id) as vfs where mf.database_id=db_id() --current db order by avg_stall_read_ms desc ,avg_stall_write_ms desc