1
SELECT 
    T2.Entity1Id, T1.Entity1Id 
FROM 
    T1 
FULL OUTER JOIN 
    T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 
WHERE 
    ((T1.c1 = 123) OR (T2.c1 = 123)) 
    AND (T1.c3 = 1 OR T1.c3 IS NULL) 

Выше запроса занимает 12 секунд в SQL Server 2014, любая идея для настройки запроса? Есть индексы на столбцах C1, C2, C3.Оптимизация запросов в SQL Server

Наблюдение:.. В приведенном выше запросе, когда я удалить условие из OR (т.е.

SELECT 
    T2.Entity1Id, T1.Entity1Id 
FROM 
    T1 
FULL OUTER JOIN 
    T2 ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 
WHERE 
    (T1.c1 = 123) AND (T1.c3 = 1 OR T1.c3 IS NULL) 

то это возвращающие результаты в 0 секунд

Каждая таблица имеет около 500'000 записей

+1

* lakhs * - пожалуйста, используйте ** международно известные ** единицы измерения - тысячи, миллион, миллиард ..... также: можете ли вы показать нам графический план выполнения ** для запроса? –

+0

5 lakhs = 500 000 – Prasu

ответ

1

Во-первых, окончательное условие (T1.c3 = 1 OR T1.c3 IS NULL) является избыточным. Учитывая условие join, это единственные возможные значения. Таким образом, запрос:

SELECT T2.Entity1Id, T1.Entity1Id 
FROM T1 FULL OUTER JOIN 
    T2 
    ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 
WHERE (T1.c1 = 123) OR (T2.c1 = 123) 

Если это не имеет хорошую производительность, можно разбить это на два запроса:

SELECT T2.Entity1Id, T1.Entity1Id 
FROM T1 LEFT JOIN 
    T2 
    ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 
WHERE T1.c1 = 123 
UNION 
SELECT T2.Entity1Id, T1.Entity1Id 
FROM T2 LEFT JOIN 
    T1 
    ON T1.c2 = T2.c2 AND T1.c1 = T2.c1 AND T1.c3 = 1 
WHERE T2.c1 = 123 

Иногда, оптимизация отдельных подзапросов намного лучше, чем оптимизации для full outer join.

+0

1-е решение не улучшает производительность. Но второй работает с небольшими изменениями. Спасибо. – Prasu

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