Как создать данные размером более 2 ТБ для Oracle, Informix и Sybase - PullRequest
3 голосов
/ 16 июля 2009

Я новичок в Informix, и в рамках моей деятельности по тестированию мне нужно создать данные размером более 2 ТБ для Oracle, Informix и Sybase. Есть ли нейтральный к базе данных способ сделать это?

Я также ищу любые бесплатные или открытые инструменты; Я могу найти несколько для Oracle, но вряд ли для Informix и Sybase.

Ответы [ 6 ]

2 голосов
/ 16 июля 2009

Работа с несколькими базами данных таким образом является нетривиальной задачей. Честно говоря, 2TB - это самое лучшее, чего можно достичь с этими продуктами (если только вы не используете Sybase IQ - о котором вы не упомянули). Если вы работаете с хранилищем данных или создаете отчеты на основе этих данных, возможно, вы захотите пересмотреть выбор продуктов.

{Было бы проще дать вам совет, если бы вы объяснили , почему вы хотите загрузить 2 ТБ тестовых данных. Кроме того, почему эти базы данных? «Трюки», которые работают для загрузки в Oracle, будут разными для Sybase. В любом случае, вот мой общий совет ...}

Сначала просмотрите ваш DDL и полностью удалите все ограничения и значения автоинкремента. БД тратит много циклов процессора и ввода-вывода, проверяя эти значения, когда вы выполняете любую вставку, поэтому избавьтесь от них. В любом случае, в случае необходимости, их можно будет повторно применить позже.

Во-вторых, сгенерируйте таблицу из 1 столбца для каждого столбца, который вы хотите иметь в финальной таблице. Например, если это адресная таблица, вы можете иметь:

First_Name, Last_Name, Address_1, etc.

Заполните каждую из этих таблиц небольшой выборкой значений, которые вы ожидаете в реальных данных, скажем, 10 строк на таблицу.

Теперь по волшебству: вы скрещиваете все эти таблицы с 1 столбцом вместе в декартовом произведении. Это даст вам 1 строку для каждой возможной комбинации таблиц из 1 столбца и, таким образом, «раздувает» их до требуемого размера.

Пример запроса: (синтаксис может варьироваться в зависимости от дБ)

SELECT *
  FROM      First_Name 
 CROSS JOIN Last_Name 
 CROSS JOIN Address_1 
       …
 CROSS JOIN Post_Code

Вы можете рассчитать, сколько данных будет сгенерировано, умножив количество строк.

    10 tables w/ 10 rows 
  = 10^10 
  = 10,000,000,000 
  = 10 billion rows

Затем умножьте количество строк на средний размер строки, чтобы получить общий объем данных, исключая накладные расходы в дБ.

    (128 byte rows * 10 billion rows) / 1024^4 (Terabyte)
   = 1.164 Terabytes of sample data.

Легкий путь

Загрузите пробную копию Benchmark Factory из Quest. Это позволит вам вставить несколько различных наборов эталонных данных в вашу базу данных и запустить их. Не дешево, хотя, если вы хотите продолжать использовать его.

2 голосов
/ 16 июля 2009
  1. Вы должны решить, насколько повторяющиеся данные могут быть.
  2. Загрузи свой отдельные данные в любых таблицах необходимо.
  3. Увеличить эти данные экспоненциально с

    INSERT INTO my_table SELECT * FROM my_table;

Если вам нужны уникальные поля первичного ключа, замените их последовательностями в соответствующих вставках для Oracle и любым эквивалентом для других БД.

Если ваше оборудование не может справиться с нагрузкой удвоения 100G + данных, делайте это небольшими партиями. Используйте WHERE rownum <100000 ... для Oracle и любой эквивалент для других БД. </p>

1 голос
/ 16 июля 2009

Есть ряд проблем, с которыми вы столкнетесь. Вероятно, самое большое, что все разные СУБД имеют разные предпочтительные форматы загрузки - поэтому любой отдельный формат данных потребует некоторой гимнастики для одной или нескольких СУБД - если вы не сгенерируете операторы INSERT напрямую.

Informix предпочитает формат, который можно свободно охарактеризовать как «поля с разделителями с обратной косой чертой, используемой в качестве escape и (неэкранированной) новой строки, указывающей конец записи». Разделителем по умолчанию является символ канала '|', но его можно изменить в соответствии с требованиями. Например:

100|Some string|2008-09-12|23.145|wc -l \| sort -n|76:34:45.219

К счастью, форматы даты достаточно гибкие. Если вам нужны ужасные подробности, загрузите исходный код SQLCMD (а не Microsoft usurper - оригинальный) из архива исходного кода IIUG и прочитайте файл unload.format. Загрузка данных CSV не является тривиальным упражнением в Informix - хотя у меня есть скрипт Perl с именем csv2unl, который в значительной степени автоматизирует преобразование из формата CSV в формат Informix UNLOAD (также должен быть доступен на веб-сайте IIUG).

