Может ли кто-нибудь помочь мне с оптимизацией кода по моему запросу 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
Это может просто доказать, что "один размер не подходит всем" ("... КТОС ... лучше всего ..").
Возможно, "масштабирование" - это фактор, поскольку вы не упоминаете о количестве записей.