繁体   English   中英

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

[英]sql server - Using Datepart in where clause taking a longer time

例如:说我们有一个临时交易表,其中包含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上创建了索引,因为它很慢。 将暂存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;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM