MonetDB创建了100.000列

时间:2016-05-31 15:41:02

标签: c++ sql monetdb

我正在尝试创建一个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究竟发生了什么吗?

1 个答案:

答案 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反对很长时间。我不知道为什么。

我也认为这不是一个好主意,但它会回答你的问题。

皮尔