【发布时间】:2019-03-04 14:11:18
【问题描述】:
我正在寻找在实际使用之前计算要用于某些微积分的行数的最佳方法。原因是我需要证明“已分析 1/100 行”、“已分析 2/100 行”等反馈。
我说的是 7000 行,执行不同计数的时间为 2 分钟。
最糟糕的是,现在我必须使用查询来获取计数,然后打开一个与上一个完全相同的游标(除了计数)并开始分析,所以代码是重复,每次我需要修改 where 子句时,我都必须修改两次。
我想把我的光标作为一个局部变量然后在 pl/sql 中运行一个 while 循环来增加一个计数器,但我不确定性能,所以这就是我问你一些建议的原因。
真的希望答案不会是使用包含总行数的已打开游标的某些神奇属性,因为我会觉得很愚蠢:(
除非经过验证的性能提升,否则我宁愿不使用 count(*) over (partition by),因为我认为乍一看太难理解。
谢谢大家
【问题讨论】:
-
我会在临时表 ID 中选择您需要的所有行。然后您可以计算它们并用于其他计算。
-
听起来你是在一个循环中一次处理一个行,所以我不确定你关心 PL/SQL 循环方法的开销。一个分析
count是做到这一点的方法,不知道这有什么困难或为什么重要。或者填充临时表或集合(对于小卷,因为这是共享服务器内存)。我不确定什么样的答案会有所帮助。 -
事实上,我只想将真正需要所有迭代的代码放入循环中。使用
count(*) over()我必须插入一个if iteration=0 then write "there are **n** records to evaluate",在我的环境中,这个简单的行意味着10 行代码(不认为我需要解释原因)。现在我认为最好的做法是使用count -
什么版本的Oracle?为版本添加标签。如果使用 Oracle 12.1 或更高版本,如果不需要精确计数,您可以将
count(*)的性能提高APPROX_COUNT_DISTINCT(manager_id);在这种情况下,这个函数看起来像“大约有 x 行”。
标签: sql oracle performance plsql oracle11g