Использование аналитики с левым соединением и разделением - PullRequest
1 голос
/ 09 октября 2010

У меня есть два разных запроса, которые дают одинаковые результаты. Интересно, какой из них более эффективен? Во-вторых, я использую на один пункт select меньше, но я перемещаю , где , к выбору. Какой из них выполняется первым? Предложение left join или предложение where ?

Использование 3 «select»:

select * from
(
  select * from
  (
    select
      max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT,
      t.*  
    from
      PRICE_TABLE t
  ) a
  where
    a.PRICE_DATETIME = a.LATEST_SNAPSHOT;
) r
left join
  PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME)

Используя 2 выбора:

select * from
(
  select
    max(t.PRICE_DATETIME) over (partition by t.PRODUCT_ID) as LATEST_SNAPSHOT,
    t.*
  from
    PRICE_TABLE t
) r
left join
  PRODUCT_TABLE l on (r.PRODUCT_ID = l.PRODUCT_ID and r.PRICE_DATETIME = l.PRICE_DATETIME)
where
  r.PRICE_DATETIME = r.LATEST_SNAPSHOT;

ps: я знаю, я знаю, "выберите звезду" - это зло, но я пишу это так только здесь, чтобы уменьшить его.

1 Ответ

1 голос
/ 09 октября 2010

«Интересно, какой из них более эффективен»

Вы можете довольно легко ответить на этот вопрос, включив статистику.

set statistics io on
set statistics time on

-- query goes here

set statistics io off
set statistics time off

Сделайте это для каждого из ваших двух запросов и сравнитерезультаты, достижения.Вы получите полезный вывод о том, сколько операций чтения выполняет SQL Server, сколько миллисекунд каждая требуется для завершения и т. Д.

Вы также можете увидеть план выполнения, который генерирует SQL Server, при просмотре предполагаемого плана выполнения (ctrl +L или щелкните правой кнопкой мыши и выберите эту опцию) или включив «Показать фактический план выполнения» (Ctrl + M) и запустив запросы.Это может помочь ответить на вопрос о порядке исполнения;Я не мог сказать вам, от макушки головы.

...