2010-02-18 3 views
0

запросов -Соединение слева и где п

Select * FROM tbl1 
LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id 
        AND tbl2.col2 = 'zyx' 
        AND tbl2.col3 = 'abc' 
WHERE tbl1.col1 = 'pqr' 

Здесь я делаю левое внешнее объединение и использование «и» вместе с присоединиться. (Сначала я использовал joins 'и' part in 'where', но мои результаты были неправильными)

Мой запрос, который очень похож на этот, работает в течение длительного времени; для выполнения требуется не менее 10 секунд. Есть ли способ оптимизировать эти типы запросов?

+2

@Rahuls: что такое 'tb3.col3'? – Quassnoi

+0

Откуда берутся tb3? – froadie

+0

ошибка ввода, исправлено это извините –

ответ

2

Создать следующие показатели:

CREATE INDEX ix_tbl1_1_id ON tbl1 (col1, id) 
CREATE INDEX ix_tbl2_2_3_id ON tbl2 (col2, col3, id) 

Если id в соответствующих таблицах А CLUSTERED PRIMARY KEY, вы можете исключить его из индекса, так как он будет неявно включен в любом случае:

CREATE INDEX ix_tbl1_1 ON tbl1 (col1) 
CREATE INDEX ix_tbl2_2_3 ON tbl2 (col2, col3) 
+0

Как насчет tbl1.col1? –

+0

@leson: справа, индекс на 'col1' тоже не повредит. – Quassnoi

+0

Нет, это не улучшилось, но время увеличилось на 2 секунды –

1

Вы можете добавить индексы в те столбцы, на которых вы сравниваете значения.

-1

Возможно

 
Select * FROM tbl1, tbl2 
WHERE tbl1.id = tbl2.id 
AND tbl1.col1 = 'pqr' 
AND tbl2.col2 = 'zyx' 
AND tb2.col3 = 'abc' 
+0

У, должно быть, был мой старый вопрос, проверьте обновленный –

+0

, это не сработает. –

+0

Почему? И создать индексы, будет очень быстро – swamprunner7

1

Сначала кажется, что вы должны положить

AND tbl2.col2 = 'zyx' and tbl2.col3 = 'abc' 

в предложение WHERE, однако это противоречило бы ВЗАИМОДЕЙСТВУЮЩЕЙ ПРИСОЕДИНЕНИЮ. ГДЕ ограничивает результаты, поэтому добавление, которое эффективно делает его внутренним соединением. Несколько различных способов написания это может быть:

Добавить аннулирует к где

Select * FROM tbl1  
LEFT OUTER JOIN tbl2 ON tbl1.id = tbl2.id  
WHERE tbl1.col1 = 'pqr' 
    AND ((tbl2.col2 = 'zyx' AND tbl2.col3 = 'abc') 
    OR (tbl2.col2 = NULL AND tbl2.col3 = NULL)) 

или использовать подзапрос

SELECT * FROM tbl1   
LEFT OUTER JOIN 
(
    SELECT * 
    FROM tbl2 
    WHERE tbl2.col2 = 'zyx' and tbl2.col3 = 'abc' 
) AS temp2 ON tbl1.id = temp2.id   
WHERE tbl1.col1 = 'pqr'   

я бы, вероятно, выбрать для подзапроса подхода, как это просто понятнее что вы намерены. Что касается производительности, любой столбец в ГДЕ должен обычно покрываться индексом. Кроме того, оптимизатор должен иметь возможность находить наилучший подход независимо от того, каким образом вы пишете запрос.

+0

Некоторые параметры, время для запуска и просмотр планов запросов для каждого, кто ищет плохие вещи :) –

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