Oracle(75)什么是统计信息(Statistics)?

统计信息(Statistics)是数据库管理系统(DBMS)用来优化查询性能的重要元数据。统计信息通常包括表和索引的行数、列的分布、数据的选择性、数据的密度等。数据库查询优化器利用这些统计信息生成高效的查询执行计划,从而提高查询性能。

统计信息的内容

统计信息通常包括以下内容:

  1. 行数(Row Count):表中总行数。
  2. 直方图(Histogram):列值分布,描述列中不同值的频率。
  3. 数据密度(Density):描述数据重复度,用于估算选择性。
  4. NULL值统计:列中NULL值的数量。
  5. 索引信息:索引的选择性、叶节点数、层级等。

统计信息的作用

统计信息可以帮助查询优化器:

  • 选择最优的索引。
  • 选择最优的联接顺序。
  • 选择最优的联接方法(如嵌套循环联接、哈希联接)。
  • 估算查询成本,选择最优的执行计划。

如何查看和更新统计信息

不同的数据库管理系统有不同的方法来查看和更新统计信息。以下是一些常见DBMS(如Oracle、MySQL、PostgreSQL、SQL Server)的详细示例和代码。

Oracle

查看统计信息

可以查询数据字典视图DBA_TAB_STATISTICSDBA_IND_STATISTICS来查看表和索引的统计信息。

sql 复制代码
SELECT table_name, num_rows, blocks, empty_blocks, avg_space
FROM dba_tab_statistics
WHERE owner = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME';

SELECT index_name, num_rows, distinct_keys, avg_leaf_blocks_per_key, avg_data_blocks_per_key
FROM dba_ind_statistics
WHERE owner = 'SCHEMA_NAME' AND table_name = 'TABLE_NAME';
更新统计信息

使用DBMS_STATS包来收集统计信息。

sql 复制代码
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'TABLE_NAME');
  DBMS_STATS.GATHER_INDEX_STATS('SCHEMA_NAME', 'INDEX_NAME');
END;

MySQL

查看统计信息

可以查询INFORMATION_SCHEMA中的TABLESSTATISTICS视图。

sql 复制代码
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = 'DATABASE_NAME' AND table_name = 'TABLE_NAME';

SELECT index_name, column_name, cardinality
FROM information_schema.statistics
WHERE table_schema = 'DATABASE_NAME' AND table_name = 'TABLE_NAME';
更新统计信息

使用ANALYZE TABLE命令来更新统计信息。

sql 复制代码
ANALYZE TABLE employees;

PostgreSQL

查看统计信息

可以查询pg_stat_all_tablespg_stat_all_indexes视图。

sql 复制代码
SELECT schemaname, relname, n_live_tup, n_dead_tup
FROM pg_stat_all_tables
WHERE relname = 'TABLE_NAME';

SELECT schemaname, indexrelname, idx_scan, idx_tup_read, idx_tup_fetch
FROM pg_stat_all_indexes
WHERE relname = 'TABLE_NAME';
更新统计信息

使用ANALYZE命令来更新统计信息。

sql 复制代码
ANALYZE employees;

SQL Server

查看统计信息

可以查询系统视图sys.statssys.dm_db_stats_properties

sql 复制代码
SELECT name AS index_name, stats_id, filter_definition
FROM sys.stats
WHERE object_id = OBJECT_ID('SCHEMA_NAME.TABLE_NAME');

SELECT object_id, stats_id, last_updated, rows, rows_sampled, steps
FROM sys.dm_db_stats_properties(OBJECT_ID('SCHEMA_NAME.TABLE_NAME'), stats_id);
更新统计信息

使用UPDATE STATISTICS命令来更新统计信息。

sql 复制代码
UPDATE STATISTICS employees;

示例代码总结

创建表和插入数据
sql 复制代码
CREATE TABLE employees (
    emp_id SERIAL PRIMARY KEY,
    emp_name VARCHAR(50),
    emp_department VARCHAR(50)
);

INSERT INTO employees (emp_name, emp_department)
VALUES ('Alice', 'IT'), ('Bob', 'HR'), ('Charlie', 'IT'), ('David', 'Finance');
查看统计信息

Oracle:

sql 复制代码
SELECT table_name, num_rows, blocks, empty_blocks, avg_space
FROM dba_tab_statistics
WHERE owner = 'SCHEMA_NAME' AND table_name = 'employees';

MySQL:

sql 复制代码
SELECT table_name, table_rows
FROM information_schema.tables
WHERE table_schema = 'DATABASE_NAME' AND table_name = 'employees';

PostgreSQL:

sql 复制代码
SELECT schemaname, relname, n_live_tup, n_dead_tup
FROM pg_stat_all_tables
WHERE relname = 'employees';

SQL Server:

sql 复制代码
SELECT name AS index_name, stats_id, filter_definition
FROM sys.stats
WHERE object_id = OBJECT_ID('dbo.employees');
更新统计信息

Oracle:

sql 复制代码
BEGIN
  DBMS_STATS.GATHER_TABLE_STATS('SCHEMA_NAME', 'employees');
END;

MySQL:

sql 复制代码
ANALYZE TABLE employees;

PostgreSQL:

sql 复制代码
ANALYZE employees;

SQL Server:

sql 复制代码
UPDATE STATISTICS employees;

总结

统计信息是数据库管理系统用来优化查询性能的重要元数据。通过查看和更新统计信息,可以确保查询优化器能够生成高效的查询执行计划,从而提高查询性能。了解如何查看和更新统计信息,可以帮助识别和解决性能问题。

相关推荐
头发那是一根不剩了35 分钟前
Spring Boot 多数据源切换:AbstractRoutingDataSource
数据库·spring boot·后端
草履虫建模1 小时前
Redis:高性能内存数据库与缓存利器
java·数据库·spring boot·redis·分布式·mysql·缓存
泊浮目2 小时前
未来数据库硬件-计算篇
数据库·云计算·操作系统
靖顺2 小时前
【OceanBase诊断调优】—— 执行计划显示分区 PARTITIONS[P0SP9] 如何查询是哪个分区?
数据库·oracle·oceanbase
KIDAKN2 小时前
MySQL 存储结构
数据库·mysql
Code季风2 小时前
SQL关键字快速入门:HAVING 分组后的条件过滤
数据库·sql·mysql
程序猿ZhangSir3 小时前
Redis 缓存进阶篇,缓存真实数据和缓存文件指针最佳实现?如何选择?
数据库·redis·缓存
yjb.gz3 小时前
Oracle函数JSON_TABLE使用
数据库·oracle·json
Dubhehug4 小时前
4.B树和B+树的区别?为什么MySQL选择B+树作为索引?
数据库·b树·mysql·面试·b+树
linux修理工4 小时前
n1 armbian 安装桌面环境并启用xrdp远程登录
linux·服务器·数据库