Какой SQL потребляет меньше памяти? - PullRequest
1 голос
/ 12 марта 2010

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

Цель состоит в том, чтобы переместить строки из таблицы B в таблицу A. Вот как я могу это сделать:

SQL # 1)

   INSERT INTO A (x, y, z)
   SELECT x, y, z
   FROM B b
   WHERE ...

SQL # 2)

FOREACH SELECT x,y,z INTO _x, _y, _z
        FROM B b
        WHERE ...
            INSERT INTO A(_x,_y,_z);
END FOREACH;

Является ли что-либо из вышеперечисленного неверным? База данных - Informix 11.5.

UPDATE:

Оказывается, что-то еще заставляло IDS расходовать сумасшедшие объемы памяти. Код выше, заставлял память пересекать выделенный порог. На данный момент я не вижу смысла использовать один метод над другим.

Ответы [ 2 ]

1 голос
/ 12 марта 2010

Узким местом будет дисковое пространство в журнале транзакций (или эквивалентное) для облегчения отката при необходимости.

Я никогда не думал о памяти для какого-либо отдельного оператора или операции. Когда-либо.

0 голосов
/ 13 марта 2010

Поскольку большая часть SQL является псевдокодом (для хранимой процедуры), а не рабочим кодом (для правильности чисел 2, 3 и 4 вам понадобятся предложения VALUES), тогда они, вероятно, в порядке. Номер 4 требует тщательного внимания, чтобы выполнить работу правильно - я начал писать «Номер 4 не так», но потом понял, что все остальные тоже были неработающим SQL.

За исключением того, что у вас проблемы с памятью, номер 1 будет лучшим. Учитывая, что у вас проблемы с памятью, номер 2, вероятно, является лучшей основой для работы. Я хотел бы рассмотреть возможность добавления суб-транзакций с использованием курсора «FOR HOLD», если база данных зарегистрирована. Если база данных не заблокирована, нет необходимости беспокоиться о размере транзакции; каждая ВСТАВКА атомарна.

В своем ответе на другой вопрос я заметил, что вам может понадобиться посмотреть на конфигурацию вашего сервера, чтобы понять, почему ему не хватает памяти. (Подумайте о подписке на IIUG - Международная группа пользователей Informix (бесплатно) и запросите информацию о вашей конфигурации в списке рассылки 'ids at iiug dot org'.

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