关于一Sql语句的执行速度问题?

fsroger 2006-12-02 05:55:51
create or replace function GetKindName(iSequence in number) return Varchar2
deterministic
is
type MyCurType is ref cursor;
MyCur MyCurtype;
a Varchar2(20);
SqlStr String(3000);
begin
SqlStr:='SELECT sKindName FROM Kind Where iSequence='||iSequence;
open MyCur for SqlStr;
FETCH MyCur INTO a;
RETURN a;
end GetKindName;

这自定义函数是返回一个类型的中文名称


第一条sql语句:select * from (select table_a.*,rownum as my_rownum from (Select sPersonName,iPersonCount, From xrecord ) table_a where rownum<=40560) where my_rownum>=40546

第二条sql语句:select * from (select table_a.*,rownum as my_rownum from (Select sPersonName,iPersonCount,GetKindName(iKind) From xrecord ) table_a where rownum<=40560) where my_rownum>=40546

为何增加了GetKindName(iKind)语句后,查询速度变得奇慢,而且 rownum越大,变得越慢,有什么解决的方法。此语句用左分页使用

...全文
224 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
21ithorse 2006-12-09
  • 打赏
  • 举报
回复
Oracle在显示字段用函数来处理不会用你的索引,所以大数据时非常慢,这一点与SQL有很大的区分
sasacat 2006-12-03
  • 打赏
  • 举报
回复
看不出这个函数有什么意思。你直接两表关联查询不就行了吗?


SELECT table_a.*, skindname
FROM (SELECT spersonname, ipersoncount, ikind, ROWNUM AS my_rownum
FROM xrecord
WHERE ROWNUM <= 40560) table_a,
kind table_b
WHERE my_rownum >= 40546 AND table_a.ikind = table_b.isequence
sasacat 2006-12-03
  • 打赏
  • 举报
回复
你的相当于先找出40000多条记录,再一条一条去KIND表中找对应记录。

我的是先找出15条记录。然后再与KIND表关联,你说哪种快
kittykula 2006-12-03
  • 打赏
  • 举报
回复
函数里面有查询啊。

xrecord 选出多少条记录 你的函数就要执行多少次

函数每执行一次就要select一次。


联查 只要 select 一次就行了。
fsroger 2006-12-03
  • 打赏
  • 举报
回复
可以两表查询。但我是想探讨一下,为什么会出现这种执行效率上的差异?
如果我查询的时候,碰见多表联合查询的下,我感觉如果有自定义函数的话,比较直观

17,082

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