我可以在单个查询中检索分页行和总计数吗?

Mat*_*nks 6 sql sql-server

我的网络应用程序中启用了一个基本网格,并启用了分页.使用Dapper通过Web API使用SQL数据填充此网格.在我的API控制器我运行两个单独的查询:一个提取的行(其在我的格示出),以及一个以获得记录的总数(在我的寻呼控制显示).这很有效.但是,我正在尝试优化我的查询.

我的第一个提取行的查询一次只返回50行(使用OFFSETFETCH提供分页:

SELECT DISTINCT T_INDEX.* 
FROM T_INDEX
INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
WHERE... --a fairly complex WHERE statement
ORDER BY CallTime DESC
OFFSET (@offset) ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

我的第二个查询提取所有行的计数,但使用相同的表,相同的连接和相同的WHERE子句:

SELECT COUNT(DISTINCT T_INDEX.IndexId)
FROM T_INDEX
INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
WHERE... --the same fairly complex WHERE statement
Run Code Online (Sandbox Code Playgroud)

正如我所说,这是有效的.每次查询大约需要2.5秒,总共5秒以上.无论如何,时间滞后不是世界末日,但我希望将时间缩短一半.

我想知道是否有任何方法可以检索50行检索一个查询中所有行的总数.我意识到这两个查询正在做两件事.但我的想法是,"可能"可以调整这两个查询并将它们合并为一个,因为表,连接和WHERE子句在两者之间是相同的.

Gio*_*sos 3

您可以尝试一下这个查询:

SELECT *
FROM (
   SELECT *, COUNT(*) OVER () AS cnt
   FROM (
      SELECT DISTINCT T_INDEX.*, 
      FROM T_INDEX
      INNER JOIN T_INDEXCALLER ON T_INDEX.IndexId = T_INDEXCALLER.IndexId
      WHERE... --a fairly complex WHERE statement
   ) AS t1 ) AS t2
ORDER BY CallTime DESC
OFFSET (@offset) ROWS FETCH NEXT 50 ROWS ONLY
Run Code Online (Sandbox Code Playgroud)

您可以根据决定结果集中不同记录的因素来简化上述查询。