2015-06-08 74 views
0

我目前正在制定相關的SCADA應用數據記錄,使用SQL Server 2012 Express中的一個解決方案。 SCADA應用程序被配置爲在SQL Server上執行存儲過程以推送數據庫中的數據。SQL Server Express的維護

數據流IMHO是相當重(1.4 - 每天1.9米行,平均長度爲43個字節,一些調整之後)。存儲數據的表在三列上有一個聚簇索引。現在我們的重點是儘可能緊湊地存儲這些數據,而不會產生太多的碎片(SELECTS現在不是主要的利益)。

目前DB佔地約250 MB(我已經預先分配5120 MB爲DB),並只保存此數據表中另一個表,可以忽略不計,和事務日誌。

我的問題是:

  1. 如何可以在這個數據庫我建立索引維護?作爲Express版我不能使用SQL Server代理。我將使用任務計劃程序,但是應該使用重建還是重新組織?建議使用100以下的填充因子?我應該配置任務調度程序以便間隔調用,以便任務只能重新組織(碎片低於30%)?重建日益昂貴的操作(第x天索引是否重建,第x + 1天是否需要更少的時間進行重建,而不是僅在兩天內重建一次),在達到最大存儲空間之後?

  2. 同樣具有的SQL Server Express版本限制了數據容量爲10 GB。我試圖儘可能多地擠壓這個數量。我計劃建立一個環形緩衝區 - 我可以建立數據庫,以便以後我在事件得到記錄消息更改數據庫擴展等失敗的存儲過程將使用上最早的值更新爲插入數據的手段(我的擔心是,即使更新將需要一些新的空間,在那一點上,我將不得不積極收縮數據庫)?

  3. 我還考慮過使用壓縮的win分區來存儲數據庫的文件,並使用免費的無限數據庫(如MySQL)作爲存儲目的,而SQL Server只作爲前端 - SCADA應用程序必須配置爲SQL Server。這值得考慮嗎?

  4. 爲了優化插入我使用一個全局臨時數據庫,它可容納多達1k行(用序列計數)作爲緩衝區的一種形式,然後將數據推送到主表並截斷臨時表。這是否有效?我是否應該考慮效率交易 - 我試圖在存儲過程中開始一個命名事務,如果它不存在,並且如果序列達到1k,則提交tran?增加10k行的閾值是否導致碎片減少?

如果你認爲我不熟悉數據庫,那麼你是對的。 ATM只有一個使用SQL Server SCADA應用,但實際應用中設置冗餘所以在最後一切都將採取兩次的資源(和SCADA應用程序的每個實例都將獲得自己的存儲)。另外我需要提到的是,我不能只升級到SQL Server的高級版本,但我可以自由使用任何一款免費軟件。

+0

你在一個問四個問題。請在一篇文章中提出一個問題。 –

回答

0

大部分的答案跨越了4個數字,所以我只是把反應在子彈的幫助:

  • 指標或許應該保持,但在你的情況下,他們可以讓人望而卻步。除了表中的聚簇索引外,索引(非聚簇類型)通常用於查詢數據。

  • 隨着應用程序儘可能多地插入你描述的內容,我將設計一個兩步過程。首先,一個沒有非聚集索引的基本表接受插入。其次,你會查詢數據的表格。然後,根據您的查詢需求,使用計劃任務調用存儲過程來從表1到表2傳輸事務性數據(也可以在傳輸到表2後從表1中移除原始數據 - 這絕對應該是在交易中完成)。

    • 否則,每個插入不僅要插入表的原始數據,還要插入索引的記錄。

    • 由於插入的數量,應該避免使用高填充因子(可能設置爲小於50%)。高(100%)填充因子意味着非聚簇索引不會在表的頁面中留下任何空間來實際插入記錄。您插入的每條記錄都意味着表格的頁面必須重新組織。填充因數高會在表格的每個頁面留出空間,因此可以將新記錄插入索引中,而無需重新組織它們。

  • 爲了優化您的插入,我將使用上述兩個步驟將記錄直接插入第一個表中。如果您可以讓您的應用程序使用SQL批量複製,那麼我也會研究這一點。

  • 要優化空間,你可以探索的幾件事情:

    • 你需要的所有實時訪問的記錄?也許你可以與業務合作來創建一個數據保留策略,在該策略中,您將數據庫中的每條記錄保存24小時,然後按分鐘或某種內容保存1周,每小時保存2周,每日保存6個月等。可以通過每日備份增強此功能,以便在需要時可以恢復整個特定日期。
  • 考慮將數據庫級別從完全恢復更改爲簡單或批量記錄。這可以使用您可能正在執行的批量插入操作來控制事務日誌。

  • 你必須努力工作來管理事務日誌。頻繁檢查點和事務日誌備份。

+0

雖然服務器代理不工作,但您可以使用批處理文件來安排您的過程或任何sql命令,並從Windows任務計劃程序運行它。 – Tim3880

+0

不幸的是,使用sql批量複製是,據我所知,不是一個選項,因爲這是一個編程方法,而scada應用程序是一個封閉的系統。我只能指向哪個服務器推送數據和什麼數據庫與憑據等使用全球臨時數據庫不可接受(它沒有任何索引)?我的意圖不是爭辯,而是要真正學到一些東西。 – Kalibr

+0

tempdb很好,但要確保你的tempdb在其配置中遵循最佳實踐(只是谷歌「tempdb最佳實踐」)。您至少要設置一個最小的大小,以便不會自動增長 - 只要您的db實例重新啓動,tempdb就會調整爲默認大小)。您還需要設置至少4個數據文件(通常每個CPU核心至少1個)以最大限度地減少對tempdb資源的爭用。還有其他很多好的做法,你會發現的。 –