Я проверяю некоторые хранимые процедуры в стороннем приложении, которое купил мой работодатель. У них вся система работает медленно, как патока.
Каждая хранимая процедура выбора имеет самый сложный выбор, который я когда-либо видел. И практически КАЖДАЯ хранимая процедура написана таким образом. (StackOverflow также нужен хеш-тег WTF.)
Перед тем, как я их потрошу и внесу соответствующие изменения в код, кто-нибудь когда-нибудь видел хранимые процедуры, закодированные таким образом?
Код работает, но кажется, что есть 20 лучших способов сделать это. Использование Linq в коде для сортировки набора данных для одного. Выполните всего один вызов БД и поместите (маленький) набор результатов в переменную сеанса.
create PROCEDURE dbo.sp_REALLYWEIRD
(
@parameter1 varchar(5), @parameter2 varchar(5), @parameter3 varchar(5),
@sortField varchar(20), @sortDirection int, @OrgIdentifier varchar(5),
@startRowIndex int, @maximumRows int, @rowCount int OUTPUT
)
AS
BEGIN
DECLARE @returnValue TABLE (
Id int NOT NULL,
SomeColumn1 char(7) NOT NULL,
SomeColumn2 datetime NULL,
SomeColumn3 datetime NULL,
SomeColumn4 varchar(18) NOT NULL,
SomeColumn5 smallint NOT NULL,
RowNumber int NOT NULL)
DECLARE @endRowIndex int
SET @endRowIndex = @startRowIndex + @maximumRows
IF @sortField IS NULL
SET @sortField = 'SomeColumnName'
INSERT INTO @returnValue
(Id, SomeColumn1, SomeColumn2, SomeColumn3,
SomeColumn4, SomeColumn5, RowNumber)
SELECT Id, SomeColumn1, SomeColumn2, SomeColumn3,
SomeColumn4, SomeColumn5, RowNumber
FROM (SELECT Id,SomeColumn1, SomeColumn2, SomeColumn3,
SomeColumn4, SomeColumn5,
CASE @sortField
WHEN 'SomeColumnName1' THEN
CASE @sortDirection
WHEN 1 THEN Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn1) - 1
ELSE Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn1 DESC) - 1
END
WHEN 'SomeColumnName2' THEN
CASE @sortDirection
WHEN 1 THEN Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn2) - 1
ELSE Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn2 DESC) - 1
END
WHEN 'SomeColumnName3' THEN
CASE @sortDirection
WHEN 1 THEN Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn3) - 1
ELSE Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn3 DESC) - 1
END
WHEN 'SomeColumnName4' THEN
CASE @sortDirection
WHEN 1 THEN Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn4) - 1
ELSE Row_Number() OVER (PARTITION BY DistrictLea ORDER BY SomeColumn4 DESC) - 1
END
END AS RowNumber
FROM dbo.someTable
WHERE OrgIdentifier = @OrgIdentifier) t
SELECT @rowCount = COUNT(*)
FROM @returnValue
SELECT Id, SomeColumn1, SomeColumn2, SomeColumn3,
SomeColumn4, SomeColumn5
FROM @returnValue
WHERE RowNumber >= @startRowIndex
AND RowNumber < @endRowIndex
ORDER BY RowNumber
END
Похоже, много работы просто для загрузки сетки данных.