题目如下:
1.User表有name和birthday两个字段,B表只有celebrity一个字段,要求取出user的name,条件是birthday存在于B表的celebrity字段中,现有的Sql语句是select name from User where birthday in (select celebrity from B),要求优化这段Sql语句。
注:我的方案是 select name from User where birthday in (select distinct celebrity from B. 可能没优化多少。2.从A表中取出数据,根据count(VARCHAR2(10))字段进行检索,把count是10的数据取出来,下面的SQL文性能有点低,请写出性能高的2个SQL文
   SQL1:SELECT * FROM A WHERE count=103.有以下SQL文,为提高性能,请对其进行修改(userTable没有index)
SELECT‘not found’FROM userTable WHERE memberid◇‘aaaa’4.从SomeTable表中取出数据,根据col_1(VARCHAR2(10))字段进行模糊查询,下面的SQL文性能有点低,请写出性能高的一个SQL文
   SELECT * FROM SomeTable WHERE col_1 LIKE‘%a%’;

解决方案 »

  1.   


    select name from User where  exists (select 1 from B where a.birthday  = b.celebrity );
    方法二  
    select name from User a
    (select celebrity from B)b
     where a.birthday = b.celebrity 
    3.
    SELECT‘not found’FROM userTable WHERE memberid<‘aaaa’ and memberid>‘aaaa’
    4
    SELECT * FROM SomeTable WHERE instr(col_1,a) >= 1 --不知道这样会不会快一些 试验下看看 
      

  2.   

    1:用EXISTS
    select name from User where exists (select 1 from B where  b.celebrity = user.birthday )2:SELECT * FROM A WHERE count=10
    这个还能提高?在COUNT上加索引都未必快....把*用字段名代替试试3:索引只能告诉你什么存在于表中, 而不能告诉你什么不存在于表中,即使有索引'<>'也不走索引。
    SELECT‘not found’FROM userTable WHERE memberid◇‘aaaa’
    暂时还没有想到如何优化,
      

  3.   

     按照下面的思路试试看!1.select name 
        from User a 
       where exists (select 1 
                       from B b
                       where b.celebrity = a.birthday 
                     );
    2.在count字段上建个索引
       SQL语句改成: SELECT * FROM A WHERE count='10';
    3.userTable没有index,只能这样了!除非个索引。
    4.在字段col_1建个instr函数索引
    SELECT * FROM SomeTable WHERE INSTR(col_1,'a')>0;
      
      

  4.   


    --3
    SELECT * FROM userTable WHERE INSTR(col_1,'aaa')<0;
    --4
    select   * from SomeTable where instr(memberid,'aaaa')>0
      

  5.   

    修改下 3.
    SELECT‘not found’FROM userTable WHERE  instr(memberid,'aaaa') = 0
      

  6.   

    1.User表有name和birthday两个字段,B表只有celebrity一个字段,要求取出user的name,条件是birthday存在于B表的celebrity字段中,现有的Sql语句是select name from User where birthday in (select celebrity from B),要求优化这段Sql语句。
    注:我的方案是 select name from User where birthday in (select distinct celebrity from B. 可能没优化多少。【方案】:
    1, 用exists比如:
       select name from User u 
       where exists( select 1 from  B where B.celebrity = u.birthday).2,用临时表,将select distinct celebrity from B存放入临时表cele_tmp表里面。
       然后
       select name from User u where exists(select 1 from cele_tmp   where     B.celebrity = u.birthday)
      

  7.   

    SELECT‘not found’FROM userTable WHERE memberid◇‘aaaa’在memberid字段上建立个索引,然后把改成如下语句
    SELECT‘not found’FROM userTable WHERE memberid >‘aaaa’or memberid< "aaaa"试验一下。
      

  8.   

    2.从A表中取出数据,根据count(VARCHAR2(10))字段进行检索,把count是10的数据取出来,下面的SQL文性能有点低,请写出性能高的2个SQL文
      SQL1:SELECT * FROM A WHERE count=10

    【方案】:
    1 count 字段加索引。
    2 如果加索引还搞不定,就加full-text index,加全文索引。
      

  9.   

    3.有以下SQL文,为提高性能,请对其进行修改(userTable没有index)
    SELECT‘not found’FROM userTable WHERE memberid◇‘aaaa’
    【方案】
    在memberid上面加位图索引
      

  10.   

    4.从SomeTable表中取出数据,根据col_1(VARCHAR2(10))字段进行模糊查询,下面的SQL文性能有点低,请写出性能高的一个SQL文
      SELECT * FROM SomeTable WHERE col_1 LIKE‘%a%’;
    【方案】
    用instr函数,加函数索引
    SELECT * FROM SomeTable WHERE instr(col_1,'a')>0 ; 
      

  11.   

    1. 对于数据量超大的表来说,exist 肯定比in 快。
        select name from User where exists 
         (
              select 1 from B where a.birthday =  b.celebrity 
          );2 .除了索引,想不到其他的 ,当时字符应该是Varchar的,楼主写错了吧
        SELECT * FROM A WHERE count=‘10’
    3. do not know4. 至于这个 在PLSQL下做了个小测试:
       
    create table SomeTable (name varchar2(50), descript varchar2(200))
    select count(1) from SomeTable  begin
           for a in 1..1000000 
           loop
              insert into SomeTable values (a, 'oiuoi'||a );
           end loop;
    end;因为数据太大,所以测试了20W条, 没索引。
    SELECT descript FROM SomeTable WHERE descript LIKE'%5%';      -- 85.922s
    SELECT descript FROM SomeTable WHERE INSTR(descript,'5')>0;   --77.015s
      

  12.   

    这些考题的意图应该是
    1.exists
    2.隐式转换,即10-->'10'
    3.<>对索引的影响
      对memberid建索引(b树索引即可),语句后面条件改成where memberid<'aaaa' or memberid>'aaaa'
    4.函数索引
      

  13.   

    第四道考的是使用Like时匹配方式对索引使用的影响
    解决办法:不能更改条件的话,只能采用instr的方式或全文检索。这里应该指前者
      

  14.   

    说得具体一些..
    1.当b表数据量很大,且celebrity 列建有索引且选择性较高时,使用exists性能要比in高得多
    2.等号两边的类型不匹配,产生隐式转换。而隐式转换在数值和字符串中的规则是把字符串隐式转换到数值。所以这个语句的条件等价于 to_number(count)=10 从而使索引失效。解决办法是将转换放到右边,从而使count列上的索引生效。或建to_number(count)索引
    3.使用<>将不会使用相应的索引,而使查询采用full table scan的方式
    改成< or >会使用index range scan的方式,将2个范围的结果集合并
    4.like 'a%'可能会使用该列的索引,而'%a%'不能。如果统计的要求必须达到'%a%'的效果,可以用Instr(colname,'a')函数代替,然后建函数索引
      

  15.   

    知无不言言无不尽,CSDN真是藏龙卧虎,谢谢大家。
      

  16.   

    1:用EXISTS
    select name from User where exists (select 1 from B where b.celebrity = user.birthday )
      

  17.   

    第二个2.从A表中取出数据,根据count(VARCHAR2(10))字段进行检索,把count是10的数据取出来,下面的SQL文性能有点低,请写出性能高的2个SQL文
      SQL1:SELECT * FROM A WHERE count='10'
    既然是varchar 就必须带上‘’ 没必要select * 的就别select * 了
      

  18.   

    第一个明显是用连结查询。
    select a.name from User a inner join B b on a.birthday=b.celebrity
    不知道这么多“高手”是怎么想的。
      

  19.   


    我也不明白为什么上边那么多人怎么都不用join,谁能说说为什么我知道join比in快多了
    ......我是没用过exists 的菜