2016-04-26 54 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在这些类型的反规范化方面非常出色。