SQL语句练习实例之十——SQL SERVER 行转列的性能测试

在数据库设计时,有时候为了实现数据规范化的目的,会将属于同一个人的属性记录值改用多条记录的方式来存储,显示时又希望将多个属性数据合并成一行来显示,这就是行转列。

例如:下图的成绩记录表。

 

那么行转列的效率又将如何呢?我试了以下三种方式进行行转列的测试。测试数据表中的记录数量为120万条,字段为10个,测试下来感觉性能还不错。

一、第一种方式(SQL 2000以后的版本)

 

--总计120万记录
SELECT wbook_no      
       , MAX(CASE WHEN [COP_G_NO] ='60174257' THEN AR END) "60174257"
       , MAX(CASE WHEN [COP_G_NO] ='50165814' THEN AR END) "50165814"
       , MAX(CASE WHEN [COP_G_NO] ='10221553' THEN AR END) "10221553"
FROM 
    (
     SELECT [COP_G_NO]
           , wbook_no
           , SUM(G_QTY * decl_Price) AR
     FROM WBK_PDE_LIST
     WHERE [COP_G_NO] in('60174257','50165814','10221553')
     GROUP BY [COP_G_NO]
               , wbook_no   
     ) A
GROUP BY wbook_no

 

二、第二种方式(SQL 2000以后的版本)

SELECT wbook_no
, SUM(
     CASE WHEN [COP_G_NO] ='60174257' THEN G_QTY * decl_Price END) "60174257"
, SUM(
     CASE WHEN [COP_G_NO] ='50165814' THEN  G_QTY * decl_Price  END) "50165814"
, SUM(
      CASE WHEN [COP_G_NO] ='10221553' THEN  G_QTY * decl_Price  END) "10221553"
FROM WBK_PDE_LIST 
WHERE 1=1
      and [COP_G_NO] in('60174257','50165814','10221553')
GROUP BY wbook_no

 

三、第三种方式:使用PIVOT命令来实现(SQL 2005以后的版本才提供以命令)

SELECT WBOOK_NO
       , "60174257"
       , "50165814"
       , "10221553"
FROM 
  (
  SELECT [COP_G_NO]
        , WBOOK_NO
        , G_QTY * decl_Price AR
  FROM WBK_PDE_LIST
  WHERE 1=1
        AND [COP_G_NO] in('60174257','50165814','10221553')
  )AS D
PIVOT
  (
  SUM(AR) 
  FOR [COP_G_NO] in([60174257],[50165814],"10221553")
  ) AS P

 

 

四、以上三种方式的查询结果都如下:

 

五、最后我们来比对一下各自性能损耗。从比对结果表来看三者的差别不大,总的来说都在2-3秒之间。

 

IO

CPU

逻辑读取

物理读取

预读

CPU 时间

占用时间

 
 

表扫描

计算标题

排序

表扫描

计算标题

排序

ms

ms

 

第一种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

370

23827

635

2216

 

第二种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

374

23827

618

2171

 

第三种方式

17.652

0

0.0112513

1.33851

0.121668

0.0131525

23827

370

23827

563

1960

 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值