Oracle 前 10 条记录选择:过滤、排序和优化
在 Oracle 中检索前十条记录通常很简单,但添加过滤器和确定性能优先级会带来挑战。最近的一个 Stack Overflow 问题强调了这一点,重点是根据特定列选择前十条记录,同时排除满足特定条件的记录。
原始查询及其缺点
最初的 SQL 查询旨在根据几个条件选择唯一记录:非空存储容量、排除特定日期的记录以及按存储容量降序排列。 然而,查询未能正确地将结果限制为前十名。
<code class="language-sql">SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') = '06.02.2009') </code>
仅将 ROWNUM <= 10
添加到此查询不会生成正确的前 10 条,因为 ROWNUM
是在 处理 子句之前分配的。ORDER BY
解决方案:子查询方法
有效的解决方案采用子查询来正确应用过滤和排序:
<code class="language-sql">SELECT * FROM ( SELECT DISTINCT APP_ID, NAME, STORAGE_GB, HISTORY_CREATED, TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') AS HISTORY_DATE FROM HISTORY WHERE STORAGE_GB IS NOT NULL AND APP_ID NOT IN (SELECT APP_ID FROM HISTORY WHERE TO_CHAR(HISTORY_DATE, 'DD.MM.YYYY') ='06.02.2009') ORDER BY STORAGE_GB DESC ) WHERE ROWNUM <= 10</code>
首先排序,然后选择前十个。
性能改进
除了顺序更正之外,使用 代替 EXISTS
还可以显着提高性能。 NOT IN
通常提供更好的优化机会,最大限度地减少连接并提高查询执行速度。EXISTS
以上是如何通过过滤和排序高效选择Oracle中的前10条记录?的详细内容。更多信息请关注PHP中文网其他相关文章!