都内で働くSEの技術的なひとりごと / Technical soliloquy of System Engineer working in Tokyo

都内でサラリーマンやってます。SQL Server を中心とした (2023年からは Azure も。) マイクロソフト系(たまに、OSS系などマイクロソフト以外の技術も...)の技術的なことについて書いています。日々の仕事の中で、気になったことを技術要素関係なく気まぐれに選んでいるので記事内容は開発言語、インフラ等ばらばらです。なお、当ブログで発信、発言は私個人のものであり、所属する組織、企業、団体等とは何のかかわりもございません。ブログの内容もきちんと検証して使用してください。英語の勉強のため、英語の

依頼された事をブログに書いてみる -その1-

 Azure のポータルにこんな表示がでるようになりました。新しい Azure ポータル使ったことなかったな。なれれば新しいポータルも使いやすそうですね。
f:id:koogucc11:20151203094727p:plain

 今日はお休みですが、仕事してますww 仕事の合間に依頼事項(すごい簡単なこと)を記事にしてみたいと思います。インデックスをリビルドして、圧縮もするというものです。(この前も書いたような....)SQL Server 2008 向けなので、注意が必要です。XML インデックス、空間インデックスおよびラージ オブジェクト データ型 (image、text、ntext、varchar(max)、nvarchar(max)、varbinary(max)、および xml) の列が含まれる場合は、REBUILD WITH ONLINE = ON は使用できません。(そうだったなぁ....)下記のような感じですかね。(あ、SQL Server 2008 向けに作りましたが、2008 で検証してませんよ。)

DECLARE @schema_name     NVARCHAR(500)
DECLARE @table_name      NVARCHAR(500)
DECLARE @index_name      NVARCHAR(500)
DECLARE @c_count         INT
DECLARE @msg             NVARCHAR(500)
DECLARE @ddlstatement    NVARCHAR(500)

DECLARE REBUILD_INDEX_LIST CURSOR FOR
SELECT
    s.name,
    t.name,
    i.name,
    cc
FROM
    sys.tables t
    INNER JOIN
        sys.schemas s ON
        t.schema_id = s.schema_id
    INNER JOIN
        sys.indexes i ON
        t.object_id = i.object_id
CROSS APPLY
(
    SELECT 
        COUNT(c.name)
    FROM 
        sys.columns c
        INNER JOIN sys.types ty ON
            c.system_type_id = ty.system_type_id
    WHERE
        c.object_id = t.object_id AND
        (ty.name IN ('image','text','ntext') OR c.max_length = -1)
) AS ca(cc) 
WHERE 
    NOT EXISTS (SELECT 
                    object_id 
                FROM
                    sys.fulltext_indexes 
                WHERE 
                    object_id = i.object_id AND 
                    unique_index_id = i.index_id)  AND
    i.name IS NOT NULL AND 
    t.is_ms_shipped = 0
ORDER BY
    s.name,
    t.name,
    i.index_id

OPEN REBUILD_INDEX_LIST
FETCH NEXT FROM REBUILD_INDEX_LIST into @schema_name,
                                        @table_name,
                                        @index_name,
                                        @c_count
WHILE @@FETCH_STATUS =0 
BEGIN
    IF @c_count > 0
        BEGIN
            SET @ddlstatement = 'ALTER INDEX '+ @index_name + ' ON ' + @schema_name + '.' + @table_name + 
                                ' REBUILD PARTITION = ALL WITH (ONLINE = OFF, DATA_COMPRESSION = PAGE, SORT_IN_TEMPDB = ON )'
	END
    ELSE
        SET @ddlstatement = 'ALTER INDEX '+ @index_name + ' ON ' + @schema_name + '.' + @table_name + 
                            ' REBUILD PARTITION = ALL WITH (ONLINE = ON, DATA_COMPRESSION = PAGE, SORT_IN_TEMPDB = ON )'
    PRINT @ddlstatement
    PRINT 'GO'
    FETCH NEXT FROM REBUILD_INDEX_LIST into @schema_name,
                                            @table_name,
                                            @index_name,
                                            @c_count
END

CLOSE REBUILD_INDEX_LIST
DEALLOCATE REBUILD_INDEX_LIST

 

  • image,text,ntext および max 指定されているものは ONLINE = OFF
  • XML,空間インデックスもONLINE = OFF
  • フルテキストは時間がかかるので除外(ご要望により)
  • SQL Server Management Studio のメッセージ部に ALTER 文を出力

上記の通りですが、いかがでしょうか?

bgrks!

Bing Search

Bing Search