Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/78.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/oracle/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 有效地查找记录子集以及总计数_Sql_Oracle_Coldfusion - Fatal编程技术网

Sql 有效地查找记录子集以及总计数

Sql 有效地查找记录子集以及总计数,sql,oracle,coldfusion,Sql,Oracle,Coldfusion,我正在ColdFusion中编写一个函数,它返回与用户输入匹配的前两条记录,以及整个数据库中匹配记录的总数。该功能将用于提供自动完成功能,因此速度/效率是它最关心的问题。例如,如果函数接收到输入bl,它可能返回{sampleMatches:[blue,blade,blunt],totalMatches:5000} 为了提高速度,我尝试在一个查询中执行此操作,结果如下所示: select record, count(*) over () from table where criteria like

我正在ColdFusion中编写一个函数,它返回与用户输入匹配的前两条记录,以及整个数据库中匹配记录的总数。该功能将用于提供自动完成功能,因此速度/效率是它最关心的问题。例如,如果函数接收到输入bl,它可能返回{sampleMatches:[blue,blade,blunt],totalMatches:5000}

为了提高速度,我尝试在一个查询中执行此操作,结果如下所示:

select record, count(*) over ()
from table
where criteria like :criteria
and rownum <= :desiredCount

此解决方案的问题是count*over始终返回:desiredCount的值。我看到了一个与我类似的问题,但我的应用程序没有创建临时表的权限。那么,有没有办法在一个查询中解决我的问题?有没有更好的办法解决这个问题?谢谢

我把这篇文章写在了我的头上,所以你一定要给它计时,但我相信使用下面的CTE

只需要您写一次条件 仅返回指定的记录数量 是否已将正确的总计数添加到每个记录 并且只评估一次 SQL语句


嵌套子查询应返回所需的结果

select record, cnt
  from (select record, count(*) over () cnt
          from table
         where criteria like :criteria) 
 where rownum <= :desiredCount

但是,这将迫使Oracle完全处理查询以生成准确的计数。如果您试图执行自动完成,这似乎不太可能是您想要的,特别是当Oracle可能决定在表上执行表扫描时,如果:条件只是b,因为该谓词的选择性不够。你真的确定你需要一个完全准确的结果数吗?您是否确定您的表足够小/您的系统足够快/您的谓词具有足够的选择性以满足实际需要?是否有可能返回一个更便宜但不太准确的行数估计值?或者将计数限制在较小的范围内,例如,100,并让UI显示类似和100+以上的结果?

做到了,谢谢!为了使其正常工作,我必须删除as关键字,但在其他方面运行顺利。@Ben-您删除了as关键字,因为oracle、tx不支持它,但删除别名不可能是正确的?!我现在不能测试不,对不起,那是我的愚蠢。您需要别名。您的条件是否仅限于您知道可以使用索引的一组条件?如果用户可以设置任何疯狂的标准,那么您将做大量的工作。如果该函数用于自动完成,那么计数的目的是什么?@tbone标准列已经存在indexed@DanBracuk自动完成有两个用例;查找一组类似的记录并查找准确的记录。当用户寻找一个精确的记录时,他们首先要知道他们想要的是什么,然后根据自动完成的响应进行过滤。在查找一组记录时,用户希望知道当前条件有多少个匹配项,并查看是否应继续缩小条件范围,直到最终选择“查看所有匹配项”。对于此特定情况,我需要确切的计数。但对于未来的需求,我如何才能开始估算呢?@Josh-这要看情况而定。例如,您可以生成查询计划,并使用返回的估计行数。您可以使用SAMPLE子句并乘以适当的因子。您可以根据数据的流行情况创建直方图,并定期刷新它们,甚至可能使用优化器生成的直方图。
select record, cnt
  from (select record, count(*) over () cnt
          from table
         where criteria like :criteria) 
 where rownum <= :desiredCount