2016-12-12 3 views
3

Я переписывание My SQL, чтобы снизить затраты на выполнение и интересно, если есть эффективный способ, чтобы написать ниже случай, когда заявление используется в WHERE условие:Оптимизация случая, когда оператор в SQL Server ИНЕКЕ условие

SELECT l.*,tg.* 
FROM RefTable tg, 
     InputTbl l 
WHERE tg.areascheme = l.areascheme 
    AND tg.countrycode = l.strareabriefnamel1 
    AND (CASE WHEN l.strareabriefnamel2 IS NULL THEN '' ELSE tg.areacode END) = COALESCE(l.strareabriefnamel2,'') 
    AND (CASE WHEN l.strareabriefnamel3 IS NULL THEN '' ELSE tg.subareaname END) = COALESCE(l.strareabriefnamel3,'') 
    AND (CASE WHEN l.strareabriefnamel4 IS NULL THEN '' ELSE tg.postalname END) = COALESCE(l.strareabriefnamel4,'') 
    option(MAXDOP 0); 
План

Исполнение: - enter image description here

Подробнее: -

InputTable (466K записей) имеет всего четыре поля, которые участвуют в РЕГИСТРИРУЙТЕСЬ логики и есть в общей сложности 16 возможно (NULL, NOT NULL) со mbinations.

L1, L2, L3, L4 
NULL,NULL,NULL,NULL 
NULL,NULL,NULL,NOT NULL 
NULL,NULL,NOT NULL, NULL 
NULL,NULL,NOT NULL,NOT NULL 
NULL,NOT NULL,NULL,NULL 
NULL,NOT NULL,NULL, NOT NULL 
NULL,NOT NULL, NOT NULL,NULL 
NULL,NOT NULL,NOT NULL,NOT NULL 
NOT NULL,NULL,NULL,NULL 
NOT NULL,NULL,NULL,NOT NULL 
NOT NULL,NULL,NOT NULL,NULL 
NOT NULL,NULL,NOT NULL,NOT NULL 
NOT NULL,NOT NULL,NULL,NULL 
NOT NULL,NOT NULL,NULL,NOT NULL 
NOT NULL,NOT NULL,NOT NULL,NULL 
NOT NULL,NOT NULL,NOT NULL,NOT NULL 

RefTable (45K записей), которые будут участвовать в соединении логики с InputTable является генерирование результирующего на основе указанных выше критериев производит около 351 млн строк.

Мои входные данные в настоящее время встречают только два сценария.

InputTable: -

NULL,NULL,NULL,NULL - 225776 rows 
NOT NULL, NOT NULL, NULL, NULL - 240360 rows 

Все входы будут оценены. Благодарю.

+0

Какова проблема производительности, которую вы обнаружили при использовании case-when? Если вы собираетесь проверять только NULL, вы можете очень хорошо использовать coalesce, поскольку вы используете в другом состоянии ... –

+0

значения strareabriefnamel2 могут быть как NULL, так и NOT NULL. Необходимо учитывать оба условия и использовать их в предложении WHERE ... – Teja

+0

Но на основе вашего примера вы можете просто использовать iif ... –

ответ

5

Простые правила: Никогда запятые в пункте FROM. Всегда используйте явно, правильно JOIN синтаксис.

Это, вероятно, не влияет на производительность запроса, но это гораздо более типичный способ его записи. Я уверен, что намеревается:

SELECT l.*, tg.* 
FROM RefTable tg JOIN 
    InputTbl l 
    ON tg.areascheme = l.areascheme AND tg.countrycode = l.strareabriefnamel1 
WHERE (l.strareabriefnamel2 IS NULL OR tg.areacode = l.strareabriefnamel2) AND 
     (l.strareabriefnamel3 IS NULL OR tg.subareaname = l.strareabriefnamel3) AND 
     (l.strareabriefnamel4 IS NULL OR tg.postalname = l.strareabriefnamel4) 
    option(MAXDOP 0); 

Место для начала работы с оптимизацией запроса - с индексами. Я бы предложил: RefTable(areascheme, countrycode) и InputTbl(areascheme, strareabriefnamel1).

+0

Чтобы расширить свое предложение, вы также порекомендовали бы включенные столбцы? например'RefTable (areascheme, countrycode) включают (areacode, subareaname, postalname)' и 'InputTbl (areascheme, strareabriefnamel1) включают (strareabriefnamel2, strareabriefnamel3, strareabriefnamel4)' – SqlZim

+1

@SqlZim. , , Я бы не начинал с включенных столбцов, но опять же, я не совсем понимаю структуру данных. –

+0

Мне было просто интересно, спасибо за ответ! – SqlZim