Sql Просмотр с предложением WHERE выполняется медленнее, чем необработанный запрос - PullRequest
0 голосов
/ 23 апреля 2020

Это выполняется в постоянное время:

 SELECT row_number() OVER (order by PackagingUniqueId) as RowNum, Barcode, pu.PackagingUniqueId,
rd.Name, pu.ComponentBarcode, rrl.ponum, rrl.mfgpart, rrl.new_lot_code, rrl.pno
    FROM Trace.dbo.TraceData td
    INNER JOIN Trace.dbo.TraceJob tj ON td.Id = tj.TraceDataId
    INNER JOIN Trace.dbo.Job j ON tj.JobId = j.Id
    INNER JOIN Trace.dbo.[Order] o ON j.OrderId = o.id
    INNER JOIN Trace.dbo.PCBBarcode p ON td.PCBBarcodeId = p.Id
    INNER JOIN Trace.dbo.TracePlacement tp ON td.Id = tp.TraceDataId
    INNER JOIN Trace.dbo.Placement p2 ON p2.PlacementGroupId = tp.PlacementGroupId
    INNER JOIN Trace.dbo.Charge c ON p2.ChargeId = c.Id
    INNER JOIN Trace.dbo.PackagingUnit pu ON c.PackagingUnitId = pu.Id
    INNER JOIN Trace.dbo.RefDesignator rd ON p2.RefDesignatorId = rd.Id
    INNER JOIN SpotlightSQL.spot_light_dbo.peel_off_ids po ON po.peel_off_id = pu.PackagingUniqueId
    INNER JOIN SpotlightSQL.spot_light_dbo.recv_receipts_log rrl ON rrl.label_id = po.label_id
    WHERE p.Barcode = '20092619153'

Однако, это занимает около 7 секунд:

SELECT * FROM Component WHERE Barcode = '20092619153'

Компонент представляет собой SQL представление который состоит из первого более длинного запроса без WHERE предложения.

Почему это происходит? Извлекает ли представление все записи и затем применяет предложение Where? Есть ли способ ускорить второй запрос? (без применения индексов)

1 Ответ

1 голос
/ 23 апреля 2020

Почему это происходит? Извлекает ли представление все записи и затем применяет условие Where?

Да, в этом конкретном случае SQL Сервер сначала выполнит исходный базовый запрос, а затем применяет фильтр WHERE сверху этого промежуточного результата.

Есть ли способ ускорить второй запрос? (без применения индексов)

Представление SQL обычно работает так же, как и базовый запрос. Итак, если Barcode - хороший способ отфильтровать много записей, то добавление индекса к Barcode - это путь к go. Кроме этого, вы не можете ничего сделать для ускорения представления.

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

...