Я прошу об этом в контексте заявления PerformanceDBA в этом ответе на другой вопрос, что этот запрос:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND DateTime = ( -- Current Status on the left ...
SELECT MAX(DateTime) -- Current Status row for outer Product
FROM ProductStatus ps_inner
WHERE p.ProductId = ps_inner.ProductId
)
используя таблицу ProductStatus, которая содержит только эффективную (стартовую) дату для состояния, которое изменяется со временем, превзойдет этот запрос:
SELECT ProductId,
Description
FROM Product p,
ProductStatus ps
WHERE p.ProductId = ps.ProductId -- Join
AND StatusCode = 2 -- Request
AND getdate() BETWEEN DateFrom AND Dateto
используя таблицу ProductStatus, которая содержит как начало, так и дату окончания состояния.
Хотя я принимаю другие утверждения, сделанные для первого подхода, лучше второго, я бы предпочел, чтобы второй подход был быстрее (на основе моего опыта работы с Oracle), потому что он просто фильтрует данные, а не выполнение дополнительного подзапроса и сравнение с ним.
Я хотел бы знать, как Sybase или SQL Server будут обрабатывать эти запросы и что относительная производительность в некоторых простых тестах.