jre*_*50z 5 t-sql data-warehouse sql-server-2008-r2
在使用SQL Server 2008 R2扩展数据仓库时,作者建议使用格式为YYYYMMDD的整数日期键作为事实表的聚簇索引,以帮助优化查询速度.
将关键日期字段转换为日期键的最佳方法是什么?我觉得以下方法可行,但有点草率:
select Replace(CONVERT(varchar,GETDATE(),102),'.','')
Run Code Online (Sandbox Code Playgroud)
显然,我没有使用getdate,而是在表格中使用我的聚合中的日期列.
首先,您如何建议进行此转换?我的想法可以接受吗?
第二,有没有人使用Date Key作为聚集索引取得了很大的成功?
Hea*_*ore 10
ISO long(112)可以解决这个问题:
SELECT CONVERT(INT, CONVERT(VARCHAR(8), GETDATE(), 112))
Run Code Online (Sandbox Code Playgroud)
由于某种原因,使用ISO 112将getdate()直接转换为int给出41008,但是通过VARCHAR似乎可以工作 - 如果我想到更快的演员,我会更新.
编辑:关于int only vs varchar辩论,这里是我的发现(在我的测试装备和生产服务器上可重复)Varchar方法使用较少的CPU时间为50万个演员但总体上要慢一点 - 除非你处理数十亿的行
编辑2:修改测试用例以清除缓存和不同日期
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS TIME ON;
WITH RawDates ( [Date] )
AS ( SELECT TOP 500000
DATEADD(DAY, N, GETDATE())
FROM TALLY
)
SELECT YEAR([Date]) * 10000 + MONTH([Date]) * 100 + DAY([Date])
FROM RawDates
SET STATISTICS TIME OFF
(500000 row(s) affected)
SQL Server Execution Times:
CPU time = 218 ms, elapsed time = 255ms.
DBCC FREEPROCCACHE;
DBCC DROPCLEANBUFFERS;
SET STATISTICS TIME ON;
WITH RawDates ( [Date] )
AS ( SELECT TOP 500000
DATEADD(DAY, N, GETDATE())
FROM TALLY
)
SELECT CONVERT(INT, CONVERT(VARCHAR(8), [Date], 112))
FROM RawDates
SET STATISTICS TIME OFF
(500000 row(s) affected)
SQL Server Execution Times:
CPU time = 266 ms, elapsed time = 602ms
Run Code Online (Sandbox Code Playgroud)