Оптимизация SQL - PullRequest
       16

Оптимизация SQL

0 голосов
/ 06 марта 2009

Есть ли разница в производительности между этими двумя запросами. Очевидно, ГДЕ следует зарезервировать для запроса значений в таблице, чтобы они были совместимы с SQL 92, есть ли причина производительности?

SELECT
  Foo.FooId
  (
    SELECT
      Bar.BarId
    FROM
      Bar
    WHERE
      Bar.FooId = Foo.FooId
    FOR XML PATH('Bar'), TYPE 
  ) As 'Bar'
  FROM
    Foo
  FOR XML PATH('Foo'), TYPE 

и

SELECT
  Foo.FooId
  (
    SELECT
      Bar.BarId
    FROM
      Bar
    JOIN
      Foo
    ON
      Foo.FooId = Bar.FooId
    FOR XML PATH('Bar'), TYPE 
  ) As 'Bar'
  FROM
    Foo
  FOR XML PATH('Foo'), TYPE 

Аналогично, есть ли разница в производительности между этими двумя запросами?

SELECT
  Foo.FooId
FROM
  Foo
WHERE
  Foo.FooId IN
  (
    SELECT
      Bar.FooId
    FROM
      Bar
    WHERE 
      Bar.SomeField = 'SomeValue'
  )

И

SELECT
  Foo.FooId
FROM
  Foo
JOIN
  Bar
ON 
  Bar.FooId = Bar.BarId
WHERE
  Bar.SomeField = 'SomeValue'

1 Ответ

1 голос
/ 06 марта 2009

Обычно правила объединения и производительности таковы: сначала выполните INNER / OUTER / LEFT / RIGHT / CROSS JOIN, используя предложение ON, а затем, если необходимо, используйте предложение WHERE для дальнейшей фильтрации данных. Причина, по которой это более эффективно, заключается в размере таблицы. Когда вы выбираете из двух таблиц и присоединяетесь к предложению WHERE, вы делаете записи table_size_1 * table_size_2, а затем применяется предложение WHERE, чтобы получить фактическое объединение. Когда вы используете JOIN, вы сначала ограничиваете записи, тем самым уменьшая размер вашей временной таблицы. Большинство, если не все, СУБД оптимизированы для обработки JOIN ON по сравнению с WHERE.

Я не уверен, какое влияние оказывают данные XML на запрос, но при фактическом объединении таблиц оба ваших вторых примера лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...