22,302
社区成员




我没细看,所以就是随便说说,注意NOLOCK可能会读取到脏数据
if OBJECT_ID('TR_Group_GetGroupCategoryList','P') is not null drop proc TR_Group_GetGroupCategoryList GO create proc TR_Group_GetGroupCategoryList @CID INT , @GroupSortID INT , @PageSize INT , @PageIndex INT , @TotalCount INT OUTPUT as DECLARE @varCID INT,@varGroupSortID INT,@startIndex INT,@endIndex INT SELECT @varCID = @CID,@varGroupSortID = @GroupSortID SET @startIndex=@PageSize*@PageIndex+1 SET @endIndex=@startIndex+@PageSize-1 SELECT @TotalCount = COUNT(1) FROM dbo.RH_Group a WITH ( NOLOCK ) LEFT JOIN dbo.RH_User u WITH ( NOLOCK ) ON u.id = a.CreateBy LEFT JOIN dbo.RH_Subject s WITH ( NOLOCK ) ON s.ID = a.SubjectID LEFT JOIN dbo.RH_Grade d WITH ( NOLOCK ) ON d.ID = a.GradeID WHERE a.CID = @varCID AND a.GroupStatus = 2 AND a.GroupSortID = @varGroupSortID SELECT * FROM ( SELECT a.ID ,a.GroupName ,a.GroupSortID ,a.GradeID ,a.SubjectID ,a.GPictureUrl ,a.GroupDesc ,a.CreateBy ,a.CreateTime ,(SELECT COUNT(UserID) FROM dbo.RH_GroupUser WITH ( NOLOCK ) WHERE GroupID = a.id AND GroupUserState = 2) AS GroupUserCount ,u.TureName AS CreateByName ,s.SubjectName ,d.Name AS GradeName ,(SELECT COUNT(1) FROM dbo.RH_Activity WITH ( NOLOCK ) WHERE GroupID = a.id) AS ActivityCount ,ROW_NUMBER() OVER(ORDER BY a.CreateTime DESC) RowNumber FROM dbo.RH_Group a WITH ( NOLOCK ) LEFT JOIN dbo.RH_User u WITH ( NOLOCK ) ON u.id = a.CreateBy LEFT JOIN dbo.RH_Subject s WITH ( NOLOCK ) ON s.ID = a.SubjectID LEFT JOIN dbo.RH_Grade d WITH ( NOLOCK ) ON d.ID = a.GradeID WHERE a.CID = @varCID AND a.GroupStatus = 2 AND a.GroupSortID = @varGroupSortID ) t WHERE RowNumber BETWEEN @startIndex AND @endIndex GO
[quote=引用 5 楼 mine3333 的回复:] [quote=引用 4 楼 u010192842 的回复:] 参数嗅探
这不是个性能问题,是个功能问题! 我想知道,alter之后还出现总是显示第一页的情况吗? 猜测是上线之前你们又做了什么改动影响了分页。 可以用log或profiler等手段跟踪一下分页的参数,尤其是pageindex,看是不是想要的值。
[quote=引用 4 楼 u010192842 的回复:] 参数嗅探
参数嗅探
存储过程加个WITH RECOMPILE 试试 ex: Create Procedure XXXX WITH RECOMPILE AS .................. Go
if OBJECT_ID('TR_Group_GetGroupCategoryList','P') is not null
drop proc TR_Group_GetGroupCategoryList
GO
create proc TR_Group_GetGroupCategoryList
@CID INT ,
@GroupSortID INT ,
@PageSize INT ,
@PageIndex INT ,
@TotalCount INT OUTPUT
as
DECLARE @varCID INT,@varGroupSortID INT,@startIndex INT,@endIndex INT
SELECT @varCID = @CID,@varGroupSortID = @GroupSortID
SET @startIndex=@PageSize*@PageIndex+1
SET @endIndex=@startIndex+@PageSize-1
SELECT @TotalCount = COUNT(1)
FROM dbo.RH_Group a WITH ( NOLOCK )
LEFT JOIN dbo.RH_User u WITH ( NOLOCK ) ON u.id = a.CreateBy
LEFT JOIN dbo.RH_Subject s WITH ( NOLOCK ) ON s.ID = a.SubjectID
LEFT JOIN dbo.RH_Grade d WITH ( NOLOCK ) ON d.ID = a.GradeID
WHERE a.CID = @varCID
AND a.GroupStatus = 2
AND a.GroupSortID = @varGroupSortID
SELECT *
FROM
(
SELECT a.ID ,a.GroupName ,a.GroupSortID ,a.GradeID ,a.SubjectID ,a.GPictureUrl
,a.GroupDesc ,a.CreateBy ,a.CreateTime
,(SELECT COUNT(UserID) FROM dbo.RH_GroupUser WITH ( NOLOCK )
WHERE GroupID = a.id AND GroupUserState = 2) AS GroupUserCount
,u.TureName AS CreateByName ,s.SubjectName ,d.Name AS GradeName
,(SELECT COUNT(1) FROM dbo.RH_Activity WITH ( NOLOCK )
WHERE GroupID = a.id) AS ActivityCount
,ROW_NUMBER() OVER(ORDER BY a.CreateTime DESC) RowNumber
FROM dbo.RH_Group a WITH ( NOLOCK )
LEFT JOIN dbo.RH_User u WITH ( NOLOCK ) ON u.id = a.CreateBy
LEFT JOIN dbo.RH_Subject s WITH ( NOLOCK ) ON s.ID = a.SubjectID
LEFT JOIN dbo.RH_Grade d WITH ( NOLOCK ) ON d.ID = a.GradeID
WHERE a.CID = @varCID
AND a.GroupStatus = 2
AND a.GroupSortID = @varGroupSortID
) t
WHERE RowNumber BETWEEN @startIndex AND @endIndex
GO