Sys Dev Ответов: 0

Может ли кто-нибудь помочь мне с оптимизацией кода по моему запросу T-SQL 2K16?


Привет.

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

Вот мой пример сценария:
ALTER PROCEDURE [dbo].[xxx]
@DTB AS DATETIME,
@DTE AS DATETIME
AS
BEGIN
    WITH CTE AS 
    (
        SELECT H.DOCID, C.NAME, NSDOCNO, EMDOCNO, H.DOCDT, LINEID, D.MODELID, M.MODEL, D.QTY, D.ID
        FROM _NSPOHDR H
        JOIN COSTCTR C ON H.SHPCOSTID = C.COSTID    
        JOIN _NSPODTL D ON H.DOCID = D.DOCID
        JOIN MODEL M ON D.MODELID = M.MODELID
        WHERE  DOCDT BETWEEN @DTB AND @DTE
    ),
    CTE2 AS
    (
        SELECT C.*, 
        (
            SELECT COUNT(RID) 
            FROM TRANSFERHDR H JOIN TRANSFERDTL D ON H.DOCID = D.DOCID 
            WHERE H.APPTYPE = 0 
            AND REPLACE(REPLACE(PO,' ',''),'-','') LIKE REPLACE(REPLACE(C.EMDOCNO,' ',''),'-','') 
            AND MODELID = C.MODELID 
        ) AS SERVED,
        (
            SELECT COUNT(DTLID) 
            FROM INVDTL D JOIN INVHDR H ON D.DOCID = H.DOCID 
            WHERE H.APPTYPE = 1 
            AND REFDOCID IN 
            (
                SELECT DOCID 
                FROM TRANSFERHDR H 
                WHERE REPLACE(REPLACE(PO,' ',''),'-','') LIKE REPLACE(REPLACE(C.EMDOCNO,' ',''),'-','')  
                AND MODELID = C.MODELID
            ) 
            AND MODELID = C.MODELID 
        ) AS RCVD
        FROM CTE C
    )
    SELECT C.*, (QTY - SERVED) AS BALANCE, (SERVED - RCVD) AS TRANSIT  
    FROM CTE2 C
END

Надеюсь, ты сможешь мне помочь. Заранее большое спасибо :)

Что я уже пробовал:

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

Курсор тоже нежизнеспособен.

Jörgen Andersson

Можете ли вы обновить запрос с помощью псевдонимов таблиц для всех полей, чтобы мы знали, какое поле принадлежит какой таблице?

Для меня наиболее вероятным виновником являются несаргируемые функции замены внутри условий.
Кроме того, ваши подобные функции не имеют ни'_', ни '%' в них, поэтому они работают как равенство.

Gerry Schmitz

Это может просто доказать, что "один размер не подходит всем" ("... КТОС ... лучше всего ..").

Возможно, "масштабирование" - это фактор, поскольку вы не упоминаете о количестве записей.

0 Ответов