Оставить присоединиться и где пункт - PullRequest
0 голосов
/ 18 февраля 2010

Запрос -

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

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

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

Ответы [ 4 ]

2 голосов
/ 18 февраля 2010

Создайте следующие индексы:

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)
1 голос
/ 18 февраля 2010

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

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

в предложении WHERE, однако это будет противоречить OUTER JOIN. 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'         

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

1 голос
/ 18 февраля 2010

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

0 голосов
/ 18 февраля 2010

Может

Select * FROM tbl1, tbl2
WHERE tbl1.id = tbl2.id 
AND tbl1.col1 = 'pqr' 
AND tbl2.col2 = 'zyx' 
AND tb2.col3 = 'abc'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...