【问题标题】:SQL Server. Join/Pivot/Performance help pleaseSQL 服务器。请加入/枢轴/性能帮助
【发布时间】:2010-11-18 04:54:23
【问题描述】:

我创建了这个视图,它的查询速度非常慢,并且会产生性能问题。我认为我需要使用 PIVOT,但我无法真正理解它......

这是我目前所拥有的。

select
    p.instrumentsettingsid,
    sum(case when p1.id is null then 0 else 1 end) as 'Cash',
    sum(case when p2.id is null then 0 else 1 end) as HighInterest,
    sum(case when p3.id is null then 0 else 1 end) as 'ML Loan',
    sum(case when p4.id is null then 0 else 1 end) as 'Investment Note',
    sum(case when p5.id is null then 0 else 1 end) as 'Trading',
    sum(case when p6.id is null then 0 else 1 end) as 'DD Trading',
    sum(case when p7.id is null then 0 else 1 end) as 'ML Trading',
    sum(case when p8.id is null then 0 else 1 end) as 'NMLTrading',
    sum(case when p9.id is null then 0 else 1 end) as 'Individual Custody',
    sum(case when p10.id is null then 0 else 1 end) as 'ML Individual Custody',
    sum(case when p11.id is null then 0 else 1 end) as 'Custody',
    sum(case when p12.id is null then 0 else 1 end) as 'ML Custody Trading',
    sum(case when p13.id is null then 0 else 1 end) as 'Portfolio',
    sum(case when p14.id is null then 0 else 1 end) as 'ML Personal Portfolio',
    sum(case when p15.id is null then 0 else 1 end) as Other,
    i.status
from
    (select distinct instrumentsettingsid from res_db..instrumentproducttypepermissions) p
    inner join res_db..instrumentsettings i on p.instrumentsettingsid = i.id
    left join res_db..instrumentproducttypepermissions p1 on p.instrumentsettingsid = p1.instrumentsettingsid and p1.enabled = 1 and p1.producttypeid = 1
    left join res_db..instrumentproducttypepermissions p2 on p.instrumentsettingsid = p2.instrumentsettingsid and p2.enabled = 1 and p2.producttypeid = 2
    left join res_db..instrumentproducttypepermissions p3 on p.instrumentsettingsid = p3.instrumentsettingsid and p3.enabled = 1 and p3.producttypeid = 3
    left join res_db..instrumentproducttypepermissions p4 on p.instrumentsettingsid = p4.instrumentsettingsid and p4.enabled = 1 and p4.producttypeid = 4
    left join res_db..instrumentproducttypepermissions p5 on p.instrumentsettingsid = p5.instrumentsettingsid and p5.enabled = 1 and p5.producttypeid = 5
    left join res_db..instrumentproducttypepermissions p6 on p.instrumentsettingsid = p6.instrumentsettingsid and p6.enabled = 1 and p6.producttypeid = 6
    left join res_db..instrumentproducttypepermissions p7 on p.instrumentsettingsid = p7.instrumentsettingsid and p7.enabled = 1 and p7.producttypeid = 7
    left join res_db..instrumentproducttypepermissions p8 on p.instrumentsettingsid = p8.instrumentsettingsid and p8.enabled = 1 and p8.producttypeid = 8
    left join res_db..instrumentproducttypepermissions p9 on p.instrumentsettingsid = p9.instrumentsettingsid and p9.enabled = 1 and p9.producttypeid = 9
    left join res_db..instrumentproducttypepermissions p10 on p.instrumentsettingsid = p10.instrumentsettingsid and p10.enabled = 1 and p10.producttypeid = 10
    left join res_db..instrumentproducttypepermissions p11 on p.instrumentsettingsid = p11.instrumentsettingsid and p11.enabled = 1 and p11.producttypeid = 11
    left join res_db..instrumentproducttypepermissions p12 on p.instrumentsettingsid = p12.instrumentsettingsid and p12.enabled = 1 and p12.producttypeid = 12
    left join res_db..instrumentproducttypepermissions p13 on p.instrumentsettingsid = p13.instrumentsettingsid and p13.enabled = 1 and p13.producttypeid = 13
    left join res_db..instrumentproducttypepermissions p14 on p.instrumentsettingsid = p14.instrumentsettingsid and p14.enabled = 1 and p14.producttypeid = 14
    left join res_db..instrumentproducttypepermissions p15 on p.instrumentsettingsid = p15.instrumentsettingsid and p15.enabled = 1 and p15.producttypeid = 15
    group by p.instrumentsettingsid, i.status

知道 SQL 的人可以告诉我(告诉我吗?)我怎样才能使它更快/不那么可怕。

此外,这 15 个帐户名称是硬编码的,在理想情况下,它会从表 producttypes 中获取产品名称

很抱歉问了这么烦人的问题。

谢谢!

【问题讨论】:

    标签: sql sql-server performance join pivot


    【解决方案1】:

    用途:

      SELECT p.instrumentsettingsid,
             i.status,
             SUM(CASE WHEN p.producttypeid = 1 THEN 1 ELSE 0 END) as 'Cash',
             SUM(CASE WHEN p.producttypeid = 2 THEN 1 ELSE 0 END) as HighInterest,
             SUM(CASE WHEN p.producttypeid = 3 THEN 1 ELSE 0 END) as 'ML Loan',
             SUM(CASE WHEN p.producttypeid = 4 THEN 1 ELSE 0 END) as 'Investment Note',
             SUM(CASE WHEN p.producttypeid = 5 THEN 1 ELSE 0 END) as 'Trading',
             SUM(CASE WHEN p.producttypeid = 6 THEN 1 ELSE 0 END) as 'DD Trading',
             SUM(CASE WHEN p.producttypeid = 7 THEN 1 ELSE 0 END) as 'ML Trading',
             SUM(CASE WHEN p.producttypeid = 8 THEN 1 ELSE 0 END) as 'NMLTrading',
             SUM(CASE WHEN p.producttypeid = 9 THEN 1 ELSE 0 END) as 'Individual Custody',
             SUM(CASE WHEN p.producttypeid = 10 THEN 1 ELSE 0 END) as 'ML Individual Custody',
             SUM(CASE WHEN p.producttypeid = 11 THEN 1 ELSE 0 END) as 'Custody',
             SUM(CASE WHEN p.producttypeid = 12 THEN 1 ELSE 0 END) as 'ML Custody Trading',
             SUM(CASE WHEN p.producttypeid = 13 THEN 1 ELSE 0 END) as 'Portfolio',
             SUM(CASE WHEN p.producttypeid = 14 THEN 1 ELSE 0 END) as 'ML Personal Portfolio',
             SUM(CASE WHEN p.producttypeid = 15 THEN 1 ELSE 0 END) as Other,
        FROM res_db..instrumentproducttypepermissions p
        JOIN res_db..instrumentsettings i ON i.id = p.instrumentsettingsid
       WHERE p.enabled = 1
         AND p.producttypeid BETWEEN 1 AND 15
    GROUP BY p.instrumentsettingsid, i.status
    

    不需要左连接...

    另外,这 15 个帐户名称是硬编码的,在理想情况下,它会从表 producttypes 中获取产品名称

    动态列需要dynamic SQL

    【讨论】:

    • 早上好,今天好吗?
    • @astander:平时 - 你呢?
    • 好,这里开始入夏了,天气真好。这个问题让我看了不寒而栗。你是对的,不需要加入15次...
    • @astander:在你的大脑半球——我们有大风警告,并且有可能下雪/阵风。是的,OPs 版本过于复杂:/
    【解决方案2】:

    即使使用 Sql Server PIVOT,您也必须事先知道列名,所以没有运气,除非您使用 Pivots with Dynamic ColumnsDynamic PIVOT

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-04-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-06
      • 1970-01-01
      相关资源
      最近更新 更多