[英]Sql Query running in oracle SQL Developer But when i run the query from my JAVA program it is giving Sql exception
[英]Why my restful api is so slow while execute my SQL query? but it fast when i just run the query
我想实现的是正常的执行RESTful API时间长度(不到1分钟),我用于前端的技术是使用Angularjs和Java Spring MVC,而用于后端的是Java Spring MVC Restful API。 但是它是如此之慢,仅此一个存储过程仅返回2列就花费了5分钟以上。 我不知道我做错了什么,因为在我的本地计算机上它运行良好,但是在服务器上运行非常慢,我有其他查询比该查询复杂,并且执行速度比该查询快,这是我的查询:
[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
我的查询有问题吗?
这是我在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;
}
(评论太久了)
该代码闻起来:
GROUP BY
, GROUP BY
, GROUP BY
,..这是非常可疑的; 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
听起来可疑- view
和total
被暗示的东西是它里面怎么回事,可能会受到质疑,以及 WHERE a.GrandTotal - ISNULL(c.TD,0) <> 0
我不太喜欢 如果相同的查询提供不同的性能,则您的执行计划有问题。 从本地SSMS执行过程时,它会使用SSMS SET属性。 即SET ARITH_ABORT ON,...不在API请求中。
请阅读以下文章,并在您的程序中进行必要的更改。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.