2016-05-31 2 views
1

Я пытаюсь создать базу данных MonetDB, которая должна содержать 100k столбцов и приблизительно 2M строк типа smallint.MonetDB create 100.000 columns

Для генерации 100k столбцы Я использую код C, то есть, цикл, который выполняет следующий SQL запрос:

ALTER TABLE test ADD COLUMN s%d SMALLINT; 

, где% d обозначает число от 1 до 100000.

Я наблюдал что после 80000 запросов sql каждая транзакция занимает около 15 секунд, что означает, что мне нужно много времени, чтобы завершить создание таблицы.

Не могли бы вы рассказать мне, есть ли простой способ создания столбцов 100k?

Кроме того, вы знаете, что именно происходит с MonetDB?

+5

Зачем вам колонны 100K в одном столе? Похоже, вам нужно перестроить схему БД. – NathanOliver

+1

Ну, разделение таблицы на два (или более) может быть альтернативным решением, но я хотел бы сначала понять, могу ли я хранить данные в одной таблице. Первичный ключ - это один столбец, поэтому я не вижу никакой конкретной причины, по которой monetdb не справляется с этим. – Roman

+3

Большинство БД, я думаю, задохнутся на 100 тыс. Столбцов в таблице. Oracle поддерживает только 1K, а MySQL поддерживает только 4096. – NathanOliver

ответ

1

Вы должны использовать только один создать таблицу

в оболочке скрипта (Баш):

#!/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 b igcol против очень долго. Я не знаю почему.

Я также думаю, что это не очень хорошая идея, но она отвечает на ваш вопрос.

Pierre

+0

Ну, похоже, что когда все столбцы создаются во время запроса «CREATE TABLE», все работает отлично. Спасибо. – Roman