2011-09-17 8 views
-1

SQL Server 2008を実行すると、アプリから数百万行のログ情報ダンプを含むテーブルがあります。私は関連する情報を得るために最良のインデックスを書く方法を理解しようとしています。サブストリングのSQL Server最適インデックス?

表はこのようになります。単なるサンプルですが、実際のメッセージデータは長いです。

CREATE TABLE #Info(
    [infoID] [int] IDENTITY(1,1) NOT NULL, 
    [ActionHappened] [datetime] NOT NULL, 
    [PartialMessage] [nvarchar](1500) NULL, 
    [FullMessage] [nvarchar](max) NULL, 
CONSTRAINT [pk_info] PRIMARY KEY CLUSTERED([infoID] ASC) 
     WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, 
      ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]) ON [PRIMARY] 

Insert Into #Info Values (GETDATE() , 'Thread:05;D:Start;Msg:Activity A' , 'Thread:05;D:Start;Msg:Activity A abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv') 
Insert Into #Info Values (dateadd(minute , 3 , GETDATE()) , 'Thread:05;D:Start;Msg:Activity B' , 'Thread:05;D:Start;Msg:Activity B abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv') 
Insert Into #Info Values (dateadd(minute , 6 , GETDATE()) , 'Thread:05;D:Start;Msg:Activity C' , 'Thread:05;D:Start;Msg:Activity D abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv') 
Insert Into #Info Values (dateadd(minute , 9 , GETDATE()) , 'Thread:05;D:Start;Msg:Activity D' , 'Thread:05;D:Start;Msg:Activity E abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv') 
Insert Into #Info Values (dateadd(minute , 15 , GETDATE()) , 'Thread:05;D:Start;Msg:Activity E' , 'Thread:05;D:Start;Msg:Activity F abcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyvabcdegghijklmnopqrstuvwxyv') 

私は2番目のセミコロンの前に、すべてを無視して、PartialMessageから選択する必要があり、その後、ActionHappenedFullMessageを返します。たとえば、私は

select ActionHappened, FullMessage 
from #Info 
where PartialMessage Like '%Activity D%' 

と言ってもいいですが、もちろん各列の中でテーブルスキャンとソフトサーチはしません。

すべてのアイデアを高く評価しました。

ありがとうございました。

+6

これらを 'thread'、' start'、 'activity'インデックスを作成することが不可能で連結された文字列に格納する代わりに、分解する必要があります。アトミシティは[最初の正規形](http://en.wikipedia.org/wiki/First_normal_form#Atomicity)の要件です。 –

+0

Totalyはpreviosの回答(+1)に同意します。別のオプションはXMLでもかまいません。 PartialMessageをXMLフィールドに変換し、[XMLインデックス](http://msdn.microsoft.com/en-us/library/ms345121%28v=sql.90%29.aspx)を作成することもできます[SQL Server 2005のXMLデータ型のパフォーマンス最適化](http://msdn.microsoft.com/en-us/library/ms345118%28v=sql.90%29.aspx))。最後に、[xquery](http://technet.microsoft.com/en-us/library/ms189075.aspx)を使用してXML値をクエリできます。 –

+0

私はテーブルスキーマを編集することができたらいいと思います。しかし、私はしません。それが私がここにいる理由です。 :) – Snowy

答えて

1

Martinが示唆するように、フィールドを分割するためにインデックス付きビューを作成できますか?次のように動作するかもしれませんが、フィールドのサイズによっては、それは有益ではないかもしれません。

  • フィールドを作成します。どちらのPartialMessageReversePartialMessageフィールド
  • にインデックスを追加REVERSE(partialMessage)
  • でこのフィールドを移入するためにトリガーを使用したReversePartialMessage
  • と呼ばれます

    WHERE句を作成する

    どこPartialMessage「と同様の活動D%」およびReversePartialMessageのように「D ytivitcA%」は

はしかし、PartialMessageの大きさで、私は、これらのインデックスの努力が多くを得るかどうかわかりません。フィールドを短縮できれば、これらのインデックスは実用的かもしれません。インデックスを作成する場合は、実際に使用されているかどうかを確認するために実行プランにアクセスしてください。オプティマイザは、テーブルスキャンがインデックスよりも効率的であると判断することがあります。 2つのインデックスの出力、特にそのような大きなキー値をマージする作業は、大きな利益をもたらさないかもしれません...

関連する問題