sql server - 在where子句中使用Datepart需要更长的时间

时间:2018-03-06 10:44:12

标签: sql sql-server

例如: 假设我们有一个具有3000万行的分段事务表,当与主表连接时,它具有唯一的(24行)...每小时(1到24)

SELECT F.*
FROM STAGING_TRANSACTION F
     JOIN DIM_TIME DT ON  DATEPART(HOUR,F.RECORDED_TIME) = DATEPART(HOUR,DT.ON_TIME) 

数据类型是 记录时间是DATETIME ON_TIME是十进制

暂存a没有索引,我已经在dim_time上创建了索引,因为它很慢。当staging tabe与其他表连接时,它更快,但是当加入昏暗时间时,需要更长的时间。由于函数在where子句中使用,因此索引不起作用。

还有其他方法可以让它更快

利奥

1 个答案:

答案 0 :(得分:0)

这是您的查询:

SELECT F.*
FROM STAGING_TRANSACTION F JOIN
     DIM_TIME DT
     ON DATEPART(HOUR, F.RECORDED_TIME) = DATEPART(HOUR, DT.ON_TIME) ;

如果您有DIM_TIME,则应该在维度中包含一个具有相应小时的列。毕竟,它是一个实用工具表。这很容易解决:

alter table dim_time add dt_hour as (datepart(hour, on_time) );

然后,此列的索引可能有助于查询:

create index idx_dim_time_hour on dim_time(dt_hour);

这应该有助于查询:

SELECT F.*
FROM STAGING_TRANSACTION F JOIN
     DIM_TIME DT
     ON DATEPART(HOUR, F.RECORDED_TIME) = dt.dp_time;

您还可以将计算列添加到staging_transaction

alter table staging_transaction add st_hour as (datepart(hour, recored_time) );

create index idx_st_hour on staging_transaction(st_hour);

然后查询如下:

SELECT F.*
FROM STAGING_TRANSACTION F JOIN
     DIM_TIME DT
     ON f.st_hour = dt.dp_time;