Как выбрать записи из огромной таблицы и вставить в другую таблицу кусками - PullRequest
0 голосов
/ 20 октября 2010

Проблема Sybase : Выбранные значения column1 (id) таблицы огромный_тбл (60 миллионов + записей) необходимо скопировать в таблицу small_tbl, которая сравнительно мала.Критерии выбора строк из огромного_тбл зависят от значений column2 (mydate).

large_tbl:

  • id является первичным ключом огромный_таблицы
  • Столбец mydate является полем даты и времени.
  • Есть индекс (mydate, id) на огромный_тбл.
  • огромный_тбл имеет много других столбцов, кроме идентификатора и mydate.

small_tbl:

  • small_tbl имеет 2 столбца: идентификационный столбец представляет собойИдентификационный столбец id2 аналогичен id огромный_tbl

Поскольку количество вставляемых записей достаточно велико, и во избежание заполнения пространства журнала вставка разделяется на куски с использованием установленного количества строк.

В связи с этим следующая итерация должна начинаться с того места, где завершена предыдущая итерация.Предположим, что последняя запись, вставленная в 1-ю итерацию, имеет значение mydate как «02/10/2010 09:00:00».Там может быть больше записей с такими же значениями mydate в огромный_базе, которые не были выбраны из-за "set rowcount ###".Следующая итерация должна выбрать записи, значения mydate которых начинаются с «02/10/2010 09:00:00», но также должна отфильтровать записи, уже выбранные в предыдущей итерации.

Я пробовал несколько подходов, но это либооканчивается дублирующими записями в small_tbl или занимает слишком много времени для обработки.

Любые указатели на эту проблему приветствуются.

Например, - приведенный ниже подход занимает слишком много времени:

while (row_count > 0)
begin

insert into small_tbl(id2)
select id from huge_tbl where mydate between <date1> and <date2>
and 1 = case 
    when ((mydate = @last_max_mydate)
         and id > @last_max_id))
    then 1
    when (mydate > @last_max_mydate)
    then 1
    else 0

select @row_count = @@rowcount

select @last_max_identity = max(identity) from small_tbl
select @last_max_id2 = id2 from small_tbl where identity = @last_max_identity
select @last_max_mydate = mydate from huge_tbl where id = @last_max_id2

end

Ответы [ 4 ]

1 голос
/ 23 октября 2010

Эту проблему легко решить , и она была решена тысячу раз.

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

1 Забудьте столбец IDENTITY на огромный_таблице, или каким определено ограничение PRIMARY KEY, каков истинный реляционный первичный ключ?Если вы не уверены, опубликуйте все явные операторы и операторы CREATE INDEX для огромный_таблицы.

2 Для чего нужно копирование огромный_таблицы в small_table?Всякий раз, когда вы дублируете данные (даже временно), возникает более серьезная проблема, которая не выявляется;если вы решите это, необходимость в копировании будет исключена.

Ответ на ваш ответ

Должно быть какое-то недопонимание.Вы указали, что информация является вашей первоначальной записью.Извините, но я специально спросил, что такое истинный логический ключ, НЕ тот PK , который есть в вашем OP.Для того, чтобы определить обманщиков, мне нужно знать данные.Id PK ничего не значит.Вы уже используете это.И получать куклы.Если я воспользуюсь этим, я тоже получу обманщиков.Поэтому я не буду этим пользоваться.Поэтому мне нужно знать таблицу, данные, столбцы, что такое логические ключи, что (за исключением столбца Id) делает каждую строку уникальной.

  • , если вы можете предоставитьвся таблица DDL (CREATE TABLE плюс все команды CREATE INDEX), это было бы лучше всего.Просто измените имя таблицы, если вам нужно сохранить ее конфиденциальность.

  • , если нет, мне нужно заявление, описание, от которого вы узнаете, какие столбцы делают каждую строку уникальной (кроме Id столбец).

  • или указание на то, что уникальных идентификаторов не существует, и в этом случае это не реляционная таблица, в этом случае невозможно определитьdupes.

0 голосов
/ 23 июля 2014

Использование sqsh . По-видимому, этот ответ слишком короткий, чтобы я мог писать, поэтому я просто повторю, используйте sqsh.

0 голосов
/ 02 ноября 2010

вот ответы на ваши вопросы:

  • id - это первичный ключ огромный_тбл.Индекс на (mydate, id) существует.

Столбец идентификации существует в small_tbl и является первичным ключом.

  • цель копирования частичных данных из огромный_тбл в small_tbl - битсложно объяснить.Все, что я могу сказать, это то, что частичные данные из огромный_ хранилища хранятся в small_tbl для дальнейшей обработки.
0 голосов
/ 21 октября 2010

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...