2014-03-18 48 views
3

我有在SQL表从被设计成一个iFix的SCADA系统保持报警数据如下:SQL触发VS其他选项性能

CREATE TABLE [dbo].[FIXALARMS](
    [ALM_ID] [int] IDENTITY(1,1) NOT NULL, 
    [ALM_NATIVETIMEIN] [datetime] NOT NULL, 
    [ALM_PHYSLNODE] [char](8) NOT NULL, 
    [ALM_TAGNAME] [varchar](32) NOT NULL, 
    [ALM_VALUE] [varchar](16) NOT NULL, 
    [ALM_MSGTYPE] [varchar](8) NOT NULL, 
    [ALM_DESCR] [varchar](128) NOT NULL, 
    [ALM_ALMSTATUS] [varchar](4) NOT NULL, 
    [ALM_ALMPRIORITY] [varchar](8) NOT NULL, 
    [ALM_ALMAREA] [varchar](32) NOT NULL, 
) 

的SCADA指定哪些列必须命名和数据类型并没有提供其他选项将数据分成多个表。很多时候,我会被迫采用这种格式的信息,因为我的很多查询都在使用多个像和字符串比较数据,这些数据确实应该是id'd。

现在,我想对此表进行规范化并将其分成多个带有键控关系的表,以便我可以节省数据库空间,查询性能并增加一些灵活性。

这是使用数据库触发器最好的实现吗?数据库的增长速度约为40Mb /天(〜300k行),而我缺乏SQL经验让我担心在添加条目时会给服务器增加额外的负载。相反,我应该使用一个代理来清理表格吗?什么是我可能不知道的其他选项?

+0

在我看问题之前,哪个SCADA系统是这样的?哪个行业......如果你不介意。 –

+1

iFix日记工厂 – cmwarre

+2

数据库正在以这样的速度增长的事实并不多说这个特定的表(或者当你谈论正常化时你想到的表格)有多快会增长。当你考虑触发器对性能的影响时,主要涉及到有问题的表。 –

回答

1

如果您不需要实时数据,请使用SSIS设置ETl进程以将数据转换为规范化形式。

如果您必须有实时数据,那么请使用触发器,但要非常小心地使用它们并确保它们处理数据集。不应该期望Sql服务器触发器只处理一行数据。您需要确保您的触发器代码的性能尽可能高,因为您在抓取数据时有很高的数据输入表。这意味着您需要阅读一本关于性能调优技术的好书,以便您了解避免使用哪些查询表单(如相关子查询),非sargable where子句,游标等。您也希望在负载下进行昂贵的测试以阻止问题。

1

触发器将增加一些处理开销并可能引入争用和事务锁定。如果复杂的查询不是针对最新的完整数据执行的,那么您可以使用定期调度的ETL过程来获取数据并翻译成更有用的形式。 您可以根据需要安排ETL每天或每几小时运行一次。

+0

更改数据捕获? –

+1

如果我试图针对完整的最新信息运行查询,那么使用ETL过程来移动信息是一种很好的做法,然后在与最新的原始视图结合的视图中对该信息运行复杂的查询数据? – cmwarre

+1

如果您打算使用ETL RAW数据,那么希望您不需要重新加入。 RAW数据听起来像是非结构化的,ETL过程可以将需要的内容复制到更适用于查询的结构中(3NF或星形模式)。您可能为了审计目的而将参考文件保留回原始数据,但您的3NF数据或星型模式的数据副本应该用于性能良好且易于维护的查询。您用于填充新清理结构的方法将取决于输出要求,实时触发器或计划批处理。 – crowne

1

假设你使用触发器,最有可能将传入的数据分为多个表,对吧? 这是一个可行的方法。 如果传入的数据与该表的模式匹配,则执行“常规”触发。考虑INSTEAD OF触发器,如果​​传入数据模式不完全符合您的模式。

在任何情况下,在您的触发器中,您必须在某些INSERT期间生成密钥,并在其他人重新使用它们。一些好的做法是让你的触发器业务逻辑免费 - 只做RDBMS的事情。还要仔细考虑如何生成和读回密钥 - 谨防范围污染。最后,考虑您的事务隔离级别并尽可能快地保持吞吐量。