2

我在存储过程中进行过滤、排序和分页操作。这些操作的顺序应该是search->order->paging的执行顺序。我不知道我的存储过程是先按语句排序还是先搜索操作。所以我的问题是:

1)这个存储过程的执行顺序是什么?

2)如果order by语句在搜索语句之前执行,我怎样才能让搜索操作首先执行?

CREATE PROCEDURE [dbo].[Grid_Feedbacks_Select_All]
@search nvarchar(100),
@orderby nvarchar(50),
@orderbydirection nvarchar(4),
@skipLength int,
@length int
AS
BEGIN

--THIS PART IS ORDER BY PART
WITH CTE_Results
AS (
SELECT ROW_NUMBER() OVER (ORDER BY
    CASE WHEN (@orderby = 'Subject' AND @orderbydirection='asc')
                THEN Subject
    END ASC,
    CASE WHEN (@orderby = 'Subject' AND @orderbydirection='desc')
               THEN Subject
    END DESC,

    CASE WHEN (@orderby = 'Text' AND @orderbydirection='asc')
              THEN Text
    END ASC,
    CASE WHEN @orderby = 'Text' AND @orderbydirection='desc'
             THEN Text
    END DESC
) AS ROWNUM,

Count(*) over () AS TotalCount, 
(
    --THIS PART IS SEARCH PART
    SELECT COUNT(*) FROM Feedbacks f(nolock)) AS TotalRecordsCount,
    f.Id, 
    f.Response, 
    f.Subject, 
    f.Text, 
    u.Username, 
    c.FirmName, 
    c.Name, 
    c.Surname

    FROM Feedbacks f(nolock), Users u, Customers c 
    WHERE
    f.UserId = u.Id 
    AND u.CustomerId = c.Id
    OR(f.Text LIKE '%' + @search + '%')
    OR (u.Username LIKE '%' + @search + '%')
    OR (c.Name LIKE '%' + @search + '%')
)
--THIS PART IS PAGING PART
SELECT * FROM CTE_Results AS CPC
WHERE CPC.ROWNUM > @skipLength AND 
CPC.ROWNUM < @skipLength + @length + 1
ORDER BY CPC.ROWNUM ASC

END
4

1 回答 1

0

答案是“不知道,不在乎”。SQL 语句是描述性的。它们描述了正在产生的输出。SQL不是过程语言,因此 SQL 引擎可以自由选择它喜欢的任何执行顺序和优化方法。

执行顺序对结果没有任何影响。查询计划用于返回所有结果,而不仅仅是特定子集。

换句话说,您担心的是错误的事情。只需确保查询返回您想要的数据并以最佳方式编写,以便优化器利用其功能。

编辑:

需要明确的是,SQL Server文档明确指出:

当 SQL Server 处理连接时,查询引擎会选择最有效的方法(从多种可能性中)来处理连接。各种连接的物理执行可以使用许多不同的优化,因此无法可靠地预测。

当您在查询中有大量连接时(比 OP 中更多),优化器可能无法考虑所有可能性。在这种情况下,连接顺序可能会影响查询计划。然而,更重要的是优化器用于选择连接操作的顺序和类型的统计信息。微软为选择最佳执行计划付出了很多努力。

即便如此,在某些情况下,优化器可能是错误的。您可以通过对连接使用显式查询提示来影响结果。我不知道任何适用于 OP 问题的查询提示。而且,除非当前存在性能问题,否则我认为它甚至不值得考虑。

于 2013-06-24T14:03:10.307 回答