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

问题描述 投票:0回答:1

例如: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子句中使用了函数,因此索引不起作用。

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

狮子座

sql sql-server
1个回答
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;
© www.soinside.com 2019 - 2024. All rights reserved.