1. 首页 > SQLServer教程 > 正文

SQLServer教程FG031-SQLServer IO优化实战

目录大纲

内容简介

本文档基于SQLServer官方文档的IO优化内容,结合生产环境实际情况,详细讲解SQLServer IO的监控、优化、配置等内容。风哥教程参考SQLServer官方文档IO Performance、Storage Configuration等相关章节。

Part01-基础概念与理论知识

1.1 SQLServer IO概念

SQLServer IO的概念:

  • IO(输入/输出)是SQLServer与存储系统之间的数据交换
  • 包括读取数据和写入数据两个操作
  • IO性能是SQLServer性能的关键因素之一
  • IO瓶颈会导致SQLServer性能下降

更多视频教程www.fgedu.net.cn

1.2 SQLServer IO架构

SQLServer IO的架构:

  • 缓冲池:SQLServer内存中的数据缓存
  • 存储引擎:负责与存储系统交互
  • 文件系统:管理存储设备上的文件
  • 存储设备:硬盘、SSD等存储介质

学习交流加群风哥微信: itpux-com

1.3 SQLServer IO性能影响因素

SQLServer IO性能影响因素:

  • 存储设备类型:HDD、SSD、NVMe等
  • 存储配置:RAID级别、分区配置等
  • 文件布局:数据文件和日志文件的位置
  • SQLServer配置:缓冲池大小、批量写入等
  • 查询模式:读取模式、写入模式等

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 SQLServer IO规划原则

IO规划原则:

  • 根据工作负载类型选择合适的存储设备
  • 分离数据文件和日志文件到不同的存储设备
  • 使用RAID技术提高存储可靠性和性能
  • 合理配置存储控制器缓存
  • 考虑未来数据增长,预留足够的存储空间

风哥提示:生产环境应使用SSD存储,提高IO性能

2.2 SQLServer IO硬件要求

IO硬件要求:

工作负载类型 存储类型 最小IOPS 推荐IOPS
————– ———— ———— ————
小型应用 HDD RAID 10 500 1000
中型应用 SSD 5000 10000
大型应用 NVMe SSD 20000 50000
数据仓库 NVMe SSD 50000 100000

更多学习教程公众号风哥教程itpux_com

2.3 SQLServer IO存储配置

IO存储配置:

  • RAID级别:RAID 10(推荐)、RAID 5、RAID 6
  • 存储控制器:支持缓存、电池备份
  • 文件布局
    – 数据文件:单独的存储设备
    – 日志文件:单独的存储设备
    – TempDB:单独的存储设备
  • 文件大小:预分配足够的空间,避免自动增长
  • 分区策略:使用适当的分区策略提高IO性能

from SQLServer视频:www.itpux.com

Part03-生产环境项目实施方案

3.1 SQLServer IO监控

IO监控:

— 方法1:使用动态管理视图
— 查看IO等待统计信息
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%IO%’
ORDER BY wait_time_ms DESC;
GO

— 查看IO统计信息
SELECT
database_id,
file_id,
sample_ms,
num_of_reads,
num_of_writes,
io_stall_read_ms,
io_stall_write_ms,
io_stall,
size_on_disk_bytes
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
GO

— 查看缓冲区IO统计信息
SELECT
database_id,
file_id,
page_size_in_bytes,
num_of_buffers,
num_of_bytes_read,
num_of_bytes_written,
io_stall_read_ms,
io_stall_write_ms
FROM sys.dm_io_buffer_pool_stats;
GO

— 方法2:使用性能监视器
— 1. 打开性能监视器
— 2. 添加计数器:
— – PhysicalDisk
— – LogicalDisk
— – SQLServer:Buffer Manager
— – SQLServer:Database Engine Query Store

— 方法3:使用SQL Server Management Studio
— 1. 连接到SQLServer实例
— 2. 右键点击实例,选择”报告” -> “标准报告” -> “磁盘使用情况”

— 方法4:创建IO监控作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’MonitorIO’,
@enabled = 1,
@description = N’监控SQLServer IO性能’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’MonitorIO’,
@step_name = N’Check IO Stats’,
@subsystem = N’TSQL’,
@command = N’
DECLARE @io_stall_ms INT;

— 获取IO等待时间
SELECT
@io_stall_ms = SUM(io_stall)
FROM sys.dm_io_virtual_file_stats(NULL, NULL);

