本章我们就要讲解一下如何利用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语句查询数据库中所有索引相关推荐

  1. MySQL数据库常用命令_常用SQL语句及命令_MySQL常用语句

    文章目录 一.常用的 SQL 语句 (一)查看当前登录用户 (二)查看当前数据库 (三)如何查看全部用户? (四)创建数据库 (五)选择要操作的数据库 (六)创建表 (七)查看表的结构 (八)往表中插 ...

  2. mysql原生sql语句_原生SQL语句

    -- -sql语句的注意 : 1 以;作为结束符 2不区分大小写--01mysql 数据库的操作--链接数据库 mysql-uroot -pmysql--不显示密码 mysql-uroot -p my ...

  3. mysql删除字段sql语句_用SQL语句添加删除修改字段

    用SQL语句添加删除修改字段 1.增加字段 alter table docdsp add dspcode char(200) 2.删除字段 ALTER TABLE table_NAME DROP CO ...

  4. mysql外键约束脚本_使用SQL脚本创建数据库,操作主键、外键与各种约束(MS SQL Server)...

    在实际开发中,可能很少人会手写sql脚本来操作数据库的种种.特别是微软的MS SQL Server数据库,它的SQL Server Management Studio对数据库的图形化操作极致简便,从而 ...

  5. mysql给字段添加描述_用sql 语句给字段添加描述

    用sql 语句给字段添加描述 IF not exists (SELECT * FROM ::fn_listextendedproperty (NULL, 'user', 'dbo', 'table', ...

  6. 使用了无效的sql语句_使用SQL语句创建数据库

    使用SQL语句创建数据库(SQL Server 2008) 创建一个名为'DA_sales'的数据库. 主文件组'DA_sales_data'(初始大小:5MB;最大值:200MB;自动增长率:10% ...

  7. c语言解析sql语句_解析SQL语句比解析类C语言更麻烦?

    最近想做一个SQL语句解析器,换句话说想给自己的系统加上类似SQL语句的查询引擎.我之前做过一个解析类似C语言语法的解析器,可以解析 C/C++里的运算表达式,if-else-等基本语句.我以为做个S ...

  8. excel生成mysql语句_通过SQL语句直接实现Excel与数据库的导入导出

    1.在SQL数据库中直接从Excel里面查询数据: select \* from OPENROWSET('MICROSOFT.JET.OLEDB.4.0' ,'Excel 5.0;HDR=YES;DA ...

  9. mysql查询和某人一样_使用sql语句实现查询某人的排名,分数相同排名相同

    一.第一种形式排名 如:4个学生的分数分别是:100.90.90.80 排名结果为:第一.第二.第二.第三 SELECT count(DISTINCT score) FROM tbl_score WH ...

最新文章

  1. php.ini来配置session,php.ini 配置session自动开启
  2. 四元数姿态解算及多传感器融合详细解析
  3. 微软Windows Community Toolkit一览
  4. 深度linux系统反复重启,修复启动
  5. 【leetcode】Multiply Strings(middle)
  6. HDU2020 绝对值排序【入门】
  7. python二维列表长度_python如何使二维数组的高度大于长度
  8. 简述计算机视觉在各领域中的成功应用,现代传感技术与系统课后题及答案
  9. 读书笔记 - 《经济学通识》
  10. adobe清理工具_Adobe终于通过其新的渐变工具实现了这一点-UX评论
  11. jsp页面中Table表格首列合并同类项的脚本调用方法
  12. gitHub不能用密码推送了,必须要使用令牌
  13. 2022图像翻译/扩散模型:UNIT-DDPM: UNpaired Image Translation with Denoising Diffusion Probabilistic Models
  14. 盘点国产青春电影十宗罪
  15. 迅雷创始人程浩:流量、资本红利已成过去式,中国互联网下一个十年属于……
  16. 企业市场营销,你不知道那些
  17. 如果阿里、华为们的智慧城市只是停留顶层设计,那么我们终将会被抛下
  18. 土耳其发生强震 中国为此提供紧急援助
  19. 风险管理及风险价值VaR分析
  20. 笔记本 intel 移动CPU大全 1-3代

热门文章

  1. urllib.request.urlopen详解
  2. Linux awk指令详解
  3. 面试中你必须要知道的语言陷阱(很好,怕再找不到了)
  4. Java除法返回百分比的值
  5. Ubuntu虚拟机设置共享文件夹
  6. Hadoop之Zookeeper学习(一)
  7. 播放器上音频断续问题的原因(realmedia)
  8. 【JavaScript】利用JS实现柱形统计图
  9. Element-pagination分页组件修改current-page属性,不能正确渲染当前页码的问题(从组件源码查找问题)
  10. 健身房会员管理系统需求分析文档