2017-01-11 35 views
3

是否可以通過用單個binary(n)n爲50 x 4)替換(比如說)50 float列來提高SQL Server 2008 R2(和更高版本)插入性能?SQL Server性能:50列vs單個二進制/ varbinary

我會,使用一個固定大小的binary(n)應該提高性能(數據量是相同的,同來處理所有的列和更短的SQL查詢需要更少的工作),但很多網站建議不要使用binary列,所以我想看看是否真的有問題使用此?

此外,問題是表非常非規範化,而且並非所有列通常都用值填充,因此varbinary(n)在很多情況下允許我減小行大小。有時候只有一列被填滿,但是平均只有10列。

然後第三個問題是,如何進一步取代(說)5行x 50 float32列與單個varbinary(5*50*4)

所以它會很酷得到一些見解:

  1. binary(200)更換50分float列1行;
  2. 替換1行50 x float單個varbinary(204)(幾個字節的標誌/長度信息) - 節省空間時,列未使用;
  3. 替換5行50 x float單個varbinary(1024)(幾個字節的標誌/長度信息)。

在任何情況下總是讀取整行。

(更新)

爲了澄清,正被存儲的數據爲:

Timestamp_rounded Value_0ms Value_20ms Value_40ms ... Value_980ms 
2016-01-10 10:00:00 10.0  11.1  10.5  ... 10.5 

我總是讀取整個行,初級聚集鍵是第一列(時間戳),和我將永遠不必通過任何其他列查詢表。

標準化的數據顯然會有一對Timestamp/Value對,其中Timestamp然後將具有毫秒的精度。但之後我將不得不存儲50行兩列,而不是1行(Timestamp + BLOB)。

+6

在單個字段中存儲多個值幾乎總是錯誤的決定。 – UnhandledExcepSean

+0

你以後想怎麼做?你想怎麼讀/操作這個*我是一個多值二進制的東西*? – Shnugo

+0

這些漂浮物是在一秒鐘內測量的,我總是一次存儲並閱讀它們。所以我的應用程序可以輕鬆地序列化/反序列化這些列,如果這將提高插入性能。我只希望能夠儘可能快地存儲 – Lou

回答

1

作爲一個實驗,我嘗試了兩種不同的方法來比較它們。

我發現經過一些調整後,二進制版本比50 col版本快了大約3倍。

這種情況是非常具體的,我的測試只測試了一些非常具體的東西。任何與我的測試設置的偏差都會對結果產生影響。

如何作出測試

對於50山坳版本我有我所有的填充與float.MaxValue 50個爲空的浮動列。

對於二進制版本,我有一列。該列的值由50xfloat.MaxValue + "|"的字符串構成,全部連接成一個長字符串。該字符串然後轉換爲byte []以存儲在表中。

這兩個表都是沒有索引或約束的堆。

我的測試代碼可以在這裏https://github.com/PeterHenell/binaryBulkInsertComparison

發現我跑的測試,SQL Server上的SSD驅動器的6核心工作站2014年開發版。

+0

非常感謝,這回答了我的問題。我可能會用稍微更高效的編碼重複測試(即可空的float32必須適合33位,可能稍微低一些壓縮,而簡單的'string.Format'具有ASCII字符分隔符通常會導致超過10個字節的數據)。這意味着我可以將幾行數據合併到一個blob中,所以我預計在這種情況下可以提高〜10倍。 – Lou

5

這是一個不好的的想法。具有50個4字節的列與具有200個字節的一列相比,消除了爲這50列中的任何一列優化查詢的任何希望。首先,從「經典」的SQL Server POV:

  • 您消除下推謂詞和掃描時間過濾
  • 您消除索引可能性
  • 您消除數據純度檢查(爲花車特別重要,因爲並不是所有的位模式都是有效的浮點數!)
  • 您消除列統計基於成本的優化

當你走得更 '現代',並開始考慮SQL Server的較新的選項:

所有這些都沒有考慮到你試圖查詢數據的同伴對你造成的痛苦。

問題是表格非常規化,而且並不是所有的列都用值來填充,所以varbinary(n)可以讓我在很多情況下減少行的大小。有時候只有一列被填滿,但是平均只有10列。如果數據是追加只

ALTER TABLE <your table> REBUILD PARTITION = ALL 
    WITH (DATA_COMPRESSION = ROW); 

,很少更新/刪除和大多數查詢分析,然後更好地利用columnstores:

然後使用行壓縮存儲。由於SQL Server 2016 SP1列存儲are available across every SQL Server edition

+0

謝謝,你的評論正是我所期望的(基本上是我在互聯網上閱讀的內容)。但問題是,我只會查詢第一列('Timestamp'),從來沒有任何其他列,並總是一次讀取每一行(我已更新我的問題)。所以我知道我*消除了什麼*(基本上,我不需要的東西:可以對這50列進行索引和保持統計),但我想看看我在性能方面獲得的*。 – Lou

+0

1.閱讀http://rusanu.com/2014/02/24/how-to-analyse-sql-server-performance/。 2. **識別你的botleneck。 3.解決問題。 –

相關問題