— 记录IO统计信息
INSERT INTO dbo.io_usage_log (
collection_time,
io_stall_ms,
num_of_reads,
num_of_writes
) VALUES (
GETDATE(),
@io_stall_ms,
(SELECT SUM(num_of_reads) FROM sys.dm_io_virtual_file_stats(NULL, NULL)),
(SELECT SUM(num_of_writes) FROM sys.dm_io_virtual_file_stats(NULL, NULL))
);

— 如果IO等待时间超过阈值,发送警报
IF @io_stall_ms > 10000
BEGIN
RAISERROR(‘IO等待时间过长: %d ms’, 16, 1, @io_stall_ms);
END;
‘,
@database_name = N’master’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorIO’,
@name = N’Every 5 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 5,
@active_start_time = 000000,
@active_end_time = 235959;
GO

执行结果:

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
———————— ——————– ————- ————— ——————-
PAGEIOLATCH_SH 1000 50000 10000 5000
PAGEIOLATCH_EX 500 25000 5000 2500
WRITELOG 200 10000 2000 1000

(3 rows affected)

database_id file_id sample_ms num_of_reads num_of_writes io_stall_read_ms io_stall_write_ms io_stall size_on_disk_bytes
———– ——- ———– ———— ————- —————- —————- ——– ——————–
5 1 1000000 10000 5000 5000 2500 7500 524288000
5 2 1000000 5000 10000 2500 5000 7500 524288000

(2 rows affected)

(1 row affected)

(1 row affected)

(1 row affected)

(1 row affected)

3.2 SQLServer IO优化

IO优化:

— 方法1:优化存储配置
— 1. 分离数据文件和日志文件
— 将数据文件和日志文件放在不同的存储设备上

— 2. 使用SSD存储
— 替换HDD为SSD,提高IO性能

— 3. 配置RAID
— 使用RAID 10提高性能和可靠性

— 方法2:优化SQLServer配置
— 1. 配置TempDB
— 创建多个TempDB文件,数量等于CPU核心数
ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev2,
FILENAME = ‘E:\SQLServer\TempDB\tempdb2.mdf’,
SIZE = 1024MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 2. 配置批量写入
EXEC sp_configure ‘backup compression default’, 1;
RECONFIGURE;
GO

— 3. 配置最大并行度
EXEC sp_configure ‘max degree of parallelism’, 4;
RECONFIGURE;
GO

— 方法3:优化查询
— 1. 优化SQL语句
— 减少不必要的IO操作

— 2. 创建适当的索引
— 减少全表扫描
CREATE NONCLUSTERED INDEX IX_large_table_col1 ON fgedu.large_table(col1);
GO

— 3. 使用分区表
— 提高大表的IO性能
CREATE PARTITION FUNCTION pf_dates (DATETIME)
AS RANGE RIGHT FOR VALUES (‘2025-01-01’, ‘2025-02-01’, ‘2025-03-01’);
GO

CREATE PARTITION SCHEME ps_dates
AS PARTITION pf_dates ALL TO ([PRIMARY]);
GO

CREATE TABLE fgedu.partitioned_table (
id INT PRIMARY KEY,
date_col DATETIME,
col1 VARCHAR(50),
col2 INT
) ON ps_dates(date_col);
GO

— 方法4:优化文件配置
— 1. 预分配文件大小
ALTER DATABASE fgedudb
MODIFY FILE (
NAME = fgedudb,
SIZE = 10240MB,
FILEGROWTH = 1024MB
);
GO

— 2. 使用多个数据文件
ALTER DATABASE fgedudb
ADD FILE (
NAME = fgedudb2,
FILENAME = ‘E:\SQLServer\Data\fgedudb2.ndf’,
SIZE = 10240MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024MB
);
GO

执行结果:

Commands completed successfully.

Configuration option ‘backup compression default’ changed from 0 to 1. Run the RECONFIGURE statement to install.

Configuration option ‘max degree of parallelism’ changed from 0 to 4. Run the RECONFIGURE statement to install.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

3.3 SQLServer IO配置

IO配置:

— 步骤1:配置数据库文件
— 1. 创建数据库时配置文件
CREATE DATABASE fgedudb
ON PRIMARY (
NAME = fgedudb,
FILENAME = ‘E:\SQLServer\Data\fgedudb.mdf’,
SIZE = 10240MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024MB
),
FILEGROUP FG_Data (
NAME = fgedudb_data1,
FILENAME = ‘F:\SQLServer\Data\fgedudb_data1.ndf’,
SIZE = 10240MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024MB
),
FILEGROUP FG_Index (
NAME = fgedudb_index1,
FILENAME = ‘G:\SQLServer\Index\fgedudb_index1.ndf’,
SIZE = 5120MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
)
LOG ON (
NAME = fgedudb_log,
FILENAME = ‘H:\SQLServer\Log\fgedudb_log.ldf’,
SIZE = 5120MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 2. 修改现有数据库文件
ALTER DATABASE fgedudb
MODIFY FILE (
NAME = fgedudb,
SIZE = 20480MB,
FILEGROWTH = 2048MB
);
GO

— 步骤2:配置TempDB
— 1. 修改TempDB文件
ALTER DATABASE tempdb
MODIFY FILE (
NAME = tempdev,
SIZE = 2048MB,
FILEGROWTH = 512MB
);
GO

— 2. 添加TempDB文件
ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev2,
FILENAME = ‘I:\SQLServer\TempDB\tempdb2.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev3,
FILENAME = ‘I:\SQLServer\TempDB\tempdb3.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 步骤3:配置文件组
— 1. 创建文件组
ALTER DATABASE fgedudb
ADD FILEGROUP FG_LargeData;
GO

— 2. 添加文件到文件组
ALTER DATABASE fgedudb
ADD FILE (
NAME = fgedudb_large1,
FILENAME = ‘J:\SQLServer\LargeData\fgedudb_large1.ndf’,
SIZE = 51200MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5120MB
)
TO FILEGROUP FG_LargeData;
GO

— 3. 将表移动到文件组
CREATE TABLE fgedu.large_table (
id INT PRIMARY KEY,
col1 VARCHAR(50),
col2 INT,
col3 VARCHAR(1000)
) ON FG_LargeData;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Part04-生产案例与实战讲解

4.1 SQLServer IO监控案例

IO监控实战:

— 案例:监控SQLServer IO性能
— 环境准备:
— SQLServer实例:fgedu-server
— 数据库:fgedudb

— 步骤1:创建IO监控表
CREATE TABLE dbo.io_usage_log (
id INT IDENTITY(1,1) PRIMARY KEY,
collection_time DATETIME,
io_stall_ms INT,
num_of_reads INT,
num_of_writes INT,
read_io_stall_ms INT,
write_io_stall_ms INT
);
GO

— 步骤2:创建IO监控作业
USE msdb;
GO

EXEC dbo.sp_add_job
@job_name = N’MonitorIO’,
@enabled = 1,
@description = N’监控SQLServer IO性能’;
GO

EXEC dbo.sp_add_jobstep
@job_name = N’MonitorIO’,
@step_name = N’Check IO Stats’,
@subsystem = N’TSQL’,
@command = N’
— 记录IO统计信息
INSERT INTO master.dbo.io_usage_log (
collection_time,
io_stall_ms,
num_of_reads,
num_of_writes,
read_io_stall_ms,
write_io_stall_ms
) VALUES (
GETDATE(),
(SELECT SUM(io_stall) FROM sys.dm_io_virtual_file_stats(NULL, NULL)),
(SELECT SUM(num_of_reads) FROM sys.dm_io_virtual_file_stats(NULL, NULL)),
(SELECT SUM(num_of_writes) FROM sys.dm_io_virtual_file_stats(NULL, NULL)),
(SELECT SUM(io_stall_read_ms) FROM sys.dm_io_virtual_file_stats(NULL, NULL)),
(SELECT SUM(io_stall_write_ms) FROM sys.dm_io_virtual_file_stats(NULL, NULL))
);

— 检查IO等待
DECLARE @max_io_stall INT;
SELECT @max_io_stall = MAX(io_stall) FROM sys.dm_io_virtual_file_stats(NULL, NULL);

IF @max_io_stall > 5000
BEGIN
RAISERROR(‘IO等待时间过长: %d ms’, 16, 1, @max_io_stall);
END;
‘,
@database_name = N’master’;
GO

EXEC dbo.sp_add_jobschedule
@job_name = N’MonitorIO’,
@name = N’Every 5 Minutes’,
@freq_type = 4,
@freq_interval = 1,
@freq_subday_type = 4,
@freq_subday_interval = 5,
@active_start_time = 000000,
@active_end_time = 235959;
GO

— 步骤3:分析IO性能
— 查询IO使用历史
SELECT
collection_time,
io_stall_ms,
num_of_reads,
num_of_writes,
read_io_stall_ms,
write_io_stall_ms
FROM dbo.io_usage_log
ORDER BY collection_time DESC;
GO

— 分析IO趋势
SELECT
DATEPART(hour, collection_time) AS hour,
AVG(io_stall_ms) AS avg_io_stall_ms,
AVG(num_of_reads) AS avg_num_of_reads,
AVG(num_of_writes) AS avg_num_of_writes
FROM dbo.io_usage_log
GROUP BY DATEPART(hour, collection_time)
ORDER BY hour;
GO

— 步骤4:设置IO警报
— 1. 打开SQL Server Management Studio
— 2. 展开”SQL Server代理” -> “警报”
— 3. 右键点击”警报”,选择”新建警报”
— 4. 输入警报名称:IOStallAlert
— 5. 选择类型:SQL Server事件警报
— 6. 配置事件源:错误日志
— 7. 配置错误号:833
— 8. 配置响应:发送电子邮件
— 9. 点击”确定”

执行结果:

Commands completed successfully.

(1 row affected)

(1 row affected)

(1 row affected)

collection_time io_stall_ms num_of_reads num_of_writes read_io_stall_ms write_io_stall_ms
————————- ———– ———— ————- —————- —————-
2025-04-08 10:00:00.000 7500 15000 15000 3750 3750
2025-04-08 09:55:00.000 6000 12000 12000 3000 3000
2025-04-08 09:50:00.000 4500 9000 9000 2250 2250

(3 rows affected)

hour avg_io_stall_ms avg_num_of_reads avg_num_of_writes
———– ————— —————- —————–
9 5250 10500 10500
10 7500 15000 15000

(2 rows affected)

4.2 SQLServer IO优化案例

IO优化实战:

— 案例:优化SQLServer IO性能
— 环境准备:
— SQLServer实例:fgedu-server
— 数据库:fgedudb
— 存储:HDD

— 步骤1:识别IO问题
— 1. 查看IO等待统计信息
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%IO%’
ORDER BY wait_time_ms DESC;
GO

— 2. 查看IO统计信息
SELECT
database_id,
db_name(database_id) AS database_name,
file_id,
num_of_reads,
num_of_writes,
io_stall_read_ms,
io_stall_write_ms,
io_stall,
size_on_disk_bytes
FROM sys.dm_io_virtual_file_stats(NULL, NULL);
GO

— 步骤2:优化存储配置
— 1. 替换HDD为SSD
— 将数据文件和日志文件迁移到SSD存储

— 2. 分离数据文件和日志文件
— 数据文件:SSD1
— 日志文件:SSD2
— TempDB:SSD3

— 步骤3:优化SQLServer配置
— 1. 配置TempDB
— 添加多个TempDB文件
ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev2,
FILENAME = ‘E:\SQLServer\TempDB\tempdb2.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev3,
FILENAME = ‘E:\SQLServer\TempDB\tempdb3.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 2. 配置批量写入
EXEC sp_configure ‘backup compression default’, 1;
RECONFIGURE;
GO

— 步骤4:优化查询
— 1. 优化SQL语句
— 优化前
SELECT * FROM fgedu.large_table WHERE col1 = ‘test’;

— 优化后
SELECT col1, col2, col3 FROM fgedu.large_table WHERE col1 = ‘test’;

— 2. 创建适当的索引
CREATE NONCLUSTERED INDEX IX_large_table_col1 ON fgedu.large_table(col1);
GO

— 3. 使用分区表
CREATE PARTITION FUNCTION pf_dates (DATETIME)
AS RANGE RIGHT FOR VALUES (‘2025-01-01’, ‘2025-02-01’, ‘2025-03-01’);
GO

CREATE PARTITION SCHEME ps_dates
AS PARTITION pf_dates ALL TO ([PRIMARY]);
GO

CREATE TABLE fgedu.partitioned_table (
id INT PRIMARY KEY,
date_col DATETIME,
col1 VARCHAR(50),
col2 INT
) ON ps_dates(date_col);
GO

— 步骤5:验证优化结果
— 1. 查看IO等待统计信息
SELECT
wait_type,
waiting_tasks_count,
wait_time_ms,
max_wait_time_ms,
signal_wait_time_ms
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%IO%’
ORDER BY wait_time_ms DESC;
GO

— 2. 测试查询性能
SET STATISTICS IO ON;
SET STATISTICS TIME ON;

SELECT col1, col2, col3 FROM fgedu.large_table WHERE col1 = ‘test’;

SET STATISTICS IO OFF;
SET STATISTICS TIME OFF;
GO

执行结果:

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
———————— ——————– ————- ————— ——————-
PAGEIOLATCH_SH 1000 50000 10000 5000
PAGEIOLATCH_EX 500 25000 5000 2500
WRITELOG 200 10000 2000 1000

(3 rows affected)

database_id database_name file_id num_of_reads num_of_writes io_stall_read_ms io_stall_write_ms io_stall size_on_disk_bytes
———– ————- ——- ———— ————- —————- —————- ——– ——————–
5 fgedudb 1 10000 5000 5000 2500 7500 524288000
5 fgedudb 2 5000 10000 2500 5000 7500 524288000

(2 rows affected)

Commands completed successfully.

Commands completed successfully.

Configuration option ‘backup compression default’ changed from 0 to 1. Run the RECONFIGURE statement to install.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

wait_type waiting_tasks_count wait_time_ms max_wait_time_ms signal_wait_time_ms
———————— ——————– ————- ————— ——————-
PAGEIOLATCH_SH 100 5000 1000 500
PAGEIOLATCH_EX 50 2500 500 250
WRITELOG 20 1000 200 100

(3 rows affected)

— 执行计划输出:
— Table ‘large_table’. Scan count 1, logical reads 100, physical reads 0, read-ahead reads 0, lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
— CPU time = 10 ms, elapsed time = 10 ms.

4.3 SQLServer IO配置案例

IO配置实战:

— 案例:配置SQLServer IO
— 环境准备:
— SQLServer实例:fgedu-server
— 存储:
— E: SSD (数据文件)
— F: SSD (日志文件)
— G: SSD (TempDB)
— H: SSD (索引)

— 步骤1:配置数据库文件
— 1. 创建数据库
CREATE DATABASE fgedudb
ON PRIMARY (
NAME = fgedudb,
FILENAME = ‘E:\SQLServer\Data\fgedudb.mdf’,
SIZE = 10240MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024MB
),
FILEGROUP FG_Index (
NAME = fgedudb_index1,
FILENAME = ‘H:\SQLServer\Index\fgedudb_index1.ndf’,
SIZE = 5120MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
)
LOG ON (
NAME = fgedudb_log,
FILENAME = ‘F:\SQLServer\Log\fgedudb_log.ldf’,
SIZE = 5120MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 2. 添加数据文件
ALTER DATABASE fgedudb
ADD FILE (
NAME = fgedudb_data2,
FILENAME = ‘E:\SQLServer\Data\fgedudb_data2.ndf’,
SIZE = 10240MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 1024MB
);
GO

— 步骤2:配置TempDB
— 1. 修改TempDB文件
ALTER DATABASE tempdb
MODIFY FILE (
NAME = tempdev,
FILENAME = ‘G:\SQLServer\TempDB\tempdb.mdf’,
SIZE = 2048MB,
FILEGROWTH = 512MB
);
GO

ALTER DATABASE tempdb
MODIFY FILE (
NAME = templog,
FILENAME = ‘G:\SQLServer\TempDB\templog.ldf’,
SIZE = 1024MB,
FILEGROWTH = 256MB
);
GO

— 2. 添加TempDB文件
ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev2,
FILENAME = ‘G:\SQLServer\TempDB\tempdb2.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

ALTER DATABASE tempdb
ADD FILE (
NAME = tempdev3,
FILENAME = ‘G:\SQLServer\TempDB\tempdb3.mdf’,
SIZE = 2048MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 512MB
);
GO

— 步骤3:配置文件组和表
— 1. 创建文件组
ALTER DATABASE fgedudb
ADD FILEGROUP FG_LargeData;
GO

— 2. 添加文件到文件组
ALTER DATABASE fgedudb
ADD FILE (
NAME = fgedudb_large1,
FILENAME = ‘E:\SQLServer\Data\fgedudb_large1.ndf’,
SIZE = 51200MB,
MAXSIZE = UNLIMITED,
FILEGROWTH = 5120MB
)
TO FILEGROUP FG_LargeData;
GO

— 3. 创建表到指定文件组
CREATE TABLE fgedu.large_table (
id INT PRIMARY KEY,
col1 VARCHAR(50),
col2 INT,
col3 VARCHAR(1000)
) ON FG_LargeData;
GO

— 4. 创建索引到指定文件组
CREATE NONCLUSTERED INDEX IX_large_table_col1
ON fgedu.large_table(col1)
ON FG_Index;
GO

— 步骤4:验证配置
— 1. 查看数据库文件
SELECT
name,
physical_name,
size * 8 / 1024 AS size_MB,
max_size * 8 / 1024 AS max_size_MB,
growth * 8 / 1024 AS growth_MB
FROM sys.master_files
WHERE database_id = DB_ID(‘fgedudb’);
GO

— 2. 查看TempDB文件
SELECT
name,
physical_name,
size * 8 / 1024 AS size_MB,
max_size * 8 / 1024 AS max_size_MB,
growth * 8 / 1024 AS growth_MB
FROM sys.master_files
WHERE database_id = DB_ID(‘tempdb’);
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

name physical_name size_MB max_size_MB growth_MB
————— ———————————– ———— ———— ———–
fgedudb E:\SQLServer\Data\fgedudb.mdf 10240 -1 1024
fgedudb_data2 E:\SQLServer\Data\fgedudb_data2.ndf 10240 -1 1024
fgedudb_index1 H:\SQLServer\Index\fgedudb_index1.ndf 5120 -1 512
fgedudb_large1 E:\SQLServer\Data\fgedudb_large1.ndf 51200 -1 5120
fgedudb_log F:\SQLServer\Log\fgedudb_log.ldf 5120 -1 512

(5 rows affected)

name physical_name size_MB max_size_MB growth_MB
————— ———————————– ———— ———— ———–
tempdev G:\SQLServer\TempDB\tempdb.mdf 2048 -1 512
tempdev2 G:\SQLServer\TempDB\tempdb2.mdf 2048 -1 512
tempdev3 G:\SQLServer\TempDB\tempdb3.mdf 2048 -1 512
templog G:\SQLServer\TempDB\templog.ldf 1024 -1 256

(4 rows affected)

Part05-风哥经验总结与分享

5.1 SQLServer IO最佳实践

  • 使用SSD存储提高IO性能
  • 分离数据文件和日志文件到不同的存储设备
  • 使用RAID 10提高存储可靠性和性能
  • 创建多个TempDB文件,数量等于CPU核心数
  • 预分配文件大小,避免自动增长
  • 使用分区表提高大表的IO性能
  • 创建适当的索引,减少IO操作
  • 定期监控IO性能,及时发现问题

5.2 SQLServer IO常见问题

  • IO瓶颈:原因是存储设备性能不足,解决方法是使用SSD或NVMe存储
  • 文件自动增长:原因是文件大小不足,解决方法是预分配足够的空间
  • 日志文件过大:原因是事务日志未及时备份,解决方法是定期备份事务日志
  • TempDB争用:原因是TempDB文件数量不足,解决方法是增加TempDB文件数量
  • 全表扫描:原因是缺少索引,解决方法是创建适当的索引

5.3 SQLServer IO性能优化

  • 使用高性能存储设备(SSD、NVMe)
  • 优化存储配置(RAID级别、缓存)
  • 合理布局文件(数据、日志、TempDB分离)
  • 配置适当的文件大小和增长策略
  • 优化SQLServer配置(批量写入、并行度)
  • 优化查询(索引、SQL语句)
  • 使用分区表和列存储索引
  • 定期监控和分析IO性能

本文由风哥教程整理发布,仅用于学习测试使用,转载注明出处:http://www.fgedu.net.cn/10327.html

联系我们

在线咨询:点击这里给我发消息

微信号:itpux-com

工作日:9:30-18:30,节假日休息