AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • 主页
  • 系统&网络
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • 主页
  • 系统&网络
    • 最新
    • 热门
    • 标签
  • Ubuntu
    • 最新
    • 热门
    • 标签
  • Unix
    • 最新
    • 标签
  • DBA
    • 最新
    • 标签
  • Computer
    • 最新
    • 标签
  • Coding
    • 最新
    • 标签
主页 / dba / 问题 / 202359
Accepted
Giri Bkm
Giri Bkm
Asked: 2018-03-27 18:42:56 +0800 CST2018-03-27 18:42:56 +0800 CST 2018-03-27 18:42:56 +0800 CST

如何知道该执行计划是否适合此查询(Sql server 2005)?

  • 772

这是我的查询。

Declare
    @Pivv NVarchar(Max),
    @Query NVarchar(Max),
    @Pivv1 NVarchar(Max),
    @Columns NVarchar(Max)

Select
    @Pivv = Coalesce(@Pivv + ',' , '') + 
            Quotename(MatchType + '_' + '_Name'),
    @Pivv1 = Coalesce(@Pivv1 + ',' , '') + 
             Quotename('HighestRunsAndWicketsIn' + MatchType),
    @Columns = Isnull(@Columns + ',', '') +
               'Max(' + (MatchType + '_' + '_Name') + ') As ' + (MatchType + '_' + '_Name') +
               ',' +
               'Max(' + ('HighestRunsAndWicketsIn' + MatchType) + ') As ' + ('HighestRunsAndWicketsIn' + MatchType)
From
    PlayersCareerBatting t Join PlayersBioDataNew a
On
    t.Id=a.Id
Group By
    MatchType

Set @Query=
        'Select
            ''Batting'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Runs1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    RunsScored As Runs
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName, 
                            MatchType, 
                            RunsScored
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    RunsScored, 
                                    Row_Number() Over(Partition By MatchType Order By RunsScored Desc) rn
                                From 
                                    PlayersCareerBatting s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x
                        Where rn=1
                     ) x2
             ) x3
        Pivot 
            (
                Max(Runs1) For Type1 In (' + @Pivv + ')
            ) x4
        Pivot
            (
                Max(Runs) For Type In (' + @Pivv1 + ')
            ) x5

        Union All

        Select
            ''Bowling'',
            ' + @Columns + '
        From (
                Select
                    MatchType + ''_'' + ''_Name'' As Type1,
                    FirstName + '' '' + MiddleName + '' '' + LastName As Wickets1,
                    ''HighestRunsAndWicketsIn'' + MatchType As Type,
                    Wickets As Wickets
                From ( 
                        Select 
                            FirstName, 
                            MiddleName,
                            LastName,
                            MatchType, 
                            Wickets
                        From (
                                Select 
                                    s.Id, 
                                    FirstName, 
                                    MiddleName,
                                    LastName, 
                                    MatchType, 
                                    Wickets, 
                                    Row_Number() Over(Partition By MatchType Order By Wickets Desc) rn
                                From 
                                    PlayersBowlingCareer s Join PlayersBioDataNew a 
                                On s.Id=a.Id
                             ) x6
                        Where rn=1
                     ) x7
             ) x8 
        Pivot 
            (
                Max(Wickets1) For Type1 In (' + @Pivv + ')
            ) x9
        Pivot
            (
                Max(Wickets) For Type In (' + @Pivv1 + ')
            ) x10'

Exec(@Query)

查询包含 3 个表。Playersbiodatanew(5000 行),players?careerbatting(20000 行),playersbowlingcareer(20000 行)。而且,我在该查询中创建了数据透视表。现在我想知道,该查询是否更适合下面提到的执行计划

执行计划

执行计划

执行计划

执行计划链接,https://www.brentozar.com/pastetheplan/?id=SyJPRDs9M

样本数据

对于桌上玩家BioDataNew

Id | Firstname | middlename | lastname
----------------------------------------
1  | Sachin    | Ramesh     | Tendulkar
----------------------------------------
2  | Suresh    | Kumar      | Raina
----------------------------------------

对于桌上玩家职业击球

