mysql 查询数据库索引语句_利用SQL语句查询数据库中所有索引
本章我们就要讲解一下如何利用sql语句来查询出数据库中所有索引明细。当然了,我们可以在microsoft sql server management studio中选择"表"- >"索引"来查看单个表的索引明细。但这样,查询效率就很低了。
要利用sql查询出数据中所有索引,首先要了解目录视图sys.indexes。
sys.indexes的定义如下:
每个表格对象(例如,表、视图或表值函数)的索引或堆都包含一行。即这个视图中包含了数据库中所有的索引数据。具体列的说明如下:
列名
数据类型
说明
object_id
int
该索引所属对象的 ID。
name
sysname
索引的名称。name 只在该对象中是唯一的。
NULL = 堆
index_id
int
索引的 ID。index_id 只在该对象中是唯一的。
0 = 堆
1 = 聚集索引
> 1 = 非聚集索引
type
tinyint
索引的类型:
0 = 堆
1 = 聚集
2 = 非聚集
3 = XML
type_desc
nvarchar(60)
索引类型的说明:
HEAP
CLUSTERED
NONCLUSTERED
XML
is_unique
bit
1 = 索引是唯一的。0 = 索引不是唯一的。
data_space_id
int
该索引的数据空间的 ID。数据空间是文件组或分区方案。0 = object_id 是表值函数。
ignore_dup_key
bit
1 = IGNORE_DUP_KEY 是 ON。0 = IGNORE_DUP_KEY 是 OFF。
is_primary_key
bit
1 = 索引是 PRIMARY KEY 约束的一部分。
is_unique_constraint
bit
1 = 索引是 UNIQUE 约束的一部分。
fill_factor
tinyint
> 0 = 创建或重新生成索引时使用的 FILLFACTOR 百分比。0 = 默认值
is_padded
bit
1 = PADINDEX 是 ON。0 = PADINDEX 是 OFF。
is_disabled
bit
1 = 禁用索引。0 = 不禁用索引。
is_hypothetical
bit
1 = 索引是假设的,不能直接用作数据访问路径。假设的索引包含列级统计信息。0 = 索引不是假设的。
allow_row_locks
bit
1 = 索引允许行锁。0 = 索引不允许行锁。
allow_page_locks
bit
1 = 索引允许页锁。0 = 索引不允许页锁。
如果要查询到索引中的列信息,还需要结合目录视图sys.index_columns,这个视图中包含了所有索引中的列的信息。
具体列的说明如下:
列名
数据类型
说明
object_id
int
定义了索引的对象的 ID。
index_id
int
定义了列的索引的 ID。
index_column_id
int
索引列的 ID。index_column_id 仅在 index_id 内是唯一的。
column_id
int
object_id 中的列的 ID。
0 = 非聚集索引中的行标识符 (RID)。
column_id 仅在 object_id 中是唯一的。
key_ordinal
tinyint
键列集内的序数 (从 1 开始)。
0 = 非键列,或者是 XML 索引。
由于 xml 类型的列不可比较,因此 XML 索引不会导致对基础列值排序。因为 XML 索引不是键,所以 key_ordinal 值将始终是 0。
partition_ordinal
tinyint
分区列集内的序数 (从 1 开始)。
0 = 非分区列。
is_descending_key
bit
1 = 索引键列采用降序排序。
0 = 索引键列采用升序排序。
is_included_column
bit
1 = 列是使用 CREATE INDEX INCLUDE 子句加入索引的非键列。
0 = 列不是包含性列。
要查看索引的数据明细,请参考以下链接:
利用sys.dm_db_index_physical_stats查看索引碎片等数据
结合这两个视图,再结合一些sql常用的系统表,我们可以写出如下sql来达到我们的目的。
select t1.name as 表名,
t2.name as 索引名,
t4.index_column_id as 列的序号
t5.name as 列名,
t6.name as 列的类型,
t6.max_length as 列的最大长度,
t6.precision as 列的精度,
t6.scale as 列的小数位数
from sys.objects t1
join sys.objects t2 on t2.parent_object_id = t1.object_id
join sys.indexes t3 on t3.object_id = t2.parent_object_id and t3.name = t2.name
join sys.index_columns t4 on t4.object_id = t3.object_id and t4.index_id = t3.index_id
join sys.columns t5 on t5.object_id = t1.object_id and t5.column_id = t4.column_id
join sys.types t6 on t5.user_type_id=t6.user_type_id
当然了,如何该列为varchar或者nvarchar等没有精度与小数位数的类型,precision与scale都等于0。
上面是查询所有索引的sql,如果只要查看所有的主键索引,加上过滤条件即可:
select t1.name as TableName,
t2.name as PrimaryName,
t4.index_column_id as IndexColumnID,
t5.name as ColumnName,
t6.name as typename,
t6.max_length,
t6.precision,
t6.scale
from sys.objects t1
join sys.objects t2 on t2.parent_object_id = t1.object_id
join sys.indexes t3 on t3.object_id = t2.parent_object_id and t3.name = t2.name
join sys.index_columns t4 on t4.object_id = t3.object_id and t4.index_id = t3.index_id
join sys.columns t5 on t5.object_id = t1.object_id and t5.column_id = t4.column_id
join sys.types t6 on t5.user_type_id=t6.user_type_id
where t2.type = 'pk'
上面是查看数据库中所有索引,如果只要查看单个表的索引,加上过滤条件即可:
select t1.name as TableName,
t2.name as PrimaryName,
t4.index_column_id as IndexColumnID,
t5.name as ColumnName,
t6.name as typename,
t6.max_length,
t6.precision,
t6.scale
from sys.objects t1
join sys.objects t2 on t2.parent_object_id = t1.object_id
join sys.indexes t3 on t3.object_id = t2.parent_object_id and t3.name = t2.name
join sys.index_columns t4 on t4.object_id = t3.object_id and t4.index_id = t3.index_id
join sys.columns t5 on t5.object_id = t1.object_id and t5.column_id = t4.column_id
join sys.types t6 on t5.user_type_id=t6.user_type_id
where t2.type = 'pk'
and t1.object_id = object_id('表名')
本章介绍到这,希望能给大家带来帮助。
mysql 查询数据库索引语句_利用SQL语句查询数据库中所有索引相关推荐
- MySQL数据库常用命令_常用SQL语句及命令_MySQL常用语句
文章目录 一.常用的 SQL 语句 (一)查看当前登录用户 (二)查看当前数据库 (三)如何查看全部用户? (四)创建数据库 (五)选择要操作的数据库 (六)创建表 (七)查看表的结构 (八)往表中插 ...
- mysql原生sql语句_原生SQL语句
-- -sql语句的注意 : 1 以;作为结束符 2不区分大小写--01mysql 数据库的操作--链接数据库 mysql-uroot -pmysql--不显示密码 mysql-uroot -p my ...
- mysql删除字段sql语句_用SQL语句添加删除修改字段
用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...
- mysql外键约束脚本_使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)...
在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...
- mysql给字段添加描述_用sql 语句给字段添加描述
用sql 语句给字段添加描述 IF not exists (SELECT * FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', ...
- 使用了无效的sql语句_使用SQL语句创建数据库
使用SQL语句创建数据库(SQL Server 2008) 创建一个名为'DA_sales'的数据库. 主文件组'DA_sales_data'(初始大小:5MB;最大值:200MB;自动增长率:10% ...
- c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?
最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...
- excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出
1.在SQL数据库中直接从Excel里面查询数据: select \* from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DA ...
- mysql查询和某人一样_使用sql语句实现查询某人的排名,分数相同排名相同
一.第一种形式排名 如:4个学生的分数分别是:100.90.90.80 排名结果为:第一.第二.第二.第三 SELECT count(DISTINCT score) FROM tbl_score WH ...
最新文章
- php.ini来配置session,php.ini 配置session自动开启
- 四元数姿态解算及多传感器融合详细解析
- 微软Windows Community Toolkit一览
- 深度linux系统反复重启,修复启动
- 【leetcode】Multiply Strings(middle)
- HDU2020 绝对值排序【入门】
- python二维列表长度_python如何使二维数组的高度大于长度
- 简述计算机视觉在各领域中的成功应用,现代传感技术与系统课后题及答案
- 读书笔记 - 《经济学通识》
- adobe清理工具_Adobe终于通过其新的渐变工具实现了这一点-UX评论
- jsp页面中Table表格首列合并同类项的脚本调用方法
- gitHub不能用密码推送了,必须要使用令牌
- 2022图像翻译/扩散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models
- 盘点国产青春电影十宗罪
- 迅雷创始人程浩:流量、资本红利已成过去式,中国互联网下一个十年属于……
- 企业市场营销,你不知道那些
- 如果阿里、华为们的智慧城市只是停留顶层设计,那么我们终将会被抛下
- 土耳其发生强震 中国为此提供紧急援助
- 风险管理及风险价值VaR分析
- 笔记本 intel 移动CPU大全 1-3代