Мне нужно получить информацию из двух баз данных. Один - ORACLE, а другой - DB2. В моей программе (C #) на первом этапе я получаю базовую информацию о моих объектах из базы данных ORACLE. На втором шаге я хочу добавить информацию, которая сохраняется в DB2. Таблица в DB2 имеет составной первичный ключ, и я не уверен, какой способ лучше всего запросить, или есть ли альтернатива, которую я не вижу в данный момент.
Например: COLUMN1 и COLUMN2 являются составным первичным ключом.
Вариант 1:
SELECT *
FROM (SELECT COLUMN1, COLUNN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1) AS TEMP
WHERE ID='2011_123456'
OR ID='2011_987654'
Здесь я думаю, что недостатком является то, что для каждой строки в таблице строится конкатенация строк, а также скорость выполнения сравнительно низкая, поскольку столбцы первичного ключа индексируются, а новый - нет.
Вариант 2:
SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1
WHERE (COLUMN1='2011' AND COLUMN2='123456')
OR (COLUMN1='2011' AND COLUMN2='987654')
Это действительно быстро, но в любое время я получаю исключение SQL0954C (в куче приложения недостаточно места для обработки оператора).
Вариант 3:
SELECT COLUMN1, COLUMN2, COLUMN3, ..., COLUMN1||'_'||COLUMN2 AS ID
FROM TABLE1
WHERE COLUMN1 IN ('2011')
AND COLUMN2 IN ('123456','987654')
Этот также медленный по сравнению с вариантом 2.
Еще несколько цифр: ТАБЛИЦА 1 имеет в данный момент ок. 600 тыс. Строк
Я попробовал варианты и получил следующие времена выполнения:
Для 100 запрашиваемых объектов:
Вариант 1: 3900мс
Вариант 2: 218 мс
Для 400 запрашиваемых объектов:
Вариант 1: 10983мс
Вариант 2: 266мс
Для 500 запрашиваемых объектов:
Вариант 1: 12796мс
Вариант 2: исключение SQL0954C
Вариант 3: 7061мс
Только глядя на времена, я бы предпочел вариант 2, но есть проблема с исключением.
Базы данных не находятся под моим контролем, и у меня есть только права SELECT. Как вы думаете, что лучше для этого варианта использования? Есть ли другие возможности, которых я не вижу?
С уважением,
pkoeppe