2013-05-17 5 views
1

Я изменяю существующий оператор, который объединяет информацию пользователя в одной таблице, чтобы информация пользователя могла поступать из другой таблицы. Одна из них - постоянная таблица, а другая - временная (записи перемещаются из одной в другую). Я изменил свое соединение на левое соединение, а затем левой присоединился к второй контактной информации. Мне нужно выбрать постоянное поле, если оно существует, и временное, если постоянное не существует. 154306 - это идентификатор пользователя всех входящих записей в основной таблице, которую я выбираю. Вот мои 2 варианта для выбора полей:DB2 Performance CASE vs COALESCE

SELECT 

CASE WHEN U.USRID = 154306 
    THEN T.TMPFNAME 
    ELSE U.FNAME 
END AS FNAME, 

COALESCE (U.LNAME, T.TMPLNAME) AS LNAME 

FROM FILES.ORDERS O 
LEFT JOIN FILES.USERS U ON U.USRID <> 154306 AND U.USRID = O.ORDUSR 
LEFT JOIN FILES.TMPUSERS T ON O.ORDNUM = T.TMPORD 

Я имею в виду случай кажется более «правильный», как это на самом деле управления потоком, но так как сливаются имеет меньше логики, чтобы следовать ей может работать быстрее. Либо должен достигнуть того же результата, потому что 2 левых соединения гарантируют, что мы получим информацию для пользователя, независимо от того, что не получится, но не получите постоянную информацию о пользователе для заказов, которые все еще назначены временному пользователю. Похоже, у нас есть 10 полей для case/coalesce, поэтому я думаю, что метод с лучшей производительностью - это путь, который, я думаю, объединяется, но я даже не уверен в этом. По какой-то причине лучше?

+0

Что произошло, когда вы попробовали? –

+0

Производительность по 1 вызову была тривиальной, это когда она идет в прямом эфире на веб-сайте, что можно проверить нагрузку. – MaKR

ответ

3

Производительность case по сравнению с coalesce() просто не повлияет на запрос, соединяющий три большие таблицы. В таких запросах доминирует время для чтения и сопоставления строк в таблице.

Кстати, два не точно то же самое. Если у вас есть NULL значений в users.Fname, тогда логика case сохранит их, но логика coalesce() заполнит значения из другой таблицы.

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

+0

Спасибо, это было очень полезно. По-видимому, они дезинформировали меня - записи не переносятся с временного на постоянный, они копируются и не всегда копируются. Мы просто собираемся использовать coalesce, чтобы он захватывал всю возможную информацию. Полезно знать это для будущего, хотя :) – MaKR