我的网络应用程序中启用了一个基本网格,并启用了分页.使用Dapper通过Web API使用SQL数据填充此网格.在我的API控制器我运行两个单独的查询:一个提取的行(其在我的格示出),以及一个以获得记录的总数(在我的寻呼控制显示).这很有效.但是,我正在尝试优化我的查询.
我的第一个提取行的查询一次只返回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
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子句在两者之间是相同的.
您可以尝试一下这个查询:
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)
您可以根据决定结果集中不同记录的因素来简化上述查询。
| 归档时间: |
|
| 查看次数: |
509 次 |
| 最近记录: |