首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >组合不同count(*) sql查询的结果

组合不同count(*) sql查询的结果
EN

Stack Overflow用户
提问于 2015-08-16 13:15:06
回答 3查看 48关注 0票数 2

我编写了一个从microsoft数据库检索数据的查询。目标是在细分表示的区域中计算带有图片的账单数量和账单总数,我编写的查询工作良好,但获取结果需要很长时间。在普通pc上,大约需要4-5分钟,而在内存较高的pc上,则需要不到一分钟的时间。因为我不是sql方面的专家,所以如果可能的话,我需要帮助优化我的查询。这是查询,如果可以进一步优化,请告诉我。

代码语言:javascript
复制
SELECT [sub division], 
       [total bills], 
       [pic bills], 
       ( ( t1.[pic bills] * 100 ) / t2.[total bills] ) AS '%' 
FROM   (SELECT gbsdiv   AS 'Sub Division', 
               Count(*) AS 'Pic Bills' 
        FROM   tblgbmain 
        WHERE  ( gbpicture1 IS NOT NULL 
                  OR gbpicture2 IS NOT NULL ) 
               AND gbbatch = 15 
        GROUP  BY gbsdiv) t1 
       INNER JOIN (SELECT gbsdiv   AS 'Sub Division1', 
                          Count(*) AS 'Total Bills' 
                   FROM   tblgbmain 
                   WHERE  gbsdiv IN (SELECT gbsdiv 
                                     FROM   tblgbmain 
                                     WHERE  ( gbpicture1 IS NOT NULL 
                                               OR gbpicture2 IS NOT NULL ) 
                                            AND gbbatch = 15 
                                     GROUP  BY gbsdiv) 
                          AND gbbatch = 15 
                   GROUP  BY gbsdiv) t2 
               ON t1.[sub division] = t2.[sub division1] 

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-08-16 13:44:58

尝试将临时结果存储到索引表中:

代码语言:javascript
复制
declare @PicBills table (
    SubDivision     int not null primary key clustered,
    PicBillsCount   int not null
)

declare @TotalBills table (
    SubDivision     int not null primary key clustered,
    TotalBillsCount int not null
)

insert into @PicBills
select 
    gbsdiv ,
    count(*)
from   
    tblgbmain 
where  
    ( gbpicture1 is not null or gbpicture2 is not null ) and gbbatch = 15 
group by 
    gbsdiv;


insert into @TotalBills
select 
    gbsdiv ,
    count(*)
from   
    @PicBills pb
    inner join tblgbmain on gbsdiv = SubDivision
where  
    gbbatch = 15 
group by 
    gbsdiv;

select 
    [sub division]  =   t1.SubDivision  , 
    [total bills]   =   TotalBillsCount , 
    [pic bills]     =   PicBillsCount   , 
    [%]             =   PicBillsCount * 100 / TotalBillsCount  
from   
    @PicBills t1 
    inner join @TotalBills t2 on t1.SubDivision = t2.SubDivision;
票数 1
EN

Stack Overflow用户

发布于 2015-08-16 13:28:54

有时候,中断查询也会给您带来更好的性能。还检查执行计划的内容,并创建缺少的索引。

很可能您必须在non clustered上创建gbbatch, gbpicture1, gbpicture2索引,包括gbsdiv作为覆盖索引。

代码语言:javascript
复制
SELECT gbsdiv   AS 'Sub Division', 
       Count(*) AS 'Pic Bills' 
INTO   #temp 
FROM   tblgbmain 
WHERE  ( gbpicture1 IS NOT NULL 
          OR gbpicture2 IS NOT NULL ) 
       AND gbbatch = 15 
GROUP  BY gbsdiv 

SELECT t1.[sub division], 
       [total bills], 
       [pic bills], 
       ( ( t1.[pic bills] * 100 ) / t2.[total bills] ) AS '%' 
FROM   #temp t1 
       INNER JOIN (SELECT gbsdiv   AS 'Sub Division1', 
                          Count(*) AS 'Total Bills' 
                   FROM   tblgbmain t 
                   WHERE  EXISTS (SELECT 1 
                                  FROM   #temp te 
                                  WHERE  t.gbsdiv = te.[Sub Division])
                   Group by gbsdiv ) t2 
               ON t1.[sub division] = t2.[sub division1] 
票数 1
EN

Stack Overflow用户

发布于 2015-08-16 15:39:27

也许使用CTE将有助于加快整个查询的速度?类似于:

代码语言:javascript
复制
WITH t1 AS (
 SELECT gbsdiv   AS 'Sub Division', 
        Count(*) AS 'Pic Bills' 
        FROM   tblgbmain 
        WHERE  ( gbpicture1 IS NOT NULL 
              OR gbpicture2 IS NOT NULL ) 
        AND gbbatch = 15 
        GROUP  BY gbsdiv
)
SELECT [Sub Division], 
       [total bills], 
       [pic bills], 
       ( ( [pic bills] * 100 ) / [total bills] ) AS '%' 
FROM  t1 
INNER JOIN (
  SELECT gbsdiv   AS 'Sub Division1', 
         Count(*) AS 'Total Bills' 
  FROM   tblgbmain 
  WHERE  EXISTS ( SELECT 1 FROM t1 WHERE gbsdiv=[Sub Division] )
  AND gbbatch = 15
  GROUP BY gbsdiv ) AS t2
ON [Sub Division] = [Sub Division1]

这里有一个关于stackexchange数据的演示(appr )。( 这里 )。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32035455

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档