当前位置: 首页 > news >正文

杭州互联网网站公司wordpress知更鸟主题

杭州互联网网站公司,wordpress知更鸟主题,广州部队网站建设费用,网络规划设计师报考虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。 列与列对比 某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引 select…

虽然你这列上建了索引,查询条件也是索引列,但最终执行计划没有走它的索引。下面是引起这种问题的几个关键点。

列与列对比

某个表中,有两列(id和c_id)都建了单独索引,下面这种查询条件不会走索引

select * from test where id=c_id;

这种情况会被认为还不如走全表扫描。

存在NULL值条件

我们在设计数据库表时,应该尽力避免NULL值出现,如果非要不可避免的要出现NULL值,也要给一个DEFAULT值,数值型可以给0、-1之类的, 字符串有时候给空串有问题,就给一个空格或其他。

如果索引列是可空的,很可能是不会给其建索引的,索引值是少于表的count(*)值的,所以这种情况下,执行计划自然就去扫描全表了。

select * from test where id is not null;

NOT条件

我们知道建立索引时,给每一个索引列建立一个条目,如果查询条件为等值或范围查询时,索引可以根据查询条件去找对应的条目。

反过来当查询条件为非时,索引定位就困难了,执行计划此时可能更倾向于全表扫描,这类的查询条件有:<>、NOT、in、not exists

select * from test where id<>500;
select * from test where id in (1,2,3,4,5);
select * from test where not in (6,7,8,9,0);
select * from test where not exists (select 1 from test_02 where test_02.id=test.id);

LIKE通配符

当使用模糊搜索时,尽量采用后置的通配符,例如:name||’%’,因为走索引时,其会从前去匹配索引列,这时候是可以找到的,如果采用前匹配,那么查索引就会很麻烦,比如查询所有姓张的人,就可以去搜索’张%’。

相反如果你查询所有叫‘明’的人,那么只能是%明。这时候索引如何定位呢?前匹配的情况下,执行计划会更倾向于选择全表扫描。后匹配可以走INDEX RANGE SCAN。

所以业务设计的时候,尽量考虑到模糊搜索的问题,要更多的使用后置通配符。

select * from test where name like 张||'%';

条件上包括函数

查询条件上尽量不要对索引列使用函数,比如下面这个SQL

select * from test where upper(name)='SUNYANG';

这样是不会走索引的,因为索引在建立时会和计算后可能不同,无法定位到索引。但如果查询条件不是对索引列进行计算,那么依然可以走索引。比如

select * from test where name=upper('sunyang');--INDEX RANGE SCAN

这样的函数还有:to_char、to_date、to_number、trunc等。

复合索引前导列区分大

当复合索引前导列区分小的时候,我们有INDEX SKIP SCAN,当前导列区分度大,且查后导列的时候,前导列的分裂会非常耗资源,执行计划想,还不如全表扫描来的快,然后就索引失效了。

select * from test where owner='sunyang';

数据类型的转换

当查询条件存在隐式转换时,索引会失效。比如在数据库里id存的number类型,但是在查询时,却用了下面的形式:

select * from sunyang where id='123';

Connect By Level

使用connect by level时,不会走索引。

谓词运算

我们在上面说,不能对索引列进行函数运算,这也包括加减乘除的谓词运算,这也会使索引失效。建立一个sunyang表,索引为id,看这个SQL:

select * from sunyang where id/2=:type_id;

这里很明显对索引列id进行了’/2’除二运算,这时候就会索引失效,这种情况应该改写为:

select * from sunyang where id=:type_id*2;

就可以使用索引了。

Vistual Index

先说明一下,虚拟索引的建立是否有用,需要看具体的执行计划,如果起作用就可以建一个,如果不起作用就算了。

普通索引这么建:

create index idx_test_id on test(id);

虚拟索引Vistual Index这么建:

create index idx_test_id on test(id) nosegment;

做了一个实验,首先创建一个表:

CREATE TABLE test_1116( id number, a number ); 
CREATE INDEX idx_test_1116_id on test_1116(id); 
CREATE INDEX idx_test_1116_a on test_1116(a)nosegment; 

其中id为普通索引,a为虚拟索引。

在表中插入十万条数据

begin 
for i in 1 .. 100000 loop         insert into test_1116 values (i,i); 
end loop; 
commit; 
end; 

接着分别去执行下面的SQL看时间,由于在内网机做实验,图贴不出来,数据保证真实性。

select count(id) from test_1116;--第一次耗时:0.061秒--第二次耗时:0.016秒
select count(a) from test_1116; --第一次耗时:0.031秒--第二次耗时:0.016秒

因为在执行过一次后,oracle对结果集缓存了,所以第二次执行耗时不走索引,走内存就都一样了。可以看到在这种情况下,虚拟索引比普通索引快了一倍。

具体虚拟索引的使用细节,这里不再展开讨论。

Invisible Index

Invisible Index是oracle 11g提供的新功能,对优化器(还接到前面博客里讲到的CBO吗)不可见,我感觉这个功能更主要的是测试用,假如一个表上有那么多索引,一个一个去看执行计划调试就很慢了,这时候不如建一个对表和查询都没有影响的Invisible Index来进行调试,就显得很好了。

通过下面的语句来操作索引

alter index idx_test_id invisible;alter index idx_test_id visible;

如果想让CBO看到Invisible Index,需要加入这句:

alter session set optimizer_use_invisible_indexes = true;

基本就这些了,有问题欢迎留言指出,共同进步!

http://www.15wanjia.com/news/179775.html

相关文章:

  • 一级做a免费体验区不用下载网站上海设计展2021室内设计
  • 做电影网站失败了龙岩人才网
  • 长春网页制作建站重庆旅游景点
  • 做网站能用python吗手把手教建设网站
  • wordpress cdn国内插件百度seo关键词排名 s
  • 国外游戏商城网站欣赏58同城网站建设目的
  • 烟台莱山城市建设网站免费接码网页版中国
  • wordpress+整站下载十堰seo
  • wordpress网站下载google下载官方版
  • 公司注销后 网站备案注册网站需要实名认证吗
  • 在线教育自助网站建设平台网站seo源码
  • 和布克赛尔网站建设有哪些可以做头像的网站
  • 有没有大人和小孩做的网站Checkout v1.4.1 WordPress主题
  • 建设网站什么软件比较好wordpress的FTP帐号
  • 国内旅游网站排行榜宁波网站推广专业的建站优化公司
  • 达州网站建设的公司wordpress微信联系
  • 做团购网站的公司百度网盘人工申诉电话
  • 网站建设aichengkeji深圳推广系统多少钱
  • 做的比较好的网站有哪些长沙网建站
  • cms建站方案2100000000级超变传奇
  • 公司网站开发费用怎么做账免费文档模板素材网站
  • 汽配人网做网站wordpress主题 dux主题5.0
  • 1核2g+做网站中山做网站哪个公司好
  • 梅州市城乡建设局网站网站建设运营公司企业特色
  • 请描述网站开发的一般流程图张家港江阴网站设计
  • 北京建站公司哪家好都选万维科技高校网站设计方案
  • 食品网站建设客户需求调查表网站策划做啥
  • 阿里云网站怎么备案wordpress 云备份数据库
  • 遂宁市网站建设网站换服务器怎么做
  • 物流管理网站建设国药控股cms系统