Эффективность Sql server-запрос занимает слишком много времени для получения результатов
Я создал запрос, который вставляет записи в таблицу [MatchingRowsOutput-RU], соединяя таблицу [SWBOM] и таблицу маршрутизации [Walls].
В первой части запроса its собирает все записи на основе условия = с помощью внутреннего соединения. Во второй части он собирает все неточные записи. На внутреннем соединении для этого нужно было использовать условие IN, которое действительно замедляет извлечение. Это занимает около 1,5 минуты, чтобы бежать.
Я хотел бы оптимизировать этот запрос для лучшего времени получения результата. Будучи совершенно новичком в sql или программировании, если уж на то пошло, я не знаком с тем, какой синтаксис я мог бы использовать, чтобы заменить это условие. Я должен был использовать это в состоянии, потому что он ожидает, что будет возвращено много записей.
Любая помощь будет очень признательна.
Ниже приведен код, который я написал до сих пор.
Что я уже пробовал:
Insert into [SSIS-POC].dbo.[MatchingRowsOutput-RU] (cprj, PartNumber, SWITEM, QTY, mitm, opno, tano, cwoc, mcno, sutm, rutm, prte, mnoc, mcoc, olap, exin, subr, indt, exdt, bfls, qpnt, nnts, desn, txta) SELECT PartList.cprj, PartList.PartNumber, PartList.SWITEM, PartList.QTY, RUMaster.mitm, RUMaster.opno, RUMaster.tano, RUMaster.cwoc, RUMaster.mcno, RUMaster.sutm, RUMaster.rutm, RUMaster.prte, RUMaster.mnoc, RUMaster.mcoc, RUMaster.olap, RUMaster.exin, RUMaster.subr, RUMaster.indt, RUMaster.exdt, RUMaster.bfls, RUMaster.qpnt, RUMaster.nnts, RUMaster.desn, RUMaster.txta FROM [SSIS-POC].dbo.SWBOM as PartList INNER JOIN ItemMasterRoutingPOC.dbo.[Walls Routing Table] AS RUMaster ON RUMaster.mitm = PartList.PartNumber UNION ALL SELECT PartList.cprj, PartList.PartNumber, PartList.SWITEM, PartList.QTY, RUMaster.mitm, RUMaster.opno, RUMaster.tano, RUMaster.cwoc, RUMaster.mcno, RUMaster.sutm, RUMaster.rutm, RUMaster.prte, RUMaster.mnoc, RUMaster.mcoc, RUMaster.olap, RUMaster.exin, RUMaster.subr, RUMaster.indt, RUMaster.exdt, RUMaster.bfls, RUMaster.qpnt, RUMaster.nnts, RUMaster.desn, RUMaster.txta FROM [SSIS-POC].dbo.SWBOM as PartList INNER JOIN ItemMasterRoutingPOC.dbo.[Walls Routing Table] AS RUMaster ON RUMaster.mitm IN --**********PROBLEM IS HERE WITH THE IN CONDITION (SELECT mitm FROM ItemMasterRoutingPOC.dbo.[Walls Routing Table] WHERE mitm LIKE (LEFT(PartList.PartNumber,8) + '-%') --WHERE mitm = PartList.itlu ) LEFT JOIN ( SELECT PartList.PartNumber as FoundPartNumber FROM [SSIS-POC].dbo.SWBOM as PartList INNER JOIN ItemMasterRoutingPOC.dbo.[Walls Routing Table] AS RUMaster ON RUMaster.mitm = PartList.PartNumber ) IT ON IT.FoundPartNumber = PartList.PartNumber WHERE IT.FoundPartNumber IS NULL;
CHill60
Прочтите об этом Производительность SQL server - смерть от коррелированных подзапросов - SQL Service[^] - нет необходимости в подзапросе - просто используйте другое соединение
Gerry Schmitz
Вы оптимизируете "selects", затем "unions" и т. д. Используйте "промежуточные" таблицы, чтобы вы могли рассчитывать время. SQL "оптимизатор" - это не магия, и нет никаких ярлыков для повышения производительности.
Member 14778402
я запустил только тот раздел кода, который имеет дело с неточным условием IN с одним select и внутренним соединением, и именно там потребляется все время. Я не уверен, что этот конкретный раздел кода считается коррелированным. Для получения большого количества записей должен быть какой-то другой синтаксис, а не использование условия IN. Остальные секции, обработанные индивидуально, работают быстро. Одна из таблиц, из которой он извлекает записи, содержит только 231 000 записей.