作者:wangtao | 来源:互联网 | 2023-08-16 13:10
我写了这个连接到dateutil.tz的函数,请参考下面的代码:CREATEORREPLACEFUNCTIONschema_name.fnc_name(tst
我写了这个连接到dateutil.tz的函数,请参考下面的代码:
CREATE OR REPLACE FUNCTION schema_name.fnc_name(ts timestamp without time zone, timezone character varying)
RETURNS boolean STABLE AS $$
from datetime import datetime
from dateutil.tz import gettz
tstz = ts.replace(tzinfo=gettz(timezone))
is_dst = datetime.timetuple(tstz).tm_isdst
return is_dst
$$LANGUAGE plpythonu;
这个函数很慢,我需要在执行周期中调用超过10亿行.
我真的很喜欢redshift和timezone的东西.有人可以帮我优化一下吗?
任何性能改进建议都值得赞赏,例如:
>以某种方式将时区详细信息移动到本地数据库? (告诉我怎么样)
>不要使用Python,使用别的东西(告诉我什么)
解决方法:
使用IMMUTABLE而不是STABLE,因为给定输入值,返回值将始终相同.从documentation:
STABLE: Given the same arguments, the function is guaranteed to return the same results for all rows processed within a single statement. The function can return different results when called in different statements. This category allows the optimizer to optimize multiple calls of the function within a single statement to a single call for the statement.
IMMUTABLE: Given the same arguments, the function always returns the same result, forever. When a query calls an IMMUTABLE
function with constant arguments, the optimizer pre-evaluates the function.
此外,要启用Redshift缓存结果,请传入DATE而不是TIMESTAMP.这将减少使用的输入值的数量,以便它们更可能使用先前计算的(和缓存的)值.