与在SQL中使用Count()相比,提取33000条记录集花费的执行时间更少。这怎么可能?
事先谢谢你对我的容忍 与在SQL中使用Count()并仅获取20行相比,从数据库中提取33000条记录集所花费的执行时间更少 这怎么可能 更详细一点: 以前,我们抓取整个记录集,但一次只在页面上显示其中的20行进行分页。这是一种令人畏缩和浪费的行为,因此我重新设计了页面,一次只抓取20行,并简单地使用索引变量抓取下一页,以此类推 一切都很好,但这缺乏我们人民所需要的记录 因此,在记录查询之后,我使用结构化查询语言中的Count(index)函数添加了(我认为是)一个关于表索引的快速查询 对原始页面和我的新页面进行并排比较表明,我的新页面的执行时间比原始页面长约10%!我大吃一惊。我确信它会闪电般地快,比原来的快多了 有没有想过我为什么以及我会做些什么来补救 是否因为脚本必须运行两个查询,而不管检索到的数据是什么 更新: 下面是SQL语句 (为了安全起见,本文将表名和字段名虚拟化,但结构与真实页面相同) 主记录集选择查询包含:与在SQL中使用Count()相比,提取33000条记录集花费的执行时间更少。这怎么可能?,sql,count,recordset,Sql,Count,Recordset,事先谢谢你对我的容忍 与在SQL中使用Count()并仅获取20行相比,从数据库中提取33000条记录集所花费的执行时间更少 这怎么可能 更详细一点: 以前,我们抓取整个记录集,但一次只在页面上显示其中的20行进行分页。这是一种令人畏缩和浪费的行为,因此我重新设计了页面,一次只抓取20行,并简单地使用索引变量抓取下一页,以此类推 一切都很好,但这缺乏我们人民所需要的记录 因此,在记录查询之后,我使用结构化查询语言中的Count(index)函数添加了(我认为是)一个关于表索引的快速查询 对原始页
SELECT
top 21 roster_id, roster_pplid, roster_pplemailid, roster_emailid, roster_firstname,
roster_lastname, roster_since, roster_pplsubscrid, roster_firstppldone, roster_pmtcurrent,
roster_emailverified, roster_active, roster_selfcanceled, roster_deactreason
FROM roster
WHERE
roster_siteid = 22
AND roster_isdeleted = false
order by roster_id desc
SELECT
COUNT(roster_id)
FROM
roster
WHERE
roster_siteid = 22
AND roster_isdeleted = false
记录计数查询包含:
SELECT
top 21 roster_id, roster_pplid, roster_pplemailid, roster_emailid, roster_firstname,
roster_lastname, roster_since, roster_pplsubscrid, roster_firstppldone, roster_pmtcurrent,
roster_emailverified, roster_active, roster_selfcanceled, roster_deactreason
FROM roster
WHERE
roster_siteid = 22
AND roster_isdeleted = false
order by roster_id desc
SELECT
COUNT(roster_id)
FROM
roster
WHERE
roster_siteid = 22
AND roster_isdeleted = false
第一个查询运行,然后第二个查询运行。第二个总是动态地具有相同的匹配WHERE filter。我想我知道它为什么较慢,我使用GetRows在新页面中获取记录集,而不是在旧页面中使用。这似乎就是经济放缓。但我必须使用它,否则就无法超越第21项记录
Nick.McDermaid:显示的SQL正在选择前21行,这就是它仅获取20行的方式(第21行只是为了填充“下一个”页面链接的索引) sql在哪里?我没有粘贴sql,因为它更像是一个理论问题,但我会尝试将它的一个版本组合起来,并在这里继续。谢谢。您是否通过在SSM中运行原始sql来比较它们的运行时间?现在如何编写代码来运行这两个sql语句?在打开连接、执行命令、解析数据结果和关闭连接时会有一些应用程序开销。这可能是旧的速度和新的速度的区别吗?另一个区别是“一次只能抓取20行”对吗?不清楚你是怎么做到的。发布的SQL查询并没有做到这一点——它仍然在获取所有信息。我是说这里有两件事已经改变了。您需要对这两个查询(在代码中)计时,然后才能假定计数将所有时间相加。它还可能有助于指示数据库服务器的实际类型。(SQL Server?Oracle?)
false
不是我熟悉的一种SQL。似乎row\u number
加上分区by
可能会起到作用。。。我无法想象计数会花费很长时间,除非你的索引没有包括名册(isdeleted
)。很抱歉我错过了顶部
位。所以,要获得第21-40行,是否使用前41行?不管怎样,你的问题标题肯定是误导性的。不知道你在这种情况下会做什么。可能会问一个新问题,但这次使用两个不同的代码示例,链接到此问题。