Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么我的restful api在执行SQL查询时如此缓慢?但是,当我运行查询时,它运行得很快_Java_Sql Server_Spring Mvc_Stored Procedures_Spring Rest - Fatal编程技术网

Java 为什么我的restful api在执行SQL查询时如此缓慢?但是,当我运行查询时,它运行得很快

Java 为什么我的restful api在执行SQL查询时如此缓慢?但是,当我运行查询时,它运行得很快,java,sql-server,spring-mvc,stored-procedures,spring-rest,Java,Sql Server,Spring Mvc,Stored Procedures,Spring Rest,我想要实现的是正常长度低于1分钟的restful api执行时间,我在前端使用的技术是使用Angularjs和Java Spring MVC,而在后端使用的是Java Spring MVC restful api。但它太慢了,只返回2列的这一个存储过程需要5分钟以上。我不知道我做错了什么,因为在我的本地计算机上它工作得很好,但在服务器上它运行得很慢,我还有其他比这个复杂的查询,执行速度比这个查询快,下面是我的查询: [WEB_SP_Get_Summary] ALTER PROC

我想要实现的是正常长度低于1分钟的restful api执行时间,我在前端使用的技术是使用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;

}
评论时间过长

代码显示:

不必要的封装到TVF中,这可能并且我确信确实会导致性能下降;摆脱TVF,在prod服务器上运行更新的查询,并显示实际的执行计划 分组,分组,分组,。。这是非常可疑的; 左连接选择No_Faktur,SUMTotal_Distribusi作为TD No_faktur从Trx_DetailDistributibusi组开始将导致对Trx_DetailDistributibusi的整个扫描,而您正在对左表ViewGrandtotal应用多个过滤器,这意味着外部应用或甚至简单的左连接可以执行得更好 ViewGrandtotal听起来很可疑——view和total暗示它内部正在发生某些事情,可能也会受到质疑 其中a.GrandTotal-ISNULLc.TD,0我不太喜欢它 然后,将所有列旋转并折叠为单个值?有什么用? SQL不是JAVA,这种封装和代码重用正在扼杀它 比较服务器和本地表结构、索引列表 顺便问一下,db内容是否相等?或者说localhost数据库有10条记录,而服务器上有数百万条记录?
如果同一个查询的性能不同,那么您的执行计划就有问题。当您从本地SSMS执行过程时,它使用您的SSMS集属性。i、 将算术运算中止设置为ON。。。这在API请求中不存在

请阅读下面的文章,并对您的程序进行必要的更改


这里当然有延迟的问题。REST调用访问数据库需要时间,返回数据也需要时间。如果直接从SQL Server本地计算机执行查询或过程,几乎没有延迟。