CareerId | Id | Matchtype | runsscored
---------------------------------------
1        | 1  | Test      | 15921
----------------------------------------
2        | 1  | ODI       | 18426
----------------------------------------
3        | 1  | T20I      | 10
----------------------------------------
4        | 1  | IPL       | 2334
----------------------------------------
5        | 2  | Test      | 768
----------------------------------------
6        | 2  | ODI       | 5568
----------------------------------------
7        | 2  | T20I      | 1498
----------------------------------------
8        | 2  | IPL       | 4540
----------------------------------------

对于桌球运动员保龄球职业

CareerId | Id | Matchtype | wickets
---------------------------------------
1        | 1  | Test      | 46
----------------------------------------
2        | 1  | ODI       | 154
----------------------------------------
3        | 1  | T20I      | 1
----------------------------------------
4        | 1  | IPL       | 0
----------------------------------------
5        | 2  | Test      | 13
----------------------------------------
6        | 2  | ODI       | 36
----------------------------------------
7        | 2  | T20I      | 13
----------------------------------------
8        | 2  | IPL       | 25
----------------------------------------

预期产出

(No Column Name) | IPL__Name | HighestRunsAndWicketsInIPL | Test__Name | HighestRunsAndWicketsInTest | T20I__Name | HighestRunsAndWicketsInT20I | ODI__Name | HighestRunsAndWicketsInODI
----------------------------------------------------------------------------
Batting | Suresh Kumar Raina | 4540 | Sachin Ramesh Tendulkar | 15921 | Suresh Kumar Raina | 1498 | Sachin Ramesh Tendulkar | 18426
----------------------------------------------------------------------------
Bowling | Suresh Kumar Raina | 25 | Sachin Ramesh Tendulkar | 46 | Suresh Kumar Raina | 13 | Sachin Ramesh Tendulkar | 154
----------------------------------------------------------------------------

我得到了每个匹配类型获得最大跑分和小门的输出。

sql-server sql-server-2005
  • 1 1 个回答
  • 131 Views

1 个回答

  • Voted
  1. Best Answer
    KumarHarsh
    2018-03-27T22:16:54+08:002018-03-27T22:16:54+08:00

    最终输出有多少行?

    从您的脚本中无法确定哪一列属于哪个表。

    您应该在表别名前加上列

    替代解决方案,

    Since you are using `PlayersBioDataNew` in 3 places.Why not insert them in temp table and use temp table instead
    
    create table #tmp (id int, rn int,matchtype int, wickets int)
    
    insert into #tmp
    select id, Row_Number() Over(Partition By MatchType Order By Wickets Desc) rn
    ,MatchType,wickets
     from  dbo.PlayersBioDataNew
     -- where apply other filter
     -- may be apply rn=1 here itself if it help in all 3 places
    
     --so depeding upon final script we can create index on #tmp table
    
     Declare
        @Pivv NVarchar(Max),
        @Query NVarchar(Max),
        @Pivv1 NVarchar(Max),
        @Columns NVarchar(Max)
    
    Select
        @Pivv = Coalesce(@Pivv + ',' , '') + 
                Quotename(MatchType + '_' + '_Name'),
        @Pivv1 = Coalesce(@Pivv1 + ',' , '') + 
                 Quotename('HighestRunsAndWicketsIn' + MatchType),
        @Columns = Isnull(@Columns + ',', '') +
                   'Max(' + (MatchType + '_' + '_Name') + ') As ' + (MatchType + '_' + '_Name') +
                   ',' +
                   'Max(' + ('HighestRunsAndWicketsIn' + MatchType) + ') As ' + ('HighestRunsAndWicketsIn' + MatchType)
    From
        PlayersCareerBatting t Join #tmp a
    On
        t.Id=a.Id
    Group By
        MatchType
    
    Set @Query=
            'Select
                ''Batting'',
                ' + @Columns + '
            From (
                    Select
                        MatchType + ''_'' + ''_Name'' As Type1,
                        FirstName + '' '' + MiddleName + '' '' + LastName As Runs1,
                        ''HighestRunsAndWicketsIn'' + MatchType As Type,
                        RunsScored As Runs
                    From ( 
    
                                    Select 
                                        FirstName, 
                                        MiddleName,
                                        LastName, 
                                        MatchType, 
                                        RunsScored
                                    From 
                                        PlayersCareerBatting s Join #tmp a 
                                    On s.Id=a.Id
                                    Where rn=1
    
    
                         ) x2
                 ) x3
            Pivot 
                (
                    Max(Runs1) For Type1 In (' + @Pivv + ')
                ) x4
            Pivot
                (
                    Max(Runs) For Type In (' + @Pivv1 + ')
                ) x5
    
            Union All
    
            Select
                ''Bowling'',
                ' + @Columns + '
            From (
                    Select
                        MatchType + ''_'' + ''_Name'' As Type1,
                        FirstName + '' '' + MiddleName + '' '' + LastName As Wickets1,
                        ''HighestRunsAndWicketsIn'' + MatchType As Type,
                        Wickets As Wickets
                    From ( 
    
                                    Select 
                                        FirstName, 
                                        MiddleName,
                                        LastName,
                                        MatchType, 
                                        Wickets
                                    From 
                                        PlayersBowlingCareer s Join #tmp a 
                                    On s.Id=a.Id
                                    Where rn=1
    
    
                         ) x7
                 ) x8 
            Pivot 
                (
                    Max(Wickets1) For Type1 In (' + @Pivv + ')
                ) x9
            Pivot
                (
                    Max(Wickets) For Type In (' + @Pivv1 + ')
                ) x10'
    
    Exec(@Query)
    

    在任何情况下都使用 sp_executesql

    • 2

