代码之家  ›  专栏  ›  技术社区  ›  L. Holanda

使用带有左连接和分区的分析

  •  1
  • L. Holanda  · 技术社区  · 14 年前

    我有两个不同的查询产生相同的结果。我想知道哪一个更有效。第二个,我用一个 选择 条款较少,但我正在移动 哪里 到外面选择。哪个先被处决?这个 左连接 或者 哪里 条款?

    使用3“选择”:

    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;
    

    附言:我知道,我知道“选星”是邪恶的,但我写它的方式只是为了让它变小。

    1 回复  |  直到 14 年前
        1
  •  1
  •   Jeremy Wiggins    14 年前

    “我想知道哪个更有效”

    通过打开统计,你可以很容易地自己回答这个问题。

    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)并运行查询。这有助于回答关于死刑执行顺序的问题;我无法直接告诉你。