2014-03-18 81 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的事情。還要仔細考慮如何生成和讀回密鑰 - 謹防範圍污染。最後,考慮您的事務隔離級別並儘可能快地保持吞吐量。