相关问题

  • 我需要为每种类型的查询使用单独的索引,还是一个多列索引可以工作?

  • 什么时候应该使用唯一约束而不是唯一索引?

  • 死锁的主要原因是什么,可以预防吗?

  • 如何确定是否需要或需要索引

  • 从 SQL Server 2008 降级到 2005

Sidebar

Stats

  • 问题 205573
  • 回答 270741
  • 最佳答案 135370
  • 用户 68524
  • 热门
  • 回答
  • Marko Smith

    连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目

    • 12 个回答
  • Marko Smith

    如何让sqlplus的输出出现在一行中?

    • 3 个回答
  • Marko Smith

    选择具有最大日期或最晚日期的日期

    • 3 个回答
  • Marko Smith

    如何列出 PostgreSQL 中的所有模式?

    • 4 个回答
  • Marko Smith

    列出指定表的所有列

    • 5 个回答
  • Marko Smith

    如何在不修改我自己的 tnsnames.ora 的情况下使用 sqlplus 连接到位于另一台主机上的 Oracle 数据库

    • 4 个回答
  • Marko Smith

    你如何mysqldump特定的表?

    • 4 个回答
  • Marko Smith

    使用 psql 列出数据库权限

    • 10 个回答
  • Marko Smith

    如何从 PostgreSQL 中的选择查询中将值插入表中?

    • 4 个回答
  • Marko Smith

    如何使用 psql 列出所有数据库和表?

    • 7 个回答
  • Martin Hope
    Jin 连接到 PostgreSQL 服务器:致命:主机没有 pg_hba.conf 条目 2014-12-02 02:54:58 +0800 CST
  • Martin Hope
    Stéphane 如何列出 PostgreSQL 中的所有模式? 2013-04-16 11:19:16 +0800 CST
  • Martin Hope
    Mike Walsh 为什么事务日志不断增长或空间不足? 2012-12-05 18:11:22 +0800 CST
  • Martin Hope
    Stephane Rolland 列出指定表的所有列 2012-08-14 04:44:44 +0800 CST
  • Martin Hope
    haxney MySQL 能否合理地对数十亿行执行查询? 2012-07-03 11:36:13 +0800 CST
  • Martin Hope
    qazwsx 如何监控大型 .sql 文件的导入进度? 2012-05-03 08:54:41 +0800 CST
  • Martin Hope
    markdorison 你如何mysqldump特定的表? 2011-12-17 12:39:37 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 对 SQL 查询进行计时? 2011-06-04 02:22:54 +0800 CST
  • Martin Hope
    Jonas 如何从 PostgreSQL 中的选择查询中将值插入表中? 2011-05-28 00:33:05 +0800 CST
  • Martin Hope
    Jonas 如何使用 psql 列出所有数据库和表? 2011-02-18 00:45:49 +0800 CST

热门标签

sql-server mysql postgresql sql-server-2014 sql-server-2016 oracle sql-server-2008 database-design query-performance sql-server-2017

Explore

  • 主页
  • 问题
    • 最新
    • 热门
  • 标签
  • 帮助

Footer

AskOverflow.Dev

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve