У меня есть хранимая процедура, которая использует представление для получения 6 средних. База данных SQL - это SQL Server 2000. Когда я запускаю ее в анализаторе запросов, это занимает примерно 9 секунд. Что я могу сделать, чтобы получить лучшую производительность? Должен ли я вернуть строки с помощью LINQ и определить среднее значение таким образом? Это будет быстрее?
Вот пример моего текущего sproc:
create procedure [TestAvg]
(
@CustomerNumber int
)
as
select
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P12D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P12D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 12 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P12D90,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 7 and CustomerNumber = @CustomerNumber) as P16D7,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 30 and CustomerNumber = @CustomerNumber) as P16D30,
(select AVG(OrderTime) from OrderDetails where ProductID = 16 and DateDiff(day, DateFulfilled, GetDate()) <= 90 and CustomerNumber = @CustomerNumber) as P16D90
Кроме того, позвольте мне прояснить мнение, упомянутое выше. Поскольку это SQL Server 2000, я не могу использовать индексированное представление, потому что оно использует подзапрос. Я полагаю, это можно переписать, чтобы использовать соединения. Однако в последний раз, когда мы брали запрос и переписывали его для использования объединений, данные отсутствовали (поскольку подзапрос может возвращать нулевое значение, которое пропустило бы всю строку).