WITH Categories (child_oid, Level) AS (
SELECT h.child_oid,
0 AS Level
FROM Memx_productcatalog.dbo.ME_CatalogHierarchy AS h
JOIN dbo.[ME_CatalogProducts] c on h.oid = c.oid
WHERE c.CategoryName = 'Root'
UNION ALL
SELECT h.child_oid,
Level + 1
FROM dbo.ME_CatalogHierarchy AS h
JOIN Categories AS p ON p.child_oid = h.oid ) --End CTE Recursive
SELECT p.oid --problem here
FROM dbo.ME_CatalogProducts as p
WHERE p.oid IN (SELECT child_oid
FROM Categories)
Я пишу рекурсивный SQL-оператор CTE для извлечения элементов из дерева.Запрос работает нормально.Когда я выбираю определенный столбец (столбцы), запрос выполняется за ~ 300 мс.Однако когда я использую select *
или p.*
, запрос выполняется менее 100 мс.Это полная противоположность того, что я ожидал.Я проверил индексы, статистику, и оба запроса, кажется, генерируют один и тот же план выполнения.Я поставлен в тупик.
Обновление
Я выполнял этот запрос весь день с единообразными результатами.Я попытался отключить кэширование с помощью OPTION (RECOMPILE).Я только что использовал «Время ожидания ответов сервера» в диспетчере SQL для измерения выполнения запроса (это плохо?) Вот что происходит, когда я использую SET STATISTICS TIME ON.
p.oid => Время выполнения SQL Server: время ЦП = 203 мс, прошедшее время = 270 мс.«Время ожидания» = 195 мс
стр. * => Время выполнения SQL Server: время ЦП = 469 мс, истекшее время = 1015 мс.«Время ожидания» = 21мс
У меня есть другие характеристики, если они нужны.Является ли время ожидания клиента неправильным способом измерения этих вещей?