如何通过性能优化在存储过程中执行排序和过滤?

Cod*_*ner 5 sql sql-server select stored-procedures sql-server-2008-r2

我想在我的存储过程中执行排序和过滤.

我为Holiday表创建表:

CREATE TABLE [dbo].[Holiday](
    [HolidaysId] [int] IDENTITY(1,1) NOT NULL,
    [HolidayDate] [date] NULL,
    [HolidayDiscription] [nvarchar](500) NULL,
    [Name] [nvarchar](max) NULL,
 CONSTRAINT [PK_Holiday] PRIMARY KEY CLUSTERED 
(
    [HolidaysId] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY]
Run Code Online (Sandbox Code Playgroud)

我的过滤标准如下:

  1. 以..开始
  2. 等于
  3. 不等于.

注意:请在过滤器比较中忽略HolidayId.

我的表:假日

HolidaysId int,Name nvarchar(500),HolidayDate date.
Run Code Online (Sandbox Code Playgroud)

样本输入:

HolidayId       Name       Date
 1               abc       1/1/2015
 2               pqr       1/2/2015
 3               xyz       1/3/2015
Run Code Online (Sandbox Code Playgroud)

输出:

Case 1:Starts with(This is just for name column only.likewise i want to do for HolidayDate column too)
Input:ab(filtering parameter)
Query:where Name like '%ab%' order by Name(when sort column name is  passed as parameter in stored procedure for column to sort(for eg:Name))
output:1,abc,1/1/2015

Case 2:Is Equal to(Same as above)
Input:prr(filtering parameter)
output:2,pqr,1/2/2015

Case 3:Not Equal to(Same as above)
Input:bbb(filtering parameter)
output:All Records
Run Code Online (Sandbox Code Playgroud)

到目前为止,这是我的存储过程:

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[sp_PagedItems]
    (
     @Page int,
     @RecsPerPage int
    )
AS

-- We don't want to return the # of rows inserted
-- into our temporary table, so turn NOCOUNT ON
SET NOCOUNT ON


--Create a temporary table
CREATE TABLE #TempItems
(
    ID int,
    Name varchar(50),
    HolidayDate date
)


-- Insert the rows from tblItems into the temp. table
INSERT INTO #TempItems (ID, Name,HolidayDate)
SELECT HolidaysId,HolidayDiscription,HolidayDate FROM holiday 

-- Find out the first and last record we want
DECLARE @FirstRec int, @LastRec int
SELECT @FirstRec = (@Page - 1) * @RecsPerPage
SELECT @LastRec = (@Page * @RecsPerPage + 1)

-- Now, return the set of paged records, plus, an indiciation of we
-- have more records or not!
SELECT *,
       MoreRecords = 
    (
     SELECT COUNT(*) 
     FROM #TempItems TI
     WHERE TI.ID >= @LastRec
    ) 
FROM #TempItems
WHERE ID > @FirstRec AND ID < @LastRec


-- Turn NOCOUNT back OFF
SET NOCOUNT OFF
Run Code Online (Sandbox Code Playgroud)

现在我将向存储过程发送4件事:

  1. 第页
  2. PageSize(要检索的记录数)
  3. 排序列名称(名称或HolidayDate)
  4. 我的过滤器列名称(Holidaydate的名称)和StartWith等操作符或等于或不等于.(ColumnName和Operator)

任何人都可以帮我执行排序和过滤,如果有任何与性能优化相关的更改,那么请建议我.

Pra*_*oni 2

这就是我所做的,我得到了预期的输出,但我仍然想听取大家的改进建议(如果有的话)。

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[HolidayFetchList]
@pageno int,
@pagesize int,
@sortorder varchar(10),
@sortcolumn varchar(100),
@filter varchar(max),
@count int OUTPUT
AS
BEGIN
    declare @Start int=(@pageno)*@pagesize;
    declare @End int=@Start+@pagesize;
    SET NOCOUNT ON;

    DECLARE @tblHoliday AS TABLE
        (HolidaysId int,HolidayDate date,HolidayDiscription nvarchar(500),HolidayName nvarchar(max),RN int)

    declare @sql varchar(max)= '
    select HolidaysId,HolidayDate,HolidayDiscription,HolidayDiscription as HolidayName,ROW_NUMBER() OVER 
                     (ORDER BY '+@sortcolumn + ' '+@sortorder+' ) AS RN from Holiday
     WHERE 1=1 '+@filter
     print @sql
INSERT INTO @tblHoliday
exec (@sql)
select  @count=COUNT(*) from @tblHoliday
print @count
select * from @tblHoliday where RN>@Start and RN<=@End order by RN 
END
Run Code Online (Sandbox Code Playgroud)

如果您有任何建议,请给我任何建议。