2017-08-18 7 views
-1

ログサーバーから取得したすべてのサーバーのWindowsイベントログを含む単一のテーブルがありました。構造の整った大規模なSQLデータベースの作成

最初はこれで大丈夫でしたが、データを追加するほど遅くなりました...現在は数百万行にもなります。

だから私はそれが自分のテーブルに各サーバーを細分化して、より速く特定のクエリを作成する方が良いと思った。

問題は、すべてのサーバーでイベントを検索するとどうなりますか?

ここでは、テーブルを正しく設定する方法についていくつかアドバイスをしています。

以下は、 'server1'を実際の名前に置き換えて、各テーブルの構造をコピー&ペーストする方法です。私は、サーバーからのデータの列を添付しました

 
     USE [Events_Data] 
    GO 

    /****** Object: Table [dbo].[servername1] Script Date: 8/18/2017 8:48:59 AM ******/ 
    SET ANSI_NULLS ON 
    GO 

    SET QUOTED_IDENTIFIER ON 
    GO 

    CREATE TABLE [dbo].[servername1](
     [Message] [nvarchar](max) NULL, 
     [Id] [nvarchar](max) NULL, 
     [Version] [nvarchar](max) NULL, 
     [Qualifiers] [nvarchar](max) NULL, 
     [Level] [nvarchar](max) NULL, 
     [Task] [nvarchar](max) NULL, 
     [Opcode] [nvarchar](max) NULL, 
     [Keywords] [nvarchar](max) NULL, 
     [RecordId] [nvarchar](max) NULL, 
     [ProviderName] [nvarchar](max) NULL, 
     [ProviderId] [nvarchar](max) NULL, 
     [LogName] [nvarchar](max) NULL, 
     [ProcessId] [nvarchar](max) NULL, 
     [ThreadID] [nvarchar](max) NULL, 
     [MachineName] [nvarchar](max) NULL, 
     [UserID] [nvarchar](max) NULL, 
     [TimeCreated] [datetime] NULL, 
     [ActivityId] [nvarchar](max) NULL, 
     [RelatedActivityID] [nvarchar](max) NULL, 
     [ContainerLog] [nvarchar](max) NULL, 
     [MatchedQueryIDs] [nvarchar](max) NULL, 
     [Bookmark] [nvarchar](max) NULL, 
     [LevelDisplayName] [nvarchar](max) NULL, 
     [OpcodeDisplayName] [nvarchar](max) NULL, 
     [TaskDisplayName] [nvarchar](max) NULL, 
     [KeywordsDisplayNames] [nvarchar](max) NULL, 
     [Properties] [nvarchar](max) NULL 
    ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 

    GO 

は...各テーブルには、「マシン名」列を除いて非常に似ているテーブルがのイベントを保持するサーバに固有です。

 
Message,Id,Version,Qualifiers,Level,Task,Opcode,Keywords,RecordId,ProviderName,ProviderId,LogName,ProcessId,ThreadID,MachineName,UserID,TimeCreated,ActivityId,RelatedActivityID,ContainerLog,MatchedQueryIDs,Bookmark,LevelDisplayName,OpcodeDisplayName,TaskDisplayName,KeywordsDisplayNames,Properties 
Error message whatever,1000,,0,2,100,,3.60288E+16,302366,Application Error,,Application,,,servernameapp1.domain.com,,00:03.0,,,\\servernamelogs\d$\windows-logs\archive-forwardedevents-2017-04-01-05-03-29-167.evtx,,System.Diagnostics.Eventing.Reader.EventBookmark,Error,Info,Application Crashing Events,Classic,System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty System.Diagnostics.Eventing.Reader.EventProperty 

私はすべてのテーブルに対してクエリを実行できるだけでなく、構造化データベースの作成上の任意の助けいただければ幸いです!

+1

私は、それぞれのサーバーをそれ自身のテーブルに分割することをお勧めしません。何かあれば 'servers'のテーブルと' logs'のテーブルが必要です。次に、外部キー 'server_id'に基づいて' server'に 'log'出力を割り当てます。これにより、特定のサーバーのログだけを表示することができます。 –

+0

最も重要な3つのキーワード:*データ型*、* nullable *および* index *。そして、いいえ:これをいくつかのテーブルに分割しないでください! – Shnugo

+0

他の人が言ったように、テーブルを分割しないでください。ただし、通常は1つのサーバーのみを照会すると、これはパーティション化の典型的な使用例になります。 –

答えて

1

WOW。だから、多くの本と間違ったことが、スタートとして:

  1. 最も一般的に使用されるキー列(複数可)または人工的なキーに主キーとクラスタ化インデックスを作成します(この場合には、IDのように見える?)
  2. あなたのデータ型を変更してください... Varchar(MAX)は無限の長さの文字列です...おそらく、あなたのId列は、Intsとイベント文字列が合理的な最大長に制限されている必要があります。
  3. メイク必要な列を非null
  4. いずれにも非クラスタ化インデックスを作成/ソート/どこの列

は、各サーバーのテーブルを作成ないを行い参加。 ServerId列にインデックスを作成するだけです...

P.S.これらの列がすべて必要ですか?どのようにそれらを挿入していますか?彼らは単にオブジェクトの型を入力しているように見えます。最後の列のSystem.Diagnostics.Eventing.Reader.EventProperty実際の値を取得するには、おそらく.ToString()などが必要です。しかし、実際にこれらの列がすべて必要なのかどうかは疑問です。

+0

私は、このまさにまともな答えで誰かと同じ波の長さにいることを知ってうれしいです。 –

+0

合意! 1つの追加ポイントは、何らかの理由でサーバー(または日付やイベントの種類など)によってデータを細かく分割する必要がある場合、パーティションを使用して、データベースエンジンがあなたのための仕組みを担当するようにすることです。ほとんどの場合、まだ最後の手段です。 – LoztInSpace

関連する問題