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

发布于 2015-08-16 13:44:58
尝试将临时结果存储到索引表中:
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;发布于 2015-08-16 13:28:54
有时候,中断查询也会给您带来更好的性能。还检查执行计划的内容,并创建缺少的索引。
很可能您必须在non clustered上创建gbbatch, gbpicture1, gbpicture2索引,包括gbsdiv作为覆盖索引。
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] 发布于 2015-08-16 15:39:27
也许使用CTE将有助于加快整个查询的速度?类似于:
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 )。( 这里 )。
https://stackoverflow.com/questions/32035455
复制相似问题