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

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

インデックスの作成日とか、更新日とか取得してみる

今回やることを説明してみる

 最近、出張が多く記事を書く暇が中々とれないので、JAL Sky Wifi とかで移動中に書いてしまうことが多いです。
f:id:koogucc11:20151101172754p:plain

 ただ、JAL Sky Wifi は通信が非常に遅いので、画像とかアップするには結構つらい感じです....もう少し通信速度アップしてくれないかなぁ...ryuchan.hatenablog.com
 
 さて、今回は SQL Server で ALTER INDEX などをした場合に、更新日などを取得する方法です。非クラスター化インデックスの更新日とか取得できないです。いままで、sys.objects から取得できると勘違いしていました。
  

使用する環境を説明してみる

 最近、パワーアップした Lenovo を使用します。環境は、Windows 10,SQL Server 2016 CTP2.3 です。データベースは、Adventureworks を使用します。ryuchan.hatenablog.com

 CTP 3.0 にはまだしてません...


早速試してみる

 インデックスの生成、更新、削除は、トレースから取得することが可能です。SQL Server Profiler で取得してみましょう。Objects イベントを設定し、トレースを実行します。
 f:id:koogucc11:20151101155307p:plain

  • Object:Altered イベント クラス
    Object:Altered イベント クラスは、ALTER INDEX、ALTER TABLE、ALTER DATABASE などのステートメントによって、オブジェクトが変更されたことを示します。このイベント クラスは、たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが変更されているかどうかを判断するために使用できます。
    Object:Altered イベント クラスは常に 2 つのイベントとして発生します。最初のイベントは開始フェーズを示します。2 番目のイベントはロールバック フェーズまたはコミット フェーズを示します。
  • Object:Created イベント クラス
    Object:Created イベント クラスは、CREATE INDEX、CREATE TABLE、CREATE DATABASE などのステートメントによって、オブジェクトが作成されたことを示します。
    このイベント クラスは、たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが作成されているかどうかを判断するために使用できます。 LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、またはアクセスしたユーザーの名前を特定できます。
  • Object:Deleted イベント クラス
    Object:Deleted イベント クラスは、DROP INDEX ステートメントや DROP TABLE ステートメントなどによって、オブジェクトが削除されたことを示します。たとえば、頻繁に一時ストアド プロシージャを作成する ODBC アプリケーションによって、オブジェクトが削除されているかどうかを判断するために使用できます。
    Objects イベント クラスに加えて、既定の LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、またはアクセスしたユーザーの名前を特定できます。LoginName データ列と NTUserName データ列を監視することで、オブジェクトを作成、削除、または変更したユーザーの名前を特定できます。

 SQL Server Management Studio で下記の ALTER 文を実行します。

USE AdventureWorks2012
GO

CREATE NONCLUSTERED INDEX [IX_SalesOrderDetail_ProductID] ON [Sales].[SalesOrderDetail]
(
    [ProductID] ASC
)
INCLUDE (
    [SalesOrderID],
    [SalesOrderDetailID],
    [CarrierTrackingNumber]) WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = ON, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = PAGE) ON [PRIMARY]

GO

f:id:koogucc11:20151101170754p:plain

 SQL Server Profiler に下記の通り出力されます。
f:id:koogucc11:20151101171137p:plain
f:id:koogucc11:20151101171148p:plain

 下図の通り、X_SalesOrderDetail_ProductID に対して、2015-11-01 17:07:21.567 に変更が開始され、2015-11-01 17:07:21.570 にコミットされたことが判断できます。
f:id:koogucc11:20151101171554p:plain

おわりになにか言ってみる

 トレースから取得できても、何かしら作りこまないと業務上使えませんね。(あ、これ個人的意見なので。)インデックスの作成日、更新日とかもってくれないかなぁ。あと、変更履歴とか。ニーズないのかな?