SQLSERVER索引汇总

CREATE TABLE TEST(ID INT,UNAME VARCHAR(10));
--非聚集索引
CREATE INDEX IDX_TONY ON TEST(ID);

查看TEST表中IDX_TONY1索引的碎片信息
DBCC SHOWCONTIG(TEST,IDX_TONY1);
/*
扫描页数:如果你知道行的近似指和表或索引里的行数,那么你可以估计出索引里的页数,如果明显比你估计的页数要高,说明存在内部碎片
扫描区数:用扫描页数除以8,四舍五入到下一个最高值。该值应该和DBCC SHOWCONTIG返回的扫描扩展盘区数一致。如果DBCC SHOWCONTIG返回的数高,说明存在外部碎片。碎片的严重程度依赖于刚才显示的值比估计值高多少
区切换次数:该数应该等于扫描区数减1,高了则说明有外部碎片。
每个区的平均页数:该数是扫描页数除以扫描扩展盘区数,一般是8,小于8说明有外部碎片
扫描密度[最佳值:实际值]:这是扩展盘区的最佳值和实际值的比率,该百分比应该尽可能靠近100%,低了则说明有外部碎片
逻辑扫描碎片:无序页的百分比,该百分比应该在0%到10%之间,高了则说明有外部碎片
区扫描碎片:无序扩展盘区在扫描索引叶级页中所占的百分比,该百分比应该是0%,高了则说明有外部碎片
每页的平均可用字节数:所扫描的页上的平均可用字节数,越高说明有内部碎片,不过在你用这个数字决定是否有内部碎片之前,应该考虑fill factor(填充因子)
平均页密度(完整):每页上的平均可用字节数的百分比的相反数,低的百分比说明有内部碎片
*/

CREATE TABLE TEST(ID INT,UNAME VARCHAR(10));
--非聚集索引
CREATE INDEX IDX_TONY ON TEST(ID);
CREATE INDEX IDX_TONY2 ON TEST(UNAME);
--带填充因子的索引
CREATE INDEX IDX_ID1 ON TEST(ID) WITH (PAD_INDEX=ON, FILLFACTOR=20);
--填充因子一般设置的原则是,数据变化较大,填充因子设较小值,而数据变化较小,填充因子设较大值,只读表的填充因子可设置为100

--删除索引
DROP INDEX TEST.IDX_TONY;
DROP INDEX TEST.IDX_ID1;

--唯一聚集索引
CREATE UNIQUE CLUSTERED INDEX IDX_UN_TONY ON TEST(ID);
DROP INDEX TEST.IDX_UN_TONY;

--聚集索引的顺序就是数据的物理存储顺序,对于一个表来说,只有一个聚集索引(类似字典字母顺序)
--非聚集索引的顺序跟数据的物理顺序无关,索引与数据存放在不同的物理区域,一个表可以有多个(类似字典偏旁部首)

--查看索引定义
EXEC SP_HELPINDEX TEST;
--TEST表的索引情况
SELECT * FROM sys.indexes WHERE object_id=object_id('TEST');

--修改索引名
EXEC SP_RENAME 'TEST.IDX_TONY2','IDX_TONY1';

--更新TEST表中全部索引的统计信息
UPDATE STATISTICS TEST;

--增加AGE字段
ALTER TABLE TEST ADD AGE INT NOT NULL DEFAULT 0;

--查看IO信息
SET STATISTICS IO ON;
SELECT * FROM TEST WHERE ID>4;
DBCC TRACEON(3604,2588);
DBCC IND(test,TEST,-1);

DBCC SHOW_STATISTICS(TEST,'IDX_ID2');

--复合索引
CREATE INDEX IDX_UNAME_AGE ON TEST(UNAME,AGE);
--覆盖索引
CREATE INDEX IDX_UNAME_AGE2 ON TEST(ID) INCLUDE(UNAME,AGE);

/*
如何选择:
1、覆盖索引可以使得索引键变化引起的波动更小。因为如果索引列发生变化,那么索引结构就要调整,如果包含列的值发生变化,整个索引的结构不会发生变化,只是包含列中的值进行更新而已
2、索引中的数据列越少,数据分布的统计维护的成本就越小
3、如果是频繁的写操作,一般索引列不要太多;如果是频繁大量数据读取,可以考虑把一些列包含在索引列
其实都是一种“空间换时间”的策略,提高查询速度
*/

重建单表的所有索引和数据库遍历所有表的索引

DBCC SHOWCONTIG(表名);

EXEC sp_helpindex 表名;

--单个表的所有索引重建
ALTER INDEX ALL ON 表名 REBUILD;


--重建指定数据库的所有表的所有索引
USE 数据库名
DECLARE @name varchar(100)
DECLARE tony_cursor CURSOR FOR
SELECT [name] FROM sysobjects WHERE xtype='u'
OPEN tony_cursor
FETCH NEXT FROM tony_cursor  INTO @name
WHILE @@FETCH_STATUS = 0 BEGIN
PRINT @name
DBCC DBREINDEX (@name, '', 90)
FETCH NEXT FROM tony_cursor  INTO @name END
CLOSE tony_cursor
DEALLOCATE tony_cursor

 

发布了46 篇原创文章 · 获赞 9 · 访问量 3657

猜你喜欢

转载自blog.csdn.net/weixin_41896770/article/details/100939372