Member 14778402 Ответов: 1

Эффективность 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 записей.

1 Ответов

Рейтинг:
0

Jörgen Andersson

Итак, сначала вы соединяете два стола
Затем вы добавляете строки из второго соединения этих двух таблиц с помощью like, где вы удалили строки из первого соединения.

Я верю, что ты хочешь вот этого:

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
JOIN    ItemMasterRoutingPOC.dbo.[Walls Routing Table] AS RUMaster
    ON  RUMaster.mitm = PartList.PartNumber
    OR  RUMaster.mitm LIKE (LEFT(PartList.PartNumber, 8) + '-%')