2016-05-31 45 views
1

我想創建一個MonetDB數據庫,該數據庫應該保存100k列和大約2M行smallint類型。MonetDB創建100.000列

爲了生成我使用的是C代碼,即100k的列,執行以下SQL請求一個循環:

ALTER TABLE test ADD COLUMN s%d SMALLINT; 

其中%d是從1號至100000

我觀察到在80000次sql請求之後,每個事務大約需要15s,這意味着我需要大量時間來完成表創建。

你能告訴我,如果有一個簡單的方法來創建100k列?

另外,你知道到底是怎麼回事與MonetDB?

+5

爲什麼在單個表格中需要100K列?這聽起來像你需要重構你的數據庫模式。 – NathanOliver

+1

那麼,將表分成兩個(或更多)表可能是另一種解決方案,但我首先需要了解是否可以將數據保存在一個表中。主鍵是單列,所以我沒有看到monetdb不能處理這個問題的任何具體原因。 – Roman

+3

我認爲大多數數據庫會在表中的100k列上窒息。 Oracle僅支持1K,MySQL只支持4096. – NathanOliver

回答

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 b igcol反對很長。我不知道爲什麼。

我也認爲這不是一個好主意,但它回答你的問題。

Pierre

+0

好吧,似乎在「CREATE TABLE」請求期間創建所有列時,一切正常。謝謝。 – Roman