我有一个基本网格,在我的网络应用程序中启用了分页。该网格使用 Dapper 通过 Web API 由 SQL 数据填充。在我的 API Controller 中,我运行两个单独的查询:一个用于提取行(显示在我的网格中),一个用于获取记录总数(显示在我的分页控件中)。这有效。但是,我正在尝试优化我的查询。
我的第一个查询提取行,一次仅返回 50 行(使用 OFFSET
和 FETCH
来提供分页:
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
我的第二个查询提取所有行的计数,但使用相同的表、相同的联接和相同的 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
正如我所说,这有效。每次查询大约需要 2.5 秒,总计 5 秒以上。无论如何,时间滞后并不是世界末日,但我想将时间缩短一半。
我想知道是否有任何方法可以检索 50 行并检索一个查询中所有行的总数。我意识到这两个查询正在做两件不同的事情。但我的想法是,“可能”有一种方法可以调整这两个查询并将它们合并为一个,因为两者之间的表、连接和 WHERE 子句是相同的。
最佳答案
您可以尝试一下此查询:
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
您可以根据决定结果集中不同记录的因素来简化上述查询。
关于sql - 我可以在单个查询中检索分页行和总计数吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47935479/