通过垂直的临时表设置变量



我知道在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语句中的'''是怎么回事…这更像是一个模板。'需要在最终结果中。为了做到这一点,你必须逃离它。因此,第一个'被视为字符串,接下来的'''的转义版本。(希望这能说得通)。最后,经过处理后,只会有一个'

最新更新