题目如下:
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.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%’;
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 --不知道这样会不会快一些 试验下看看
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’
暂时还没有想到如何优化,
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;
--3
SELECT * FROM userTable WHERE INSTR(col_1,'aaa')<0;
--4
select * from SomeTable where instr(memberid,'aaaa')>0
SELECT‘not found’FROM userTable WHERE instr(memberid,'aaaa') = 0
注:我的方案是 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)
SELECT‘not found’FROM userTable WHERE memberid >‘aaaa’or memberid< "aaaa"试验一下。
SQL1:SELECT * FROM A WHERE count=10
【方案】:
1 count 字段加索引。
2 如果加索引还搞不定,就加full-text index,加全文索引。
SELECT‘not found’FROM userTable WHERE memberid◇‘aaaa’
【方案】
在memberid上面加位图索引
SELECT * FROM SomeTable WHERE col_1 LIKE‘%a%’;【方案】
用instr函数,加函数索引
SELECT * FROM SomeTable WHERE instr(col_1,'a')>0 ;
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
1.exists
2.隐式转换,即10-->'10'
3.<>对索引的影响
对memberid建索引(b树索引即可),语句后面条件改成where memberid<'aaaa' or memberid>'aaaa'
4.函数索引
解决办法:不能更改条件的话,只能采用instr的方式或全文检索。这里应该指前者
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')函数代替,然后建函数索引
select name from User where exists (select 1 from B where b.celebrity = user.birthday )
SQL1:SELECT * FROM A WHERE count='10'
既然是varchar 就必须带上‘’ 没必要select * 的就别select * 了
select a.name from User a inner join B b on a.birthday=b.celebrity
不知道这么多“高手”是怎么想的。
我也不明白为什么上边那么多人怎么都不用join,谁能说说为什么我知道join比in快多了
......我是没用过exists 的菜