2016-04-26 29 views
1

我有兩個表點擊和設備(例如)。Vertica COPY與預加入表

CREATE TABLE Hits (
    url VARCHAR(255) NOT NULL, 
    DeviceId INTEGER NOT NULL 
); 

CREATE TABLE Devices (
    DeviceId INTEGER NOT NULL PRIMARY KEY, 
    OS VARCHAR(30) NOT NULL, 
    Device VARCHAR(30), 
); 

ALTER TABLE Hits ADD CONSTRAINT fk_devices FOREIGN KEY(DeviceId) REFERENCES Devices(DeviceId); 

另外,我有一個原始數據以CSV:

some url|Android|Device name 
another url|Android|Device name 
url|iOS|iPhone 
url|Android| 

的原始數據被填充在實時,我需要把它放到Vertica的。 使用COPY在單個表中加載所有數據沒有問題,但我想優化查詢和存儲。我如何加載它?

+0

就性能而言,將所有數據放在一個平面表中將爲您提供最佳性能,因爲您將避免在磁盤空間方面需要連接(像vertica這樣的mpp數據庫中的連接有它自己的問題)表格將不會添加高度覆蓋,因爲數據以包含格式保存 – elirevach

+0

非常奇怪,因爲vertica中的結構[示例](https://my.vertica.com/docs/7.2.x/HTML/index.htm#Authoring/GettingStartedGuide /Appendix/Tables/Tables.htm%3FTocPath%3DGetting%2520Started%7CAppendix%253A%2520VMart%2520Example%2520Database%2520Schema%252C%2520Tables%252C%2520and%2520Scripts%7C_____1)不是一個表。 – komex

回答

1

非規範化是最適合這種情況。首先,列域非常小。其次,數據已經出現非正規化。節省很多麻煩,並創建一個表。

CREATE TABLE Device_Hits (
    url VARCHAR(255) NOT NULL, 
    OS VARCHAR(30) NOT NULL, 
    Device VARCHAR(30), 
); 

寫出一個簡單的COPY語句並加載代表性的數據量。您必須從數據庫設計器(DBD)階段開始越做越好。

-- You may need LOCAL if you are streaming from a client 
-- This works from the node itself as dbadmin 
COPY Device_Hits (url, OS, Device) 
FROM '/path/to/somefile.csv' DELIMITER '|' DIRECT; 

然後運行admintools並執行DBD。如果您有任何具有代表性的查詢,請先將它們放在一個文件中,以便您可以告訴DBD在哪裏查找。 DBD將對數據進行排序和編碼。

不過,真的,這可能會是一大堆RLE編碼我敢打賭。

絕對不要使用prejoin預測過度複雜化。這些都有一定的侷限性,在這種情況下,老實說不會真正給你帶來太多的收益。 Vertica在這些類型的反規範化方面非常出色。