[英]Why my restful api is so slow while execute my SQL query? but it fast when i just run the query
what i would like to achieve is normal length (below 1 minute) of execution restful api time, what my technology that i am using for front end is using Angularjs and Java Spring MVC and for the back end is Java Spring MVC Restful API. 我想实现的是正常的执行RESTful API时间长度(不到1分钟),我用于前端的技术是使用Angularjs和Java Spring MVC,而用于后端的是Java Spring MVC Restful API。 But it so slow, it takes more than 5 minute for this only one Stored procedure that only return 2 column. 但是它是如此之慢,仅此一个存储过程仅返回2列就花费了5分钟以上。 I dunno what i do wrong, because in my local computer it just work fine, but on the server it run very slow, i have other query that complex than this one and it execute faster than this query, here is my query looked like : 我不知道我做错了什么,因为在我的本地计算机上它运行良好,但是在服务器上运行非常慢,我有其他查询比该查询复杂,并且执行速度比该查询快,这是我的查询:
[WEB_SP_Get_Summary]
ALTER PROCEDURE [dbo].[WEB_SP_Get_Summary]
@Kd_Plg VARCHAR(50)='KLOP001',
@Kd_Lokasi VARCHAR(3)='WAT'
AS
BEGIN
SELECT CONVERT(VARCHAR(11),TglJthTempo,106) AS TglJthTempo,
ISNULL(SUM(PHILIP),0) + ISNULL(SUM(KIM),0) + ISNULL(SUM(HOLIC),0) + ISNULL(SUM(OSRAM),0) + ISNULL(SUM(PANASONIC),0) + ISNULL(SUM([MEGAMEN]),0) AS total_next
FROM
dbo.WEB_F_Dashboard_Get_SisaHutang(@Kd_Plg,@Kd_Lokasi)
WHERE (TglJthTempo>=GETDATE())
GROUP BY Kd_Plg,TglJthTempo
END
Here is my table valued function :
ALTER FUNCTION [dbo].[WEB_F_Dashboard_Get_SisaHutang]
(
@Kd_Plg VARCHAR(7),
@Kd_Lokasi VARCHAR(3)
)
RETURNS @SisaHutang TABLE
(
Kd_Plg VARCHAR(7),
TglJthTempo DATETIME,
PHILIP MONEY,
KIM MONEY,
HOLIC MONEY,
OSRAM MONEY,
PANASONIC MONEY,
MEGAMEN MONEY
)
AS
BEGIN
INSERT INTO @SisaHutang(TglJthTempo,Kd_Plg,PHILIP,KIM,HOLIC,OSRAM,PANASONIC,MEGAMEN)
SELECT Tgl_JatuhTempo, Kd_Plg, PHILIP, KIM, HOLIC, OSRAM, PANASONIC, MEGAMEN FROM
(SELECT a.Divisi,SUM(a.Grandtotal-ISNULL(c.TD,0)) AS sisa_faktur
,a.Tgl_JatuhTempo,a.Kd_Plg
FROM ViewGrandtotal a LEFT JOIN (SELECT No_Faktur, SUM(Total_Distribusi) AS TD
FROM Trx_DetailDistribusi GROUP BY No_faktur) c ON a.No_Faktur=c.No_faktur
WHERE a.GrandTotal - ISNULL(c.TD,0) <> 0
AND a.Cut_Off = 'A' and a.Kd_Trn='J'
AND a.Kd_Plg = @Kd_Plg
AND a.kd_lokasi = @Kd_Lokasi
GROUP BY a.Divisi, a.Kd_Plg,a.Tgl_JatuhTempo) s
PIVOT
(SUM(sisa_faktur)
FOR Divisi IN (PHILIP,KIM,HOLIC,OSRAM,PANASONIC,MEGAMEN)) AS pvt
RETURN
END
is there something wrong with my query? 我的查询有问题吗?
and here is how i do request in my java application : 这是我在Java应用程序中的要求方式:
public List<DashboardPiutangAkanDatang> getDashboardPiutangAkanDatang(String Kd_Plg, String Kd_Lokasi) throws DataAccessException {
Map<String, Object> params = new HashMap<String, Object>();
params.put("Kd_Plg", Kd_Plg);
params.put("Kd_Lokasi", Kd_Lokasi);
ArrayList<DashboardPiutangAkanDatang> dashboard = (ArrayList<DashboardPiutangAkanDatang>) this.namedParameterJdbcTemplate.query
("EXEC WEB_SP_Get_Summary :Kd_Plg, :Kd_Lokasi", params, BeanPropertyRowMapper.newInstance(DashboardPiutangAkanDatang.class));
return dashboard;
}
(too long for comment) (评论太久了)
The code smells: 该代码闻起来:
GROUP BY
, GROUP BY
, GROUP BY
,.. which is very suspicious; GROUP BY
, GROUP BY
, GROUP BY
,..这是非常可疑的; LEFT JOIN (SELECT No_Faktur, SUM(Total_Distribusi) AS TD FROM Trx_DetailDistribusi GROUP BY No_faktur)
will cause entire scan of Trx_DetailDistribusi
whereas you're applying several filters to the left table ViewGrandtotal
which means OUTER APPLY
or even simple LEFT JOIN
could perform much better LEFT JOIN (SELECT No_Faktur, SUM(Total_Distribusi) AS TD FROM Trx_DetailDistribusi GROUP BY No_faktur)
将导致整个扫描Trx_DetailDistribusi
而你申请几个过滤器,以左表ViewGrandtotal
这意味着OUTER APPLY
甚至简单的LEFT JOIN
可能性能要好得多 ViewGrandtotal
sounds suspicious - view
and total
are hinting that something is going on inside it and may be questioned as well ViewGrandtotal
听起来可疑- view
和total
被暗示的东西是它里面怎么回事,可能会受到质疑,以及 WHERE a.GrandTotal - ISNULL(c.TD,0) <> 0
I don't like it very much WHERE a.GrandTotal - ISNULL(c.TD,0) <> 0
我不太喜欢 If same query giving different performance then something is wrong with your execution plan. 如果相同的查询提供不同的性能,则您的执行计划有问题。 when you are executing procedure from your Local SSMS, it uses your SSMS SET Properties. 从本地SSMS执行过程时,它会使用SSMS SET属性。 ie SET ARITH_ABORT ON, ... which doesn't in API request. 即SET ARITH_ABORT ON,...不在API请求中。
Please read below article and make required changes in your procedure. 请阅读以下文章,并在您的程序中进行必要的更改。
https://www.mssqltips.com/sqlservertip/4318/sql-server-stored-procedure-runs-fast-in-ssms-and-slow-in-application/ https://www.mssqltips.com/sqlservertip/4318/sql-server-stored-procedure-runs-fast-in-ssms-and-slow-in-application/
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.