我有两个表Hits和Devices(例如)。
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 :(得分:1)
Denormalize最适合这种情况。首先,列域非常小。其次,数据已经进入非规范化。省去很多麻烦,并创建一个表。
CREATE TABLE Device_Hits (
url VARCHAR(255) NOT NULL,
OS VARCHAR(30) NOT NULL,
Device VARCHAR(30),
);
写一个简单的COPY语句并加载代表性的数据量。对于Database Designer(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在这些类型的非规范化方面表现出色。