SQLSERVERインデックスの概要

テストテーブルを作成する(INT ID、UNAME VARCHAR(10));
-非クラスタ化インデックス
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%であるべきで、次に高い外部フラグメンテーションがある
ページごとに使用可能なバイトの平均数:スキャンページ上で使用可能なバイト数の平均値、高い説明が内部断片化があるが、あなたは内部フラグメンテーションがある場合は、この番号を使用することを決定する前に、あなたはフィルファクター(フィルファクター)を考慮すべきである
平均ページ密度(フル):各ページで利用可能な平均反対番号、内部断片化のパーセンテージを指定するバイト数の低いパーセンテージ
* /

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