以下のストアド プロシージャがあります。合計レコードを返さずにうまく機能しますが、別のクエリで合計レコードを返すと、非常に遅くなります。
より高速な方法で合計レコードを返す別の方法はありますか
ビューは
SELECT dbo.tbl_ImagesMaster.ImgTitle, dbo.tbl_ImagesMaster.ImgID, dbo.tbl_ImagesMaster.ImgDate, dbo.tbl_ImagesMaster.ImgActive,
dbo.tbl_ImagesMaster.ImgHits, dbo.aspnet_Users.UserName, dbo.tbl_ImagesMaster.ImgUserID, dbo.tbl_ImagesDetails.ImgDPath,
dbo.tblUsersExtended.UAvatar, dbo.tbl_ImagesMaster.ImgRemarks
FROM dbo.tbl_ImagesMaster INNER JOIN
dbo.aspnet_Users ON dbo.tbl_ImagesMaster.ImgUserID = dbo.aspnet_Users.UserId INNER JOIN
dbo.tbl_ImagesDetails ON dbo.tbl_ImagesMaster.ImgID = dbo.tbl_ImagesDetails.ImgDParentID INNER JOIN
dbo.tblUsersExtended ON dbo.aspnet_Users.UserId = dbo.tblUsersExtended.UUserID
WHERE (dbo.tbl_ImagesDetails.ImgDDefault = 1)
SP
ALTER Procedure [dbo].[usp_searchImagestest]
(
@CurrentPage As int=1,
@PageSize As int=10,
@searchType As int=1,
@Activeflag As bit=null,
@searchTerm as nvarchar(200),
@TotalRecords As int OUTPUT
)
As
begin
-- Turn off count return.
Set NoCount On
--Full text search
if @searchType=1
begin
select
ImgID,ImgTitle,ImgDate,imgHits,UserName,uavatar,RowRank
from
(Select
ImgID,imgtitle,ImgDate,imghits,UserName,UAvatar
, ROW_NUMBER() OVER (ORDER BY ImgID desc) AS RowRank
From
vw_MasterImagesSearch
WHERE FREETEXT(*, @searchTerm) and (@Activeflag IS NULL or ImgActive=@Activeflag)
) as MyImages
where
RowRank > (@PageSize * (@CurrentPage-1)) AND RowRank <= (@CurrentPage * @PageSize)
-- TOTAL RECORD, WHICH SLOW DOWN THE WHOLE SP EXECUTION
select @TotalRecords = (select COUNT(*) From vw_MasterImagesSearch
WHERE FREETEXT(*, @searchTerm) and (@Activeflag IS NULL or ImgActive=@Activeflag))
end
編集
私はこれを試しました
クエリ 1
select
ImgID,ImgTitle,ImgDate,imgHits,RowRank,TOTALCOUNT,
(select username from aspnet_Users where UserId=MyImages.imguserid) as username,
(select UAvatar from tblUsersExtended where UUserID=MyImages.imguserid) as Uavatar
from
(Select
ImgID,imgtitle,ImgDate,imghits,ImgUserID
, ROW_NUMBER() OVER (ORDER BY ImgID desc) AS RowRank
,COUNT(*) OVER() AS TOTALCOUNT
From
tbl_ImagesMaster
WHERE FREETEXT(ImgTitle, @searchTerm) and (@Activeflag IS NULL or ImgActive=@Activeflag)
) as MyImages
where
RowRank > (@PageSize * (@CurrentPage-1)) AND RowRank <= (@CurrentPage * @PageSize)
クエリ 2
select
ImgID,ImgTitle,ImgDate,imgHits,RowRank,
(select username from aspnet_Users where UserId=MyImages.imguserid) as username,
(select UAvatar from tblUsersExtended where UUserID=MyImages.imguserid) as Uavatar
from
(Select
ImgID,imgtitle,ImgDate,imghits,ImgUserID
, ROW_NUMBER() OVER (ORDER BY ImgID desc) AS RowRank
From
tbl_ImagesMaster
WHERE FREETEXT(ImgTitle, @searchTerm) and (@Activeflag IS NULL or ImgActive=@Activeflag)
) as MyImages
where
RowRank > (@PageSize * (@CurrentPage-1)) AND RowRank <= (@CurrentPage * @PageSize)
select @TotalRecords = (select COUNT(*) From tbl_ImagesMaster
WHERE FREETEXT(ImgTitle, @searchTerm) and (@Activeflag IS NULL or ImgActive=@Activeflag))
クエリ 1 は 3 秒かかりました クエリ 2 は 1 秒未満でした
テーブル内の合計行数は 100,000 行です