例如:Say我们有一个具有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)
数据类型是RECORDED TIME是DATETIME ON_TIME是十进制的
暂存a没有索引,我已经在dim_time上创建了索引,因为它很慢。当staging tabe与其他表连接时,它更快,但是当加入昏暗时间时,需要更长的时间。由于在where子句中使用了函数,因此索引不起作用。
有没有其他方法可以让它更快
狮子座
这是您的查询:
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;