Почему мой успокаивающий API-интерфейс так медленно работает при выполнении SQL-запроса?но это быстро, когда я просто запускаю запрос - PullRequest
0 голосов
/ 09 октября 2018

чего я хотел бы добиться - это нормальной продолжительности (менее 1 минуты) времени ожидания успокоения API, что моя технология, которую я использую для внешнего интерфейса, использует Angularjs и Java Spring MVC, а для внутреннего - Java Spring MVC RestfulAPI.Но это так медленно, это займет больше 5 минут для этой единственной хранимой процедуры, которая возвращает только 2 столбца.Я не знаю, что я делаю неправильно, потому что на моем локальном компьютере он просто работает нормально, но на сервере он работает очень медленно, у меня есть другой запрос, более сложный, чем этот, и он выполняется быстрее, чем этот запрос, вот мой запрос выглядел так:

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

}

Ответы [ 2 ]

0 голосов
/ 09 октября 2018

Если один и тот же запрос дает разную производительность, значит, что-то не так с вашим планом выполнения.когда вы выполняете процедуру из вашей локальной SSMS, она использует ваши свойства SET SSMS.то есть SET ARITH_ABORT ON, ... которого нет в запросе API.

Пожалуйста, прочитайте статью ниже и внесите необходимые изменения в вашу процедуру.

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

0 голосов
/ 09 октября 2018

(слишком долго для комментария)

Код пахнет:

  • ненужной инкапсуляцией в TVF, которая может, и я уверен, вызывает некоторое снижение производительности;избавиться от TVF, запустить обновленный запрос на сервере prod и показать фактический план выполнения
  • 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 мне не нравитсяэто очень сильно
  • разворачивает и сворачивает все столбцы в одно значение сразу после этого?для чего нужен pivot?
  • SQL не является JAVA, такая инкапсуляция и «повторное использование» кода убивают его
  • сравнивает структуры сервера и локальной таблицы, список индексов
  • Кстати, равно ли содержание БД?или в localhost db есть, скажем, 10 записей, тогда как на сервере есть миллионы?
...