仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 679|回复: 6
打印 上一主题 下一主题

[学习教程] 使用SQL语句查询数据库中一切索引

[复制链接]
兰色精灵 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 14:07:10 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
Memory所有数据置于内存的存储引擎,拥有极高的插入,更新和查询效率。但是会占用和数据量成正比的内存空间。并且其内容会在Mysql重新启动时丢失本章我们就要解说一下怎样使用sql语句来查询出数据库中一切索引明细。固然了,我们能够在microsoftsqlservermanagementstudio当选择"表"->"索引"来检察单个表的索引明细。但如许,查询效力就很低了。

要使用sql查询出数据中一切索引,起首要懂得目次视图sys.indexes。
sys.indexes的界说以下:
每一个表格工具(比方,表、视图或表值函数)的索引或堆都包括一行。即这个视图中包括了数据库中一切的索引数据。详细列的申明以下:
列名数据范例申明object_idint该索引所属工具的ID。namesysname索引的称号。name只在该工具中是独一的。
NULL=堆index_idint索引的ID。index_id只在该工具中是独一的。
0=堆
1=会萃索引
>1=非会萃索引typetinyint索引的范例:
0=堆
1=会萃
2=非会萃
3=XMLtype_descnvarchar(60)索引范例的申明:
HEAP
CLUSTERED
NONCLUSTERED
XMLis_uniquebit1=索引是独一的。0=索引不是独一的。data_space_idint该索引的数据空间的ID。数据空间是文件组或分区计划。0=object_id是表值函数。ignore_dup_keybit1=IGNORE_DUP_KEY是ON。0=IGNORE_DUP_KEY是OFF。is_primary_keybit1=索引是PRIMARYKEY束缚的一部分。is_unique_constraintbit1=索引是UNIQUE束缚的一部分。fill_factortinyint>0=创立或从头天生索引时利用的FILLFACTOR百分比。0=默许值is_paddedbit1=PADINDEX是ON。0=PADINDEX是OFF。is_disabledbit1=禁用索引。0=不由用索引。is_hypotheticalbit1=索引是假定的,不克不及间接用作数据会见路径。假定的索引包括列级统计信息。0=索引不是假定的。allow_row_locksbit1=索引同意行锁。0=索引不同意行锁。allow_page_locksbit1=索引同意页锁。0=索引不同意页锁。
假如要查询到索引中的列信息,还必要分离目次视图sys.index_columns,这个视图中包括了一切索引中的列的信息。
详细列的申明以下:
列名数据范例申明object_idint界说了索引的工具的ID。index_idint界说了列的索引的ID。index_column_idint索引列的ID。index_column_id仅在index_id内是独一的。column_idintobject_id中的列的ID。
0=非会萃索引中的行标识符(RID)。
column_id仅在object_id中是独一的。key_ordinaltinyint键列集内的序数(从1入手下手)。
0=非键列,大概是XML索引。
因为xml范例的列不成对照,因而XML索引不会招致对基本列值排序。由于XML索引不是键,以是key_ordinal值将一直是0。partition_ordinaltinyint分区列集内的序数(从1入手下手)。
0=非分区列。is_descending_keybit1=索引键列接纳降序排序。
0=索引键列接纳升序排序。is_included_columnbit1=列是利用CREATEINDEXINCLUDE子句到场索引的非键列。
0=列不是包括性列。
要检察索引的数据明细,请参考以下链接:
使用sys.dm_db_index_physical_stats检察索引碎片等数据

分离这两个视图,再分离一些sql经常使用的体系表,我们能够写出以下sql来到达我们的目标。
selectt1.nameas表名,
t2.nameas索引名,
t4.index_column_idas列的序号
t5.nameas列名,
t6.nameas列的范例,
        t6.max_lengthas列的最年夜长度,
        t6.precisionas列的精度,
        t6.scaleas列的小数位数
fromsys.objectst1
joinsys.objectst2ont2.parent_object_id=t1.object_id
joinsys.indexest3ont3.object_id=t2.parent_object_idandt3.name=t2.name
joinsys.index_columnst4ont4.object_id=t3.object_idandt4.index_id=t3.index_id
joinsys.columnst5ont5.object_id=t1.object_idandt5.column_id=t4.column_id
joinsys.typest6ont5.user_type_id=t6.user_type_id

固然了,怎样该列为varchar大概nvarchar等没有精度与小数位数的范例,precision与scale都即是0。

下面是查询一切索引的sql,假如只需检察一切的主键索引,加上过滤前提便可:
selectt1.nameasTableName,
t2.nameasPrimaryName,
t4.index_column_idasIndexColumnID,
t5.nameasColumnName,
t6.nameastypename,
        t6.max_length,
        t6.precision,
        t6.scale
fromsys.objectst1
joinsys.objectst2ont2.parent_object_id=t1.object_id
joinsys.indexest3ont3.object_id=t2.parent_object_idandt3.name=t2.name
joinsys.index_columnst4ont4.object_id=t3.object_idandt4.index_id=t3.index_id
joinsys.columnst5ont5.object_id=t1.object_idandt5.column_id=t4.column_id
joinsys.typest6ont5.user_type_id=t6.user_type_id
wheret2.type=pk

下面是检察数据库中一切索引,假如只需检察单个表的索引,加上过滤前提便可:
selectt1.nameasTableName,
t2.nameasPrimaryName,
t4.index_column_idasIndexColumnID,
t5.nameasColumnName,
t6.nameastypename,
        t6.max_length,
        t6.precision,
        t6.scale
fromsys.objectst1
joinsys.objectst2ont2.parent_object_id=t1.object_id
joinsys.indexest3ont3.object_id=t2.parent_object_idandt3.name=t2.name
joinsys.index_columnst4ont4.object_id=t3.object_idandt4.index_id=t3.index_id
joinsys.columnst5ont5.object_id=t1.object_idandt5.column_id=t4.column_id
joinsys.typest6ont5.user_type_id=t6.user_type_id
wheret2.type=pk
andt1.object_id=object_id(表名)


本章先容到这,但愿能给人人带来匡助。InnoDB数据表的索引,与InnoDB数据表相比,在InnoDB数据表上,索引对InnoDB数据表的重要性要大得多。在InnoDB数据表上,索引不仅会在搜索数据记录时发挥作用,还是数据行级锁定机制的苊、基础。
小妖女 该用户已被删除
沙发
发表于 2015-1-18 12:05:00 | 只看该作者
XML字段类型更好的解决了XML数据的操作。XQuery确实不错,但是个人对其没好感。(CSDN的开发者应该是相当的熟了!)
分手快乐 该用户已被删除
板凳
发表于 2015-2-8 12:40:15 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
若相依 该用户已被删除
地板
发表于 2015-2-25 15:36:47 | 只看该作者
入门没那么困难,精通没那么容易
不帅 该用户已被删除
5#
发表于 2015-3-8 00:45:14 | 只看该作者
是要和操作系统进行Socket通讯的场景。否则建议慎重!
老尸 该用户已被删除
6#
发表于 2015-3-15 19:41:23 | 只看该作者
而SQLServer如果能像Oracle一样可以为登陆分配如:5%的cpu,10%的内存。就可以解决这个漏洞。
灵魂腐蚀 该用户已被删除
7#
发表于 2015-3-22 03:30:15 | 只看该作者
分区表效率问题肯定是大家关心的问题。在我的试验中,如果按照分区字段进行的查询(过滤)效率会高于未分区表的相同语句。但是如果按照非分区字段进行查询,效率会低于未分区表的相同语句。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:03

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表