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
から選択する必要があり、その後、ActionHappened
とFullMessage
を返します。たとえば、私は
select ActionHappened, FullMessage
from #Info
where PartialMessage Like '%Activity D%'
と言ってもいいですが、もちろん各列の中でテーブルスキャンとソフトサーチはしません。
すべてのアイデアを高く評価しました。
ありがとうございました。
これらを 'thread'、' start'、 'activity'インデックスを作成することが不可能で連結された文字列に格納する代わりに、分解する必要があります。アトミシティは[最初の正規形](http://en.wikipedia.org/wiki/First_normal_form#Atomicity)の要件です。 –
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値をクエリできます。 –
私はテーブルスキーマを編集することができたらいいと思います。しかし、私はしません。それが私がここにいる理由です。 :) – Snowy