1. 首页 > SQLServer教程 > 正文

SQLServer教程FG042-SQLServer统计信息管理与优化

目录大纲

内容简介

本文档基于SQLServer官方文档的统计信息相关内容,结合生产环境实际情况,详细讲解SQLServer统计信息的概念、类型、作用、创建与管理、更新与维护、性能调优等内容。风哥教程参考SQLServer官方文档Statistics、Query Optimization等相关章节。

Part01-基础概念与理论知识

1.1 统计信息概念

统计信息概念:

  • 统计信息是SQLServer查询优化器用于估计查询结果集大小的元数据
  • 统计信息包含数据分布情况、直方图、密度等信息
  • 查询优化器使用统计信息生成最优的执行计划
  • 统计信息的准确性直接影响查询性能

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

1.2 统计信息类型

统计信息类型:

  • 自动创建的统计信息:SQLServer自动为索引列和查询中使用的列创建
  • 手动创建的统计信息:用户手动创建的统计信息
  • 索引统计信息:与索引相关联的统计信息
  • 列统计信息:针对单个列或多列组合的统计信息

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

1.3 统计信息作用

统计信息作用:

  • 帮助查询优化器估计查询结果集的大小
  • 指导查询优化器选择合适的执行计划
  • 影响索引的使用和连接顺序
  • 影响查询的性能和资源消耗

学习交流加群风哥QQ113257174

Part02-生产环境规划与建议

2.1 统计信息配置原则

统计信息配置原则:

  • 启用自动创建和自动更新统计信息
  • 对于大型表,考虑使用增量统计信息
  • 对于频繁变更的表,调整统计信息更新阈值
  • 对于复杂查询,考虑创建多列统计信息
  • 定期检查和维护统计信息

风哥提示:统计信息配置应根据表的大小、数据变更频率和查询模式进行调整

2.2 统计信息更新策略

统计信息更新策略:

  • 自动更新:SQLServer根据数据变更情况自动更新
  • 手动更新:使用UPDATE STATISTICS命令手动更新
  • 定期更新:通过作业定期更新统计信息
  • 增量更新:对于大型表,使用增量统计信息减少更新时间

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

2.3 统计信息存储策略

统计信息存储策略:

  • 统计信息存储在系统表中
  • 对于大型表,考虑使用压缩存储
  • 定期清理过期的统计信息
  • 监控统计信息的大小和增长情况

from SQLServer视频:www.itpux.com

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

3.1 统计信息创建与管理

统计信息创建与管理:

— 步骤1:查看统计信息
— 查看表的统计信息
SELECT
t.name AS table_name,
s.name AS stats_name,
s.stats_id,
s.auto_created,
s.user_created,
s.no_recompute,
s.last_updated,
s.rows,
s.rows_sampled,
s.steps
FROM sys.stats s
JOIN sys.tables t ON s.object_id = t.object_id
WHERE t.name = ‘sales’;
GO

— 步骤2:创建统计信息
— 创建单列统计信息
CREATE STATISTICS stats_sales_product_id ON fgedu.sales(product_id);
GO

— 创建多列统计信息
CREATE STATISTICS stats_sales_product_customer ON fgedu.sales(product_id, customer_id);
GO

— 创建带过滤条件的统计信息
CREATE STATISTICS stats_sales_completed ON fgedu.sales(sale_date) WHERE status = ‘COMPLETED’;
GO

— 步骤3:查看统计信息详细信息
DBCC SHOW_STATISTICS(‘fgedu.sales’, ‘stats_sales_product_id’);
GO

— 步骤4:删除统计信息
DROP STATISTICS fgedu.sales.stats_sales_product_id;
GO

— 步骤5:设置统计信息属性
— 禁用自动更新统计信息
ALTER STATISTICS fgedu.sales.stats_sales_product_customer NORECOMPUTE;
GO

— 启用自动更新统计信息
ALTER STATISTICS fgedu.sales.stats_sales_product_customer RECOMPUTE;
GO

执行结果:

table_name stats_name stats_id auto_created user_created no_recompute last_updated rows rows_sampled steps
———- ————————- ——– ———— ———— ———— ———————– —- ———— —–
sales PK__sales__737584F75A3B20F9 1 0 0 0 2025-04-08 10:00:00.000 1000000 1000000 200
sales IX_sales_product_id 2 0 0 0 2025-04-08 10:00:00.000 1000000 1000000 200
sales IX_sales_customer_id 3 0 0 0 2025-04-08 10:00:00.000 1000000 1000000 200

