2013-09-23 8 views
1

У меня есть таблица, которая дает значение между двумя элементами. Таблица имеет следующие столбцы:Производительность запросов SQL-запросов

itemA | itemB | value 
1  | 2  | 125 
1  | 3  | 56 
3  | 2  | 78 
2  | 4  | 24 
4  | 1  | 994 
3  | 4  | 7 

Я подчеркиваю, что значения симметрии не повторяются. Например, теперь есть строка с itemA = 2 и itemB = 1 со значением = 125, так как эти данные уже сохранены с помощью itemA = 1 и itemB = 2.

Теперь я хотел бы получить все значения между пунктами 1, 2 и 3, но также и с симметричными значениями. Нечто подобное в наборе результатов SQL:

itemA | itemB | value 
1  | 2  | 125 
1  | 3  | 56 
2  | 1  | 125 
2  | 3  | 78 
3  | 1  | 56 
3  | 2  | 78 

мне удалось получить, что с происходит некорректно SQL запроса:

select itemA as iA, itemB as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
union all 
select itemB as iA, itemA as iB, value 
from table 
where itemA in (1,2,3) 
    and itemB in (1,2,3) 
order by iA, iB; 

Однако, это было сказан мне, что оператор UNION является производительность убийцей, и это таблица имеет более 100 М строк. Но после часов мозгового штурма я не нашел другого способа получить это. Пожалуйста, вы могли бы увидеть более качественный, более эффективный SQL-запрос, чтобы получить этот набор результатов.

Спасибо заранее

+0

больше подходит для codereview, чем stackoverflow. Кстати, упоминание СУБД действительно никогда не болит ... – gdoron

+0

Да, база данных: Oracle Database 11g Enterprise Edition Release 11.2.0.3.0 - 64bit Production – Comencau

ответ

2

UNION может быть убийцей производительность, поскольку он держит только отдельные элементы.
UNION ALL, с другой стороны, просто объединяет результирующие наборы, поэтому не должно быть значительного удара производительности.

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

Смежные вопросы