Как предположил @ St3fan, для генерации данных можно использовать любой из основных языков сценариев. Я бы использовал Perl, но это в основном потому, что я выучил Perl очень давно, и поэтому чувствую себя наиболее комфортно с ним.

Другая проблема, на которую следует обратить внимание, заключается в том, генерируете ли вы данные для одной таблицы (или набора несвязанных таблиц) или для набора связанных таблиц. Например, сравнительно легко сгенерировать данные для одной таблицы; гораздо сложнее сгенерировать данные для двух таблиц, имеющих общее поле (например, таблица Orders и таблица OrderItems).

Несмотря на это, 2 ТБ - задача умеренно сложная. Даже если каждая строка составляет 1 КБ, вам потребуется сгенерировать около 2 миллиардов строк данных. Вам нужно будет загружать данные порциями - не все за одну транзакцию. Вы, вероятно, захотите создать индексы после загрузки, но это возлагает на вас ответственность за то, чтобы данные в таблицах были действительными (без ненужных дубликатов). Если вы используете столбец SERIAL (Informix-говорят для автоматически сгенерированного значения), вам, вероятно, потребуется использовать BIGSERIAL (или, возможно, SERIAL8 - это зависит от используемой версии Informix, но это должен быть IDS 11.50, в этом случае BIGSERIAL - лучший выбор).


@ dotIN спрашивает о времени ... как долго загружаться?

Давайте рассмотрим некоторые основные принципы ... какова приличная скорость записи для записи на диск? 100 МБ / с выдержали? Давайте использовать его в качестве отправной точки.

При 100 МБ / с записи данных потребуется:

2,000,000 MB / 100 MB/s = 20,000 s

что составляет примерно 6 часов.

Я думаю, что это очень высокий показатель; кроме того, вы должны передавать данные в СУБД (поэтому вы должны иметь операторы, выполняемые со скоростью, соответствующей 100 МБ / с), плюс вам нужно беспокоиться о регистрации действий в базе данных, и так далее, и так далее. Если нагрузка может быть эффективно распределена по нескольким дискам, вы сможете приблизиться к этому. Однако привязка к вводу / выводу очень проста, особенно если на вашей машине нет нескольких отдельно адресуемых дисков (например, один многотерабайтный RAID-накопитель с одним каналом ввода-вывода).

Если каждая строка загружается с помощью отдельного оператора INSERT, вам придется выполнять огромное количество операторов в секунду. Это еще один ингибитор производительности. Вы не указали точно, как вы выполняете загрузку, но при обработке больших объемов вы должны быть предельно осторожны, и для достижения максимальной производительности любой из СУБД требуются навыки и опыт - не говоря уже о всех из них. , И обратите внимание, что конфигурации, которые ускоряют производительность загрузки терабайтов данных, не обязательно приводят к хорошей производительности, когда вы больше не стремитесь к загрузке, а извлекаете информацию.

И есть упоминания о каплях; они имеют особые ограничения и требуют бережного отношения к каждой системе и обычно усложняют историю. (Например, в IDS вам понадобится отдельное Smart BlobSpace для интеллектуальных больших двоичных объектов - типов BLOB или CLOB - из DBSpace, где вы храните данные. Если вы используете устаревшие BLTE или TEXT большие двоичные объекты, вы, вероятно, захотите использовать Соответствующее BlobSpace - в отличие от Smart BlobSpace - с размером страницы, настроенным в соответствии с данными, которые вы храните. Возможно, вы не хотите хранить BLTE BYTE или TEXT BLOB-объектов в TABLE - это работает, но оно забивает систему ведения журнала Именно поэтому BlobSpaces доступны в качестве опции.)

1 голос
/ 16 июля 2009

Я много раз делал подобные вещи с помощью простого скрипта Python, Perl или Ruby, чтобы генерировать операторы SQL или какой-то файл в стиле CSV, который может импортировать инструмент, специфичный для базы данных.

Два терабайта это много, хотя. Возможно, вы захотите сделать это партиями.

0 голосов
/ 06 апреля 2010

У меня есть файл теста ascii размером 2 ТБ + (nrows = 10M, rowizes = 2048) (с разделителями каналов), который имеет уникальные: полные имена, адреса, номера телефонов и множество других типов данных, таких как DATE, SMALLINT, DECIMAL (9 2) и т. Д. Для целей тестирования / тестирования.

Проблема есть. как я могу получить это для вас?

0 голосов
/ 16 июля 2009

Это не проблема для любого языка программирования, который разрешает доступ к базе данных.

...