我知道在Vertica中设置变量需要很长时间,所以我想到创建一个临时表并选择必要的值。这是在我想要在多个地方更改时间戳而不手动或搜索它的情况下。但是,当使用这个临时表方法时,性能明显下降。我的问题是为什么会这样,有没有更好的解决办法?
我有这样的代码:
DROP TABLE DAY_RANGE;
CREATE LOCAL TEMP TABLE DAY_RANGE
(
start_ TIMESTAMP,
finish_ TIMESTAMP
)
INSERT INTO DAY_RANGE(start_, finish_)
SELECT '2016-09-09 00:00:00', '2016-09-10 00:55:55'
select count(*) from clickcache.click cc
where AMP_CLICK_DAY between (select start_ from DAY_RANGE) and (select finish_ from DAY_RANGE)
select start_ from DAY_RANGE
您可以使用cross join
代替。我不确定,但可能会有帮助。
另一个方法是取消本地temp的分段:
CREATE LOCAL TEMP TABLE DAY_RANGE
(
start_ TIMESTAMP,
finish_ TIMESTAMP
) UNSEGMENTED ALL NODES;
此外,如果您使用vsql
,您可以在那里创建变量,以及使用set
。如果不使用vsql
,许多客户机将检测到:parameter
变量并适当提示。
set start_time '''2016-09-09 00:00:00'''::timestamp
set end_time '''2016-09-10 00:55:55'''::timestamp
select count(*)
from clickcache.click
where AMP_CLICK_DAY between :start_time and :end_time
另外,如果你想知道set语句中的'''
是怎么回事…这更像是一个模板。'
需要在最终结果中。为了做到这一点,你必须逃离它。因此,第一个'
被视为字符串,接下来的''
是'
的转义版本。(希望这能说得通)。最后,经过处理后,只会有一个'
。