为什么我的 restful api 在执行 SQL 查询时这么慢? 但是当我运行查询时它很快



我想实现的是正常长度(低于1分钟(的执行Restful API时间,我用于前端的技术是使用Angularjs和Java Spring MVC,后端是Java Spring MVC Restful API。但是它太慢了,这个只有一个只返回 2 列的 Stored 过程需要 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;
}

(太长,无法评论(

代码闻起来:

  • 不必要的封装到 TVF 中,这可能会而且我敢肯定确实会导致一些性能下降; 摆脱 TVF,在生产服务器上运行更新的查询并显示实际执行计划
  • GROUP BYGROUP BYGROUP 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听起来很可疑——viewtotal都在暗示里面发生了什么,也可能受到质疑。
  • WHERE a.GrandTotal - ISNULL(c.TD,0) <> 0我不太喜欢它
  • 之后立即将所有列透视和折叠为单个值? 枢轴有什么用?
  • SQL不是JAVA,这样的封装和代码"可重用性"正在扼杀它
  • 比较服务器和本地表结构,索引列表
  • 顺便问一下,数据库内容相等吗?或者本地主机数据库有 10 条记录,而在服务器上有数百万条记录?

如果相同的查询提供不同的性能,则您的执行计划有问题。 从本地 SSMS 执行过程时,它会使用 SSMS 设置属性。 即将ARITH_ABORT设置为开,...这不在 API 请求中。

请阅读以下文章,并在您的程序中进行必要的更改。

https://www.mssqltips.com/sqlservertip/4318/sql-server-stored-procedure-runs-fast-in-ssms-and-slow-in-application/

相关内容

  • 没有找到相关文章

最新更新