最高效(存储空间)方式在SQL中存储直方图

Tot*_*ero 2 sql sql-server database-design

我需要在SQL中存储十亿个直方图.这些直方图具有相同的存储桶,但其计数可能有很大的变化,但是,大多数情况下,大多数存储桶都是0.

我最初的尝试是每个直方图有一行,其中每列代表一个桶.

我一直非常小心我的数据类型,但表仍然看起来超出了为它分配的存储空间.

我想知道在我必须要求更多硬件之前,是否有人在MS SQL中遇到了存储值范围(其中0是最常见的)的有效解决方案.

提前致谢.

TOT.

Cad*_*oux 5

CREATE TABLE Histogram (
    HistogramID BIGINT /* INT only goes to 2bn */ IDENTITY NOT NULL CONSTRAINT PK_Histogram PRIMARY KEY
    -- Other metadata like the date and time or whatever
)

CREATE TABLE Bucket (
    BucketID INT /* or smaller */ IDENTITY NOT NULL CONSTRAINT PK_Bucket PRIMARY KEY
    -- Other metadata like the range it applies to
)

CREATE TABLE HistogramValue (
    HistogramID BIGINT NOT NULL
    ,BucketID INT NOT NULL
    ,Counter BIGINT /* or smaller datatype */ NOT NULL
    ,CONSTRAINT PK_HistogramValue PRIMARY KEY (HistogramID, BucketID)
    ,CONSTRAINT FK_Histogram FOREIGN KEY REFERENCES Histogram(HistogramID)
    ,CONSTRAINT FK_Bucket FOREIGN KEY REFERENCES Bucket(BucketID)
)
Run Code Online (Sandbox Code Playgroud)

HistogramValue表将是稀疏.您可以将Bucket表格中的连接保留到HistogramValue表格中以获取特定的直方图,以获得"整个"直方图:

SELECT b.Range
       ,COALESCE(hv.Counter, 0) AS Counter
FROM Bucket b
LEFT JOIN HistogramValue hv
    ON hv.HistogramID = @HistogramID
    AND hv.BucketID = b.BucketID
Run Code Online (Sandbox Code Playgroud)

这是一种典型的标准化模型,相对容易维护,加载和导出.