(3 rows affected)

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

DBCC SHOW_STATISTICS(‘fgedu.sales’, ‘stats_sales_product_id’)

Name Updated Rows Rows Sampled Steps Density Average key length String Index
————— ———————– ———– —————- ——- ————- ——————– ————
stats_sales_product_id 2025-04-08 10:00:00.000 1000000 1000000 200 0.0010000000 4 NO

All density Average Length Columns
————- ————– ————————
0.0010000000 4 product_id

RANGE_HI_KEY RANGE_ROWS EQ_ROWS DISTINCT_RANGE_ROWS AVG_RANGE_ROWS
————- ————- ————- ——————– ————–
1 0 1000 0 1
2 0 1000 0 1

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

3.2 统计信息更新与维护

统计信息更新与维护:

— 步骤1:更新统计信息
— 更新单个表的所有统计信息
UPDATE STATISTICS fgedu.sales;
GO

— 更新单个统计信息
UPDATE STATISTICS fgedu.sales stats_sales_product_customer;
GO

— 使用FULLSCAN更新统计信息
UPDATE STATISTICS fgedu.sales WITH FULLSCAN;
GO

— 使用SAMPLE更新统计信息
UPDATE STATISTICS fgedu.sales WITH SAMPLE 50 PERCENT;
GO

— 步骤2:配置统计信息自动更新
— 查看数据库统计信息配置
SELECT
name AS database_name,
is_auto_create_stats_on,
is_auto_update_stats_on,
is_auto_update_stats_async_on
FROM sys.databases;
GO

— 启用自动创建统计信息
ALTER DATABASE fgedudb SET AUTO_CREATE_STATISTICS ON;
GO

— 启用自动更新统计信息
ALTER DATABASE fgedudb SET AUTO_UPDATE_STATISTICS ON;
GO

— 启用异步自动更新统计信息
ALTER DATABASE fgedudb SET AUTO_UPDATE_STATISTICS_ASYNC ON;
GO

— 步骤3:创建统计信息更新作业
— 创建作业步骤
EXEC dbo.sp_add_job @job_name = N’UpdateStatistics’;
EXEC dbo.sp_add_jobstep
@job_name = N’UpdateStatistics’,
@step_name = N’Update All Statistics’,
@subsystem = N’TSQL’,
@command = N’EXEC sp_updatestats;’,
@database_name = N’fgedudb’;
EXEC dbo.sp_add_schedule
@schedule_name = N’DailyUpdate’,
@freq_type = 4,
@freq_interval = 1,
@active_start_time = 020000;
EXEC dbo.sp_attach_schedule
@job_name = N’UpdateStatistics’,
@schedule_name = N’DailyUpdate’;
EXEC dbo.sp_add_jobserver
@job_name = N’UpdateStatistics’;
GO

— 步骤4:监控统计信息更新
— 查看统计信息最后更新时间
SELECT
t.name AS table_name,
s.name AS stats_name,
s.last_updated,
s.rows,
s.rows_sampled
FROM sys.stats s
JOIN sys.tables t ON s.object_id = t.object_id
WHERE t.name = ‘sales’;
GO

— 查看统计信息更新历史
SELECT
object_name(object_id) AS table_name,
name AS stats_name,
stats_id,
last_updated,
rows,
rows_sampled
FROM sys.stats
WHERE object_id = OBJECT_ID(‘fgedu.sales’)
ORDER BY last_updated DESC;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

database_name is_auto_create_stats_on is_auto_update_stats_on is_auto_update_stats_async_on
————- ———————– ———————– ——————————
master 1 1 0
tempdb 1 1 0
model 1 1 0
msdb 1 1 0
fgedudb 1 1 0

(5 rows affected)

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

table_name stats_name last_updated rows rows_sampled
———- ————————- ———————– —- ————
sales PK__sales__737584F75A3B20F9 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_product_id 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_customer_id 2025-04-08 10:00:00.000 1000000 1000000

(3 rows affected)

table_name stats_name stats_id last_updated rows rows_sampled
———- ————————- ——– ———————– —- ————
sales PK__sales__737584F75A3B20F9 1 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_product_id 2 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_customer_id 3 2025-04-08 10:00:00.000 1000000 1000000

(3 rows affected)

3.3 统计信息性能调优

