Tot*_*ero 2 sql sql-server database-design
我需要在SQL中存储十亿个直方图.这些直方图具有相同的存储桶,但其计数可能有很大的变化,但是,大多数情况下,大多数存储桶都是0.
我最初的尝试是每个直方图有一行,其中每列代表一个桶.
我一直非常小心我的数据类型,但表仍然看起来超出了为它分配的存储空间.
我想知道在我必须要求更多硬件之前,是否有人在MS SQL中遇到了存储值范围(其中0是最常见的)的有效解决方案.
提前致谢.
TOT.
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)
这是一种典型的标准化模型,相对容易维护,加载和导出.