plsql-获取第一行-哪一行更好?
或者这个:plsql-获取第一行-哪一行更好?,sql,oracle,plsql,Sql,Oracle,Plsql,或者这个: LV_id number; Cursor CR_test Is select t.id from table1 t where t.foo = p_foo order by t.creation_date; Open CR_test; Fetch CR_test Into LV_id; Close CR_test; 以上两种方法的效果相似,但我需要知道哪一种更有效 这是汤姆·凯特的咒语: 如果可能的话,您应该在一条SQL语句中执行此操作。 如果不能在单个SQL
LV_id number;
Cursor CR_test Is
select t.id
from table1 t
where t.foo = p_foo
order by t.creation_date;
Open CR_test;
Fetch CR_test
Into LV_id;
Close CR_test;
以上两种方法的效果相似,但我需要知道哪一种更有效 这是汤姆·凯特的咒语: 如果可能的话,您应该在一条SQL语句中执行此操作。
如果不能在单个SQL语句中执行,请在PL/SQL中执行。
如果不能在PL/SQL中执行此操作,请尝试使用Java存储过程。
如果不能在Java中执行,请在C外部过程中执行。
如果您不能在C外部例程中执行此操作,您可能需要认真思考为什么需要执行此操作
在这种情况下,最简单的方法是测试您的查询 请确保自己进行测试,表中的索引和数据可能会与表产生不同的结果。 在没有任何索引的情况下,似乎有更好的方法使用分析函数:
我使用以下代码测试查询所花费的时间(执行此块数次,结果可能会有所不同):
结果:
2.241秒
ROWNUM
的查询:1.483秒
densite\u-RANK
:1.168秒
select x.id
from(select t.id
from table1 t
where t.foo=p_foo
order by t.creation_date) x
where rownum = 1
SELECT MIN(id) KEEP (DENSE_RANK FIRST ORDER BY creation_date)
INTO lv_id
FROM table1
WHERE foo = p_foo;
DECLARE
p_foo table1.foo%TYPE := 'A';
lv_id table1.id%TYPE;
t TIMESTAMP := SYSTIMESTAMP;
BEGIN
FOR i IN 1 .. 100 LOOP
-- Query here
END LOOP;
dbms_output.put_line(SYSTIMESTAMP - t);
END;