Я использую CTE с оператором union all
для запроса пейджинга в моей хранимой процедуре.
Я выбираю общее количество записей также в моем поисковом запросе.Но это займет еще несколько секунд.
CREATE PROCEDURE [dbo].[PAGING_NEW]
@parameter1 NVARCHAR(200),
@parameter2 NVARCHAR(200),
@PAGE INT,
AS
SET NOCOUNT ON;
DECLARE @ROWNUM INT =24
DECLARE @ROWCOUNT INT
SET @ROWCOUNT = ((@PAGE - 1) * @ROWNUM)
;WITH TempResult AS
(
QUERY 1
WHERE CONDITIONS
UNION ALL
QUERY 2
WHERE CONDITIONS
), TempCount AS
(
SELECT
COUNT(ID) AS TotalCount
FROM
TempResult
)
SELECT
ID, NAME, TEMPCOUNT.TotalCount
FROM
TempResult, TempCount
ORDER BY
Tempresult.ID
OFFSET @ROWCOUNT ROWS FETCH NEXT @ROWNUM ROWS ONLY
Вопросы:
- Есть ли какой-либо другой метод для оптимизации общего количества записей?
- Можно ли улучшитьпроизводительность CTE для
union all
в пейджинговом запросе?
Теперь я использую условие соединения в своем пейджинговом запросе, но общее количество не подходит правильно.
CREATE PROCEDURE [dbo].[PAGING_NEW]
@parameter1 NVARCHAR(200),
@parameter2 NVARCHAR(200),
@PAGE INT,
AS
SET NOCOUNT ON;
DECLARE @ROWNUM INT =24
DECLARE @ROWCOUNT INT
SET @ROWCOUNT = ((@PAGE - 1) * @ROWNUM)
;WITH TempResult AS
(
QUERY 1
WHERE CONDITIONS
UNION ALL
QUERY 2
WHERE CONDITIONS
), TempCount AS
(
SELECT
COUNT(ID) AS TotalCount,ID AS ID
FROM
TempResult
)
SELECT
TempResult.ID, NAME, TEMPCOUNT.TotalCount
FROM
TempResult
JOIN TempCount
ON TempResult.ID=TempCount.ID
ORDER BY
Tempresult.ID
OFFSET @ROWCOUNT ROWS FETCH NEXT @ROWNUM ROWS ONLY