【发布时间】:2018-01-27 06:11:48
【问题描述】:
我有一个表,其中包含我们服务器的所有 Windows 事件日志(从日志服务器中提取)。
一开始还可以,当我往里面放更多数据时,它变得越慢……现在是几百万行。
所以我认为最好将每台服务器分解成自己的表,这样可以更快地进行特定查询。
问题是,如果我想在所有服务器上搜索事件怎么办?
所以我来这里是为了获得一些关于如何正确设置我的桌子的建议。
下面是 CREATE TO.. 复制和粘贴每个表的结构,将“server1”替换为实际名称。
使用 [Events_Data] 走 /****** 对象:表 [dbo].[servername1] 脚本日期:8/18/2017 8:48:59 AM ******/ 设置 ANSI_NULLS ON 走 设置 QUOTED_IDENTIFIER ON 走 创建表 [dbo].[servername1]( [消息] [nvarchar](max) NULL, [Id] [nvarchar](最大值)NULL, [版本] [nvarchar](max) NULL, [限定符] [nvarchar](max) NULL, [级别] [nvarchar](最大值)NULL, [任务] [nvarchar](最大)NULL, [操作码] [nvarchar](max) NULL, [关键词] [nvarchar](max) NULL, [RecordId] [nvarchar](最大值) NULL, [提供者名称] [nvarchar](最大值)NULL, [ProviderId] [nvarchar](max) NULL, [LogName] [nvarchar](最大值)NULL, [ProcessId] [nvarchar](max) NULL, [ThreadID] [nvarchar](max) NULL, [机器名] [nvarchar](最大值)NULL, [用户 ID] [nvarchar](最大) NULL, [时间创建] [日期时间] NULL, [ActivityId] [nvarchar](最大值)NULL, [RelatedActivityID] [nvarchar](max) NULL, [ContainerLog] [nvarchar](max) NULL, [MatchedQueryIDs] [nvarchar](max) NULL, [书签] [nvarchar](max) NULL, [LevelDisplayName] [nvarchar](最大值)NULL, [OpcodeDisplayName] [nvarchar](最大值) NULL, [TaskDisplayName] [nvarchar](最大值)NULL, [KeywordsDisplayNames] [nvarchar](最大值)NULL, [属性] [nvarchar](max) NULL ) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY] 走我已附加了来自服务器的一行数据...每个表都非常相似,除了“机器名”列特定于该表为其保存事件的服务器。
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,关键字显示名称、属性 任何错误消息,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,错误,信息,应用程序崩溃事件,经典,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任何有关创建结构良好的数据库的帮助,我都可以查询所有表,我们将不胜感激!
【问题讨论】:
-
我不认为将每个服务器分解成自己的表是明智的。如果有的话,你应该有一张
servers的表格和一张logs的表格。然后根据外键server_id将log输出分配给server。这将允许您仅显示特定服务器的日志。 -
最重要的三个关键字:data type、nullable和index。不:不要把它分成几个表!
-
就像其他人说的,你不应该拆分表。但是,如果您通常只查询一台服务器,那么这将是一个典型的分区用例。
-
感谢您的提示,我必须获取所有信息以用于审计目的,我绝不是数据库工程师,我只是想勉强度日并学习我能做的。我将考虑添加您提交的一些更改。再次感谢!
-
阅读一本关于信息建模和数据库设计的书。请就具体问题提出具体问题。这太宽泛了。
标签: sql database normalization