ITPub博客

首页 > Linux操作系统 > Linux操作系统 > 多年前dba面试的一道题

多年前dba面试的一道题

原创 Linux操作系统 作者:萧筱筱 时间:2010-10-17 10:02:58 0 删除 编辑

多年前参加dba面试时碰到的一道题,当时不会做,主考官也只是大致说了个思路,这么多年来一直想回答,却因为种种原因没有去答,整理笔记的时候,复又想起这道题...

对一张千万级的表,你要确定一个字段上,是否有某个值的记录,如果不使用count,有什么方法?

比如acct表,要确认是否有status=5的记录,不需要知道有多少条,只需要确认是否有该值的记录,可以如何实现?

答案如下:

DECLARE
  CURSOR curacct IS
    select status FROM acct;

  v_status acct.status%TYPE;

BEGIN
  --open方式引用cursor
  OPEN curacct;
  LOOP
    FETCH curacct
      INTO v_status;
    IF (curacct%NOTFOUND) THEN
      EXIT;
    END IF;
    if (v_status = 5) then
      dbms_output.put_line('there is acct that status=5');
      exit;
    end if;
  END LOOP;
  CLOSE curacct;
end;

大家知道,像status这种索引性很低的字段,通常索引的效率很低,即使加了索引,查询也不会快。用cursor去逐行扫描,只要有结果就返回,从某种意义上,效率是会更高的;最坏的情况是,没有匹配的值,那效率就会低于用count。

简单做个实验,对一张3千万级的表

当status取值存在并且靠前的时候,用cursor,0.016秒就可以得出结果;

而用count(*) ,条件status=5的话,要141秒;

当status取值不存在的时候,用cursor,要596秒

用count,是111秒;

当然,status的取值如果是一个枚举列表的话,就更加倾向于使用cursor了。



Link URL: http://echo.sharera.com/blog/BlogTopic/73699.htm

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/26127/viewspace-676127/,如需转载,请注明出处,否则将追究法律责任。

下一篇: 没有了~
请登录后发表评论 登录
全部评论

注册时间:2009-02-08

  • 博文量
    47
  • 访问量
    27108