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

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

インデックスの圧縮をしないといけないので、出張帰りに作ってみた

 久しぶりの投稿です。香川に出張で昨日の夜、4,5年ぶりに鶴丸 (うどんやさんです。) に行ってきました。
f:id:koogucc11:20151020232935j:plain

 下記のサイトにも書いてありますが、カレーうどんが美味しいです。香川に来たら、是非お試しあれ!www.shikoku-np.co.jp

「飲んだ後にはラーメン」という通説をくつがえす、うどん大国・讃岐ならではの現象が“夜うどん”。なぜか夜中にうどんが食べたくなる…。そんな讃岐人の胃袋を満たしてくれるお店が、高松市古馬場町の「鶴丸」。午後8時の開店直後は観光客、時間が下がると仕事や飲み会帰りの地元客を中心に、一晩中客足の途絶えない人気店です。
 数あるメニューの中でも、うどんファン御用達の一杯が「カレーうどん」。深夜にカレー?、と違和感を感じたのもつかの間、豊かなカレーの香りに食欲は急上昇!。ほんのり甘いのに後口はピリリと辛い独特の味わいは、ご主人・鶴見康夫さん特製のスパイスによるもの。のど越し抜群の麺、シャキシャキの玉ネギとの相性もバッチリで、どんどんはしが進むから驚きです。
 客席からは麺の打ち場が見渡せ、いつでも打ちたて麺を出してくれるのも嬉しい限り。「大変ではあるけど、徹底的にお客さん目線で考えたらこのやり方になったね」と鶴見さん。味はもちろん、ご主人にほれ込むリピーターが多いというのも納得です。ぜひあなたの目と舌で確かめて!

 さて、本題に入りましょう。今週作業があるので、その準備を出張帰りにささっとやってみました。早速、AdventureWorks データベースで試してみましょう。

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

DECLARE REBUILD_INDEX_LIST CURSOR FOR
SELECT
    s.name,
    t.name,
    i.name
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 
	sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(s.name + '.' + t.name), i.index_id, NULL, 'DETAILED') dips
WHERE
    dips.index_level = 0 AND
    dips.alloc_unit_type_desc = 'IN_ROW_DATA' AND 
    i.name IS NOT NULL AND
    dips.index_type_desc IN ('CLUSTERED INDEX','NONCLUSTERED INDEX') AND
    dips.avg_fragmentation_in_percent >= 50
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

WHILE @@FETCH_STATUS =0 
BEGIN
    SET @ddlstatement = 'ALTER INDEX '+ @index_name + ' ON ' + @schema_name + '.' + @table_name + 
                        ' REBUILD PARTITION = ALL WITH (ONLINE = ON, DATA_COMPRESSION = PAGE, SORT_IN_TEMPDB = ON )'

    SET @msg = 'REBUILD START- ' + RTRIM(CAST(SYSDATETIME() AS NVARCHAR(30)))
    RAISERROR (@msg, 0, 1) WITH NOWAIT
    RAISERROR (@ddlstatement, 0, 1) WITH NOWAIT
	
    EXECUTE(@ddlstatement)

    SET @msg = 'REBUILD END- ' + RTRIM(CAST(SYSDATETIME() AS NVARCHAR(30)))
    RAISERROR (@msg, 0, 1) WITH NOWAIT

    FETCH NEXT FROM REBUILD_INDEX_LIST into @schema_name,
                                            @table_name,
                                            @index_name
END

CLOSE REBUILD_INDEX_LIST
DEALLOCATE REBUILD_INDEX_LIST

f:id:koogucc11:20151021160219p:plain
 ※適当に書いたので、今日の夜にでもブラッシュアップしよーっと。

 圧縮できているか、確認してみましょう。compressed_page_count が増加していることが判断できます。

SELECT
    s.name,
    t.name,
    i.name,
    dips.compressed_page_count
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
    INNER JOIN 
	sys.data_spaces ds ON 
        ds.data_space_id = i.data_space_id
    LEFT OUTER JOIN
        sys.partitions p ON
        t.parent_object_id = p.object_id
    CROSS APPLY 
        sys.dm_db_index_physical_stats(DB_ID(), OBJECT_ID(s.name + '.' + t.name), i.index_id, NULL, 'DETAILED') dips
WHERE
    dips.index_level = 0 AND
    dips.alloc_unit_type_desc = 'IN_ROW_DATA' AND 
    i.name IS NOT NULL AND 
    dips.index_type_desc IN ('CLUSTERED INDEX','NONCLUSTERED INDEX')
ORDER BY
    s.name,
    t.name,
    i.index_id

f:id:koogucc11:20151021153445p:plain

 ※最近、ネタがないし、新しいこともできない状態なのでこーゆー記事になってしまいました。そろそろ、新しいこともやんないとなー。CTP 3.0 でたら真面目にみてみるか。

アレルギーが最近ひどい。薬買わないと。

ミニPOP ★ 大野智 「アレグラ」

ミニPOP ★ 大野智 「アレグラ」