Есть ли причина загружать временную таблицу с данными, а затем выбирать из нее хранимую процедуру? - PullRequest
0 голосов
/ 05 июня 2019

Я проверяю некоторые хранимые процедуры в стороннем приложении, которое купил мой работодатель. У них вся система работает медленно, как патока.

Каждая хранимая процедура выбора имеет самый сложный выбор, который я когда-либо видел. И практически КАЖДАЯ хранимая процедура написана таким образом. (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

Похоже, много работы просто для загрузки сетки данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...