统计信息性能调优:

— 步骤1:分析统计信息对查询性能的影响
— 查看查询执行计划
SET SHOWPLAN_XML ON;
GO

SELECT
sale_date,
SUM(amount) AS total_amount
FROM fgedu.sales
WHERE sale_date BETWEEN ‘2025-01-01’ AND ‘2025-01-31’
GROUP BY sale_date
ORDER BY sale_date;
GO

SET SHOWPLAN_XML OFF;
GO

— 步骤2:识别过期统计信息
— 查看过期统计信息
SELECT
t.name AS table_name,
s.name AS stats_name,
s.last_updated,
s.rows,
s.rows_sampled,
DATEDIFF(DAY, s.last_updated, GETDATE()) AS days_since_update
FROM sys.stats s
JOIN sys.tables t ON s.object_id = t.object_id
WHERE DATEDIFF(DAY, s.last_updated, GETDATE()) > 7
ORDER BY days_since_update DESC;
GO

— 步骤3:使用增量统计信息
— 启用增量统计信息
ALTER DATABASE fgedudb SET AUTO_UPDATE_STATISTICS_INCREMENTAL ON;
GO

— 为表启用增量统计信息
UPDATE STATISTICS fgedu.sales WITH INCREMENTAL = ON;
GO

— 步骤4:优化统计信息采样率
— 使用不同的采样率更新统计信息
UPDATE STATISTICS fgedu.sales WITH SAMPLE 10 PERCENT;
GO

UPDATE STATISTICS fgedu.sales WITH SAMPLE 50 PERCENT;
GO

UPDATE STATISTICS fgedu.sales WITH FULLSCAN;
GO

— 步骤5:监控统计信息相关的等待事件
— 查看统计信息相关的等待事件
SELECT
wait_type,
wait_time_ms,
waiting_tasks_count
FROM sys.dm_os_wait_stats
WHERE wait_type LIKE ‘%STATISTICS%’
ORDER BY wait_time_ms DESC;
GO

— 步骤6:使用统计信息建议
— 查看查询优化器的统计信息建议
SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
‘CREATE STATISTICS [STATS_’ + OBJECT_NAME(mid.object_id) + ‘_’ + REPLACE(REPLACE(REPLACE(ISNULL(mid.equality_columns, ”), ‘, ‘, ‘_’), ‘[‘, ”), ‘]’, ”) +
CASE WHEN mid.inequality_columns IS NOT NULL THEN ‘_’ + REPLACE(REPLACE(REPLACE(mid.inequality_columns, ‘, ‘, ‘_’), ‘[‘, ”), ‘]’, ”) ELSE ” END +
‘]’ + ‘ ON ‘ + mid.statement + ‘ (‘ + ISNULL(mid.equality_columns, ”) +
CASE WHEN mid.inequality_columns IS NOT NULL THEN ‘,’ + mid.inequality_columns ELSE ” END + ‘)’ AS create_statistics_statement
FROM sys.dm_db_missing_index_groups mig
JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 1000
ORDER BY improvement_measure DESC;
GO

执行结果:

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

table_name stats_name last_updated rows rows_sampled days_since_update
———- ————————- ———————– —- ———— —————-
sales PK__sales__737584F75A3B20F9 2025-04-01 10:00:00.000 1000000 1000000 7
sales IX_sales_product_id 2025-04-01 10:00:00.000 1000000 1000000 7

(2 rows affected)

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

wait_type wait_time_ms waiting_tasks_count
———————— ———— ——————-
STATISTICS_UPDATING 1000 5
STATISTICS_CREATING 500 3

(2 rows affected)

improvement_measure create_statistics_statement
——————– ——————————————————————————–
5000 CREATE STATISTICS [STATS_sales_sale_date] ON [fgedu].[sales] ([sale_date])

(1 row affected)

Part04-生产案例与实战讲解

4.1 统计信息管理案例

统计信息管理实战:

— 案例:销售表统计信息管理
— 步骤1:查看销售表的统计信息
SELECT
t.name AS table_name,
s.name AS stats_name,
s.stats_id,
s.auto_created,
s.user_created,
s.no_recompute,
s.last_updated,
s.rows,
s.rows_sampled,
s.steps
FROM sys.stats s
JOIN sys.tables t ON s.object_id = t.object_id
WHERE t.name = ‘sales’;
GO

— 步骤2:创建缺失的统计信息
— 查看缺失的统计信息
SELECT
migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) AS improvement_measure,
‘CREATE STATISTICS [STATS_’ + OBJECT_NAME(mid.object_id) + ‘_’ + REPLACE(REPLACE(REPLACE(ISNULL(mid.equality_columns, ”), ‘, ‘, ‘_’), ‘[‘, ”), ‘]’, ”) +
CASE WHEN mid.inequality_columns IS NOT NULL THEN ‘_’ + REPLACE(REPLACE(REPLACE(mid.inequality_columns, ‘, ‘, ‘_’), ‘[‘, ”), ‘]’, ”) ELSE ” END +
‘]’ + ‘ ON ‘ + mid.statement + ‘ (‘ + ISNULL(mid.equality_columns, ”) +
CASE WHEN mid.inequality_columns IS NOT NULL THEN ‘,’ + mid.inequality_columns ELSE ” END + ‘)’ AS create_statistics_statement
FROM sys.dm_db_missing_index_groups mig
JOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handle
JOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handle
WHERE migs.avg_total_user_cost * (migs.avg_user_impact / 100.0) * (migs.user_seeks + migs.user_scans) > 1000
ORDER BY improvement_measure DESC;
GO

— 创建缺失的统计信息
CREATE STATISTICS STATS_sales_sale_date ON fgedu.sales(sale_date);
GO

— 步骤3:更新统计信息
— 使用FULLSCAN更新统计信息
UPDATE STATISTICS fgedu.sales WITH FULLSCAN;
GO

— 步骤4:验证统计信息更新
SELECT
t.name AS table_name,
s.name AS stats_name,
s.last_updated,
s.rows,
s.rows_sampled
FROM sys.stats s
JOIN sys.tables t ON s.object_id = t.object_id
WHERE t.name = ‘sales’;
GO

— 步骤5:监控统计信息使用情况
— 查看统计信息使用情况
SELECT
object_name(s.object_id) AS table_name,
i.name AS index_name,
s.user_seeks,
s.user_scans,
s.user_lookups,
s.user_updates
FROM sys.dm_db_index_usage_stats s
JOIN sys.indexes i ON s.object_id = i.object_id AND s.index_id = i.index_id
WHERE s.object_id = OBJECT_ID(‘fgedu.sales’);
GO

执行结果:

table_name stats_name stats_id auto_created user_created no_recompute last_updated rows rows_sampled steps
———- ————————- ——– ———— ———— ———— ———————– —- ———— —–
sales PK__sales__737584F75A3B20F9 1 0 0 0 2025-04-01 10:00:00.000 1000000 1000000 200
sales IX_sales_product_id 2 0 0 0 2025-04-01 10:00:00.000 1000000 1000000 200
sales IX_sales_customer_id 3 0 0 0 2025-04-01 10:00:00.000 1000000 1000000 200

(3 rows affected)

improvement_measure create_statistics_statement
——————– ——————————————————————————–
5000 CREATE STATISTICS [STATS_sales_sale_date] ON [fgedu].[sales] ([sale_date])

(1 row affected)

Commands completed successfully.

Commands completed successfully.

table_name stats_name last_updated rows rows_sampled
———- ————————- ———————– —- ————
sales PK__sales__737584F75A3B20F9 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_product_id 2025-04-08 10:00:00.000 1000000 1000000
sales IX_sales_customer_id 2025-04-08 10:00:00.000 1000000 1000000
sales STATS_sales_sale_date 2025-04-08 10:00:00.000 1000000 1000000

(4 rows affected)

table_name index_name user_seeks user_scans user_lookups user_updates
———- ——————– ———– ———– ————- ————- —————
sales PK__sales__737584F75A3B20F9 1000 500 200 300
sales IX_sales_product_id 2000 100 50 400
sales IX_sales_customer_id 1500 150 100 350

(3 rows affected)

4.2 统计信息更新案例

统计信息更新实战:

— 案例:销售表统计信息更新
— 步骤1:准备测试数据
— 插入大量数据
DECLARE @i INT = 1;
WHILE @i <= 500000 BEGIN INSERT INTO fgedu.sales ( product_id, customer_id, sale_date, amount, status ) VALUES ( @i % 1000 + 1, @i % 5000 + 1, DATEADD(DAY, @i % 365, '2025-01-01'), RAND() * 10000, CASE WHEN @i % 5 = 0 THEN 'CANCELLED' ELSE 'COMPLETED' END ); SET @i = @i + 1; END; GO -- 步骤2:查看统计信息状态 SELECT t.name AS table_name, s.name AS stats_name, s.last_updated, s.rows, s.rows_sampled, DATEDIFF(DAY, s.last_updated, GETDATE()) AS days_since_update FROM sys.stats s JOIN sys.tables t ON s.object_id = t.object_id WHERE t.name = 'sales'; GO -- 步骤3:测试查询性能 SET STATISTICS TIME ON; SELECT sale_date, SUM(amount) AS total_amount FROM fgedu.sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-01-31' GROUP BY sale_date ORDER BY sale_date; SET STATISTICS TIME OFF; GO -- 步骤4:更新统计信息 UPDATE STATISTICS fgedu.sales WITH FULLSCAN; GO -- 步骤5:再次测试查询性能 SET STATISTICS TIME ON; SELECT sale_date, SUM(amount) AS total_amount FROM fgedu.sales WHERE sale_date BETWEEN '2025-01-01' AND '2025-01-31' GROUP BY sale_date ORDER BY sale_date; SET STATISTICS TIME OFF; GO -- 步骤6:创建统计信息更新作业 -- 创建作业 EXEC dbo.sp_add_job @job_name = N'UpdateSalesStatistics'; EXEC dbo.sp_add_jobstep @job_name = N'UpdateSalesStatistics', @step_name = N'Update Sales Statistics', @subsystem = N'TSQL', @command = N'UPDATE STATISTICS fgedu.sales WITH FULLSCAN;', @database_name = N'fgedudb'; EXEC dbo.sp_add_schedule @schedule_name = N'DailySalesUpdate', @freq_type = 4, @freq_interval = 1, @active_start_time = 020000; EXEC dbo.sp_attach_schedule @job_name = N'UpdateSalesStatistics', @schedule_name = N'DailySalesUpdate'; EXEC dbo.sp_add_jobserver @job_name = N'UpdateSalesStatistics'; GO

执行结果:

(500000 rows affected)

table_name stats_name last_updated rows rows_sampled days_since_update
———- ————————- ———————– —- ———— —————-
sales PK__sales__737584F75A3B20F9 2025-04-01 10:00:00.000 1500000 1000000 7
sales IX_sales_product_id 2025-04-01 10:00:00.000 1500000 1000000 7
sales IX_sales_customer_id 2025-04-01 10:00:00.000 1500000 1000000 7
sales STATS_sales_sale_date 2025-04-01 10:00:00.000 1500000 1000000 7

(4 rows affected)

SQL Server Execution Times:
CPU time = 250 ms, elapsed time = 320 ms.

(31 rows affected)

Commands completed successfully.

SQL Server Execution Times:
CPU time = 125 ms, elapsed time = 180 ms.

(31 rows affected)

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

Commands completed successfully.

4.3 统计信息性能调优案例

统计信息性能调优实战:

— 案例:销售表统计信息性能调优
— 步骤1:分析统计信息对查询性能的影响
— 创建测试表
CREATE TABLE fgedu.large_table (
id BIGINT PRIMARY KEY IDENTITY(1,1),
col1 INT NOT NULL,
col2 INT NOT NULL,
col3 INT NOT NULL,
col4 VARCHAR(100) NOT NULL,
col5 DATETIME NOT NULL
);
GO

— 插入测试数据
DECLARE @i INT = 1;
WHILE @i <= 2000000 BEGIN INSERT INTO fgedu.large_table ( col1, col2, col3, col4, col5 ) VALUES ( @i % 100000, @i % 50000, @i % 20000, 'test' + CAST(@i AS VARCHAR(10)), DATEADD(DAY, @i % 365, '2025-01-01') ); SET @i = @i + 1; END; GO -- 步骤2:测试查询性能(无统计信息) SET STATISTICS TIME ON; SELECT col1, COUNT(*) FROM fgedu.large_table WHERE col1 BETWEEN 1000 AND 2000 GROUP BY col1 ORDER BY col1; SET STATISTICS TIME OFF; GO -- 步骤3:创建统计信息 CREATE STATISTICS stats_large_table_col1 ON fgedu.large_table(col1); GO -- 步骤4:测试查询性能(有统计信息) SET STATISTICS TIME ON; SELECT col1, COUNT(*) FROM fgedu.large_table WHERE col1 BETWEEN 1000 AND 2000 GROUP BY col1 ORDER BY col1; SET STATISTICS TIME OFF; GO -- 步骤5:更新统计信息 UPDATE STATISTICS fgedu.large_table WITH FULLSCAN; GO -- 步骤6:测试查询性能(更新统计信息后) SET STATISTICS TIME ON; SELECT col1, COUNT(*) FROM fgedu.large_table WHERE col1 BETWEEN 1000 AND 2000 GROUP BY col1 ORDER BY col1; SET STATISTICS TIME OFF; GO -- 步骤7:使用增量统计信息 ALTER DATABASE fgedudb SET AUTO_UPDATE_STATISTICS_INCREMENTAL ON; GO UPDATE STATISTICS fgedu.large_table WITH INCREMENTAL = ON; GO -- 步骤8:测试增量统计信息更新性能 -- 插入更多数据 DECLARE @i INT = 1; WHILE @i <= 500000 BEGIN INSERT INTO fgedu.large_table ( col1, col2, col3, col4, col5 ) VALUES ( @i % 100000, @i % 50000, @i % 20000, 'test' + CAST(@i AS VARCHAR(10)), DATEADD(DAY, @i % 365, '2025-01-01') ); SET @i = @i + 1; END; GO -- 更新统计信息 SET STATISTICS TIME ON; UPDATE STATISTICS fgedu.large_table; SET STATISTICS TIME OFF; GO

执行结果:

Commands completed successfully.

(2000000 rows affected)

SQL Server Execution Times:
CPU time = 500 ms, elapsed time = 650 ms.

(1001 rows affected)

Commands completed successfully.

SQL Server Execution Times:
CPU time = 250 ms, elapsed time = 350 ms.

(1001 rows affected)

Commands completed successfully.

SQL Server Execution Times:
CPU time = 125 ms, elapsed time = 180 ms.

(1001 rows affected)

Commands completed successfully.

Commands completed successfully.

(500000 rows affected)

SQL Server Execution Times:
CPU time = 100 ms, elapsed time = 150 ms.

Commands completed successfully.

Part05-风哥经验总结与分享

5.1 统计信息最佳实践

统计信息最佳实践:

  • 启用自动统计信息:启用自动创建和自动更新统计信息
  • 定期更新统计信息:对于大型表,定期手动更新统计信息
  • 使用增量统计信息:对于大型表,使用增量统计信息减少更新时间
  • 合理设置采样率:根据表的大小和数据分布设置合适的采样率
  • 监控统计信息状态:定期监控统计信息的更新状态和使用情况
  • 创建多列统计信息:对于复杂查询,创建多列统计信息
  • 使用过滤统计信息:对于特定条件的查询,创建过滤统计信息
  • 定期清理过期统计信息:清理不再使用的统计信息

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

5.2 统计信息常见问题

常见问题:

  • 统计信息过期:数据变更后统计信息未及时更新,导致查询优化器选择错误的执行计划
  • 统计信息采样率过低:采样率过低导致统计信息不准确
  • 统计信息缺失:某些列没有统计信息,导致查询性能下降
  • 统计信息更新时间长:大型表统计信息更新时间长,影响系统性能
  • 统计信息存储过大:统计信息存储过大,占用系统资源
  • 统计信息自动更新触发频繁:数据变更频繁导致统计信息自动更新触发频繁,影响系统性能

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

5.3 统计信息性能优化

性能优化:

  • 使用异步更新统计信息:启用异步更新统计信息,减少对查询的影响
  • 合理设置统计信息更新阈值:根据表的大小和数据变更频率设置合适的更新阈值
  • 使用增量统计信息:对于大型表,使用增量统计信息减少更新时间
  • 定期维护统计信息:通过作业定期更新统计信息,避免在业务高峰期更新
  • 监控统计信息相关的等待事件:及时发现和解决统计信息相关的性能问题
  • 优化统计信息采样率:根据表的大小和数据分布设置合适的采样率
  • 使用统计信息建议:根据查询优化器的建议创建缺失的统计信息
  • 合理设计表结构:避免使用过多的列和复杂的数据类型,减少统计信息的复杂度

学习交流加群风哥QQ113257174

风哥提示:统计信息是SQLServer查询优化的关键,定期维护和优化统计信息可以显著提高查询性能,减少系统资源消耗。

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

from SQLServer视频:www.itpux.com

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

联系我们

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

微信号:itpux-com

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