3

SQL Server 2008 R2 Enterprise Edition を使用しています。

私たちは、MetMasts と呼ばれるものから気象データを測定しています。基本的に、これは多くの装備を備えたマストです。マストのさまざまな位置にある風速計(風速用)、温度計、気圧。私たちは毎秒測定します。

そして、あまりにも多くのディスク容量を占有します。この機器の次世代は、毎年 10 GB 以上を生成します。そして、これらの数は1000を超えます。

現在のテーブル デザインは次のようになります。

    CREATE TABLE #MetMast (
    MetMastID INT NOT NULL IDENTITY(1,1), 
    MetMastName NVARCHAR(100), 
    CountryID INT, 
    InstallDate DATE
)
    CREATE TABLE #MetMastData (
        MetMastDataID BIGINT NOT NULL IDENTITY(1,1),
        MetMastID INT NOT NULL,
        MeasuredAt DATETIME2(0) NOT NULL,
        Temperature REAL NULL,
        WindSpeedAt10m REAL NULL, 
        WindSpeedAt30m REAL NULL,
        AirPressure REAL NULL,
        OneHundredMoreColumns VARCHAR(200),
     CONSTRAINT PK_MetMastData PRIMARY KEY CLUSTERED 
    (
        MetMastID ASC,
        MeasuredAt ASC
    ))
    WITH (DATA_COMPRESSION = ROW) 
    -- ON a file group, with table partitioning
    ALTER TABLE #MetMastData WITH NOCHECK ADD CONSTRAINT FK_MetMast_MetMastID FOREIGN KEY (#MetMast) REFERENCES #MetMast(MetMastID)

データは 1 回書き込み、何度も読み取られます。
私たちはデータウェアハウスでそれを使用しています。典型的な質問は次のとおりです。MetMast に従って、温度が 20 度を超えているときに、WindSpeedAt10m と WindSpeedAt30m の間に 2 m/s の差がある回数を数えます。

SELECT MetMastId, COUNT_BIG(*) FROM #metMastData 
WHERE temperature>20 AND ABS(WindSpeedAt10m-WindSpeedAt30m) >2 
GROUP BY MetMastID

将来的には、わずかなデータ損失は許容されます。
ここでは、データの非可逆圧縮について説明しています。10% の精度で測定する場合、1% のように、フィールドごとに許容誤差を定義する必要があることはわかっています。
サウンド ファイル (MP3 は非常に大きい) で機能したので、私たちにも機能する可能性があります。

しかし、これはどのように行われますか?
どのテーブルデザインを選ぶべきですか?
データベース テーブル内のデータの非可逆圧縮を開始するにはどうすればよいですか?

よろしくお願いします、

ヘンリック・スタウン・ポールセン

4

2 に答える 2

3

データ ポイントごとに、保存する必要がある精度を考慮してください。

REAL は、各行に 4 バイトを使用します。WindSpeed の小数点以下の桁数をすべて削除できる場合は、おそらく tinyint (1 バイト、1 ~ 255) を使用できます。ある程度の精度が必要な場合は、代わりに smallint を使用して、実際の値に 100 を掛けることができます。

150,55 m/s = 15055
3,67 m/s = 367

これにより、行ごとに 2 バイトが節約され、ある程度の精度が保存されますが、ある時点で失われます。これらの列がかなり多いように見えるので、列ごとに 2 バイトの節約はかなりの量になります。

MetMastDataID には 8 バイトの bigint があります。必要ですか?すべてが MetMastID と MeasuredAT によって照会されるのではありませんか? これを削除すると、8 バイト節約できます。ただし、クラスター化されたキーがシーケンシャルではなくなるため、断片化が発生するため、最適化が必要になります。これはアーカイブ/OLAP システムのように聞こえるので、大きな問題にはなりません。

編集: MetMastDataID でクラスター化されていないことに気付いたので、断片化はこれから変わりません。質問は、MetMastDataID を何かに使用したことがありますか?

さらに、すべての可変長列を回避できる場合は、実際の可変長データ自体を含まずに、行ごとにレコードオーバーヘッドの可変長列ごとに 2 バイト + 2 バイトを節約できます。

于 2011-05-16T10:44:52.490 に答える
1

非可逆圧縮は、目や耳で違いを判断する人間の物理的な可能性に基づいています。例としては、Mp3 または JPEG 非可逆圧縮があります。あなたの場合、オーディオ/ビデオデータではなく数字で操作するため、このような非可逆圧縮は意味がありません。可逆圧縮を実装するには、CLR 関数を使用できます。例は次のとおりです: http://www.codeproject.com/KB/database/blob_compress.asp

于 2011-05-16T11:26:18.053 に答える