2016-09-29 32 views
1

我知道在Vertica中設置變量需要很長的時間,所以我想創建一個臨時表並選擇必要的值。這是爲了防止我在多個位置更改時間戳,而無需手動執行或搜索它。但是,使用此臨時表方法時性能明顯惡化。我的問題是爲什麼這樣,是否有更好的解決方法?在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 
+0

嗨,我不確定我明白你的意思是「在Vertica中設置變量需要很長時間」?你能否列舉一個這樣的例子,因爲我不確定自己明白。 – woot

+0

我其實不知道該怎麼做。我看到一個例子,它非常複雜。如果您有辦法做到這一點,請分享。謝謝! – opamp

+0

沒有辦法在Vertica中爲此目的設置會話變量,這就是爲什麼我有點困惑。雖然有'vsql'客戶端變量。查看我的答案瞭解更多詳情。如果你想指出我看到的例子的方向,我可以幫助解釋它。 – woot

回答

1

你可以使用一個cross join來代替。我不確定,但它可能有幫助。

另一個想法是unsegment當地溫度:

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 

另外,如果你想知道這筆交易是用什麼在一組語句的''' ......這更像一個模板。 '需要在最終的結果。爲了做到這一點,你必須逃避它。所以第一個'被視爲字符串,下一個'''的轉義版本。 (希望這是有道理的)。最後,處理後只有一個'

+0

我對vsql不太熟悉,但我只是最終使用了:start_time和:end_time,並指出了那些正是我想要的值!謝謝! – opamp

+0

很高興幫助。 :-) vsql有這種能力,但許多其他客戶端也是如此。有些客戶端會遇到一個以這種形式出現的變量(':parameter')會提示你輸入變量。 – woot

+0

我會盡力而爲,但我的聲望在15以下。我一定會在15歲時接受它。非常感謝! – opamp