我正在尝试创建一个MonetDB数据库,该数据库将容纳100k列和大约2M行的smallint类型。
要生成100k列,我使用的是C代码,即执行以下sql请求的循环:
df
IdCarrefour X10 X11 X12 X13
1 2 3 8 5 NA
2 4 NA 4 1 NA
3 5 NA NA NA NA
4 6 NA 4 1 NA
5 7 NA NA NA NA
#create new data.frame
df2 <- rbind(
stack(apply(df, 2, FUN = function(x) sum(is.na(x)))), #NA
stack(apply(df, 2, FUN = function(x) sum(!is.na(x)))) #not NA
)
df2
values ind
1 0 IdCarrefour
2 4 X10
3 2 X11
4 2 X12
5 5 X13
6 5 IdCarrefour
7 1 X10
8 3 X11
9 3 X12
10 0 X13
#add indicator column
df2 <- data.frame(df2, Indicator = rep(c('NA','Not NA'), each = 5))
#remove IdCarrefour
df2 <- subset(df2, ind != 'IdCarrefour')
#make plot
ggplot(df2, aes(x = ind, y = values))+geom_bar(stat = 'identity', aes(fill = Indicator))
其中%d是1到100000之间的数字。
我观察到80000 sql请求后,每个事务大约需要15秒,这意味着我需要大量时间来完成表创建。
你能否告诉我是否有一种创建100k列的简单方法?
另外,你知道MonetDB究竟发生了什么吗?
答案 0 :(得分:1)
您应该只使用一个创建表
脚本shell(bash)中的:
#!/bin/bash
fic="/tmp/100k.sql"
col=1
echo "CREATE TABLE bigcol (" > $fic
while [[ $col -lt 100000 ]]
do
echo "field$col SMALLINT," >> $fic
col=$(($col + 1))
done
echo "field$col SMALLINT);" >> $fic
在命令行中:
sh 100k.sh
mclient yourbdd < /tmp/100k.sql
等待约2分钟:D
mclient yourbdd
> \d bigcol
[ ... ... ...]
"field99997" SMALLINT,
"field99998" SMALLINT,
"field99999" SMALLINT,
"field100000" SMALLINT
);
DROP TABLE bigcol反对很长时间。我不知道为什么。
我也认为这不是一个好主意,但它会回答你的问题。
皮尔