簡體   English   中英

為什么執行SQL查詢時我的靜態API如此慢? 但是當我只是運行查詢時它很快

[英]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;

}

(評論太久了)

該代碼聞起來:

  • 不必要地封裝到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,這種封裝和代碼“可重用性”正在殺死它
  • 比較服務器和本地表結構,索引列表
  • 順便說一句,數據庫內容相等嗎? 還是localhost db擁有10條記錄,而服務器上有數百萬條記錄?

如果相同的查詢提供不同的性能,則您的執行計划有問題。 從本地SSMS執行過程時,它會使用SSMS SET屬性。 即SET ARITH_ABORT ON,...不在API請求中。

請閱讀以下文章,並在您的程序中進行必要的更改。

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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM