仓酷云

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 556|回复: 8
打印 上一主题 下一主题

[学习教程] MSSQL网页设计利用索引的误区之六:为索引列都创建索...

[复制链接]
若相依 该用户已被删除
跳转到指定楼层
楼主
发表于 2015-1-16 22:37:44 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
有了数据以后,我们就要想一个比较统一的方法来闪回。上面我们说了对于DML操作,可以通过反向执行所有逆操作来实现,对于语句里面的DDL,只能直接跳过。原因是一个DDL不一定有直接的逆操作。索引利用索引的误区之六:为一切列都创建索引
我们晓得,创建索引是为了进步查询的效力,可是同时也应当注重到,索引增添了对DML操纵(insert,update,delete)的价值,并且,一给中的索引假如太多,那末多半的索引是基本不会被利用到的,而另外一方面我们保护这些不被利用的以是还要年夜幅度下降体系的功能。以是,索引不是越多越好,而是要恰如其分的利用。



好比说,有些列因为利用了函数,我们要利用已有的索引(如一些复合索引)是不成能的(具体请拜见后面“函数索引”),那末就必需创建独自的函数索引,假如说这个函数索引很少会被使用(仅仅在几个出格的sql中会用到),我们就能够实验改写查询,而不往创建和保护谁人函数索引,比方:

C:>sqlplusdemo/demo



SQL*Plus:Release9.2.0.1.0-ProductiononSunOct1707:47:302004



Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.





Connectedto:

Oracle9iEnterpriseEditionRelease9.2.0.1.0-Production

WiththeOLAPandOracleDataMiningoptions

JServerRelease9.2.0.1.0-Production



SQL>showuser

Useris"demo"



SQL>descemp

NameTypeNullableDefaultComments

-------------------------------------------

EMPNONUMBER(4)

ENAMEVARCHAR2(10)Y

JOBVARCHAR2(9)Y

MGRNUMBER(4)Y

HIREDATEDATEY

SALNUMBER(7,2)Y

COMMNUMBER(7,2)Y

DEPTNONUMBER(2)Y



SQL>createindexemp_id3onemp(hiredate);



Indexcreated





1,trunc函数

SQL>selectempno,ename,deptnofromempwheretrunc(hiredate)=2004-01-01;



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10TABLEACCESS(FULL)OFEMP









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

3consistentgets

0physicalreads

0redosize

328bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



将下面的查询转换为:

SQL>selectempno,ename,deptnofromemp

2wherehiredate>=to_date(2004-01-01,yyyy-mm-dd)

3andhiredate<to_date(2004-01-01,yyyy-mm-dd)+0.999;



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10TABLEACCESS(BYINDEXROWID)OFEMP

21INDEX(RANGESCAN)OFEMP_ID3(NON-UNIQUE)









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

1consistentgets

0physicalreads

0redosize

328bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



SQL>





2,to_char函数

SQL>selectempno,ename,deptnofromemp

2whereto_char(hiredate,yyyy-mm-dd)=2003-09-05;



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10TABLEACCESS(FULL)OFEMP









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

3consistentgets

0physicalreads

0redosize

328bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



SQL>selectempno,ename,deptnofromemp

2wherehiredate=to_date(2003-09-05,yyyy-mm-dd);



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10TABLEACCESS(BYINDEXROWID)OFEMP

21INDEX(RANGESCAN)OFEMP_ID3(NON-UNIQUE)









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

1consistentgets

0physicalreads

0redosize

328bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



SQL>

注重,转换时注重数据库中对字段的精度,如yyyymmyy,大概yyyymmddhh24miss



3,to_date函数

拜见下面的办法





4,substr函数

SQL>descdept

NameNull?Type

-----------------------------------------------------------------------------

DEPTNONUMBER(2)

DNAMEVARCHAR2(14)

LOCVARCHAR2(13)



SQL>createindexdept_id1ondept(dname);



Indexcreated.



SQL>selectdnamefromdeptwheresubstr(dname,1,3)=abc;



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10TABLEACCESS(FULL)OFDEPT









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

7consistentgets

0physicalreads

0redosize

221bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



SQL>selectdnamefromdeptwherednamelikeabc%;



norowsselected





ExecutionPlan

----------------------------------------------------------

0SELECTSTATEMENTOptimizer=CHOOSE

10INDEX(RANGESCAN)OFDEPT_ID1(NON-UNIQUE)









Statistics

----------------------------------------------------------

0recursivecalls

0dbblockgets

1consistentgets

0physicalreads

0redosize

221bytessentviaSQL*Nettoclient

372bytesreceivedviaSQL*Netfromclient

1SQL*Netroundtripsto/fromclient

0sorts(memory)

0sorts(disk)

0rowsprocessed



SQL>



一般,为了平衡查询的效力和DML的效力,我们要细心的剖析使用,找出来呈现频次绝对较多、字段内容较少(好比varchar2(1000)就不合适创建索引,而varchar2(10)绝对来讲就合适创建索引)的列,公道的创建索引,好比偶然候我们但愿创建复合索引,偶然候我们更但愿创建单键索引。

现实上,oracle的索引另有良多话题,如监督索引的利用情形,Oracle9i推出的SKIPSCAN等等,鄙人一个会商中,我们会对这些话题具体论述。




优化的SQL查询算法,有效地提高查询速度
乐观 该用户已被删除
沙发
发表于 2015-1-19 19:14:59 | 只看该作者
你可以简单地认为适合的就是好,不适合就是不好。
莫相离 该用户已被删除
板凳
发表于 2015-1-25 17:36:37 | 只看该作者
对于微软系列的东西除了一遍遍尝试还真没有太好的办法
活着的死人 该用户已被删除
地板
发表于 2015-2-3 12:14:12 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
老尸 该用户已被删除
5#
发表于 2015-2-8 21:33:38 | 只看该作者
对一张百万级别的表建游标,同时又没有什么过滤条件,取得游标效率是如果直接SQL查询百万条数据;如果再对每条记录做处理,耗时将更长。
简单生活 该用户已被删除
6#
发表于 2015-2-26 11:26:03 | 只看该作者
外键的级联更能扩展可能大部分的同行在设计OLTP系统的时候都不愿意建立外键,都是通过程序来控制父子数据的完整性。
只想知道 该用户已被删除
7#
发表于 2015-3-8 14:05:44 | 只看该作者
having子句的作用是筛选满足条件的组,即在分组之后过滤数据,条件中经常包含聚组函数,使用having条件显示特定的组,也可以使用多个分组标准进行分组。
若相依 该用户已被删除
8#
 楼主| 发表于 2015-3-16 02:09:23 | 只看该作者
比如,MicrosoftSQLServer2008的某一个版本可以满足现在的这个业务的需要,而且价格还比Oracle11g要便宜,那么这一产品就是适合的。
再见西城 该用户已被删除
9#
发表于 2015-3-22 18:32:21 | 只看该作者
不过话说回来了,绝大多数的性能优化准则与对sqlserver存储的结构理解息息相关
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|仓酷云 鄂ICP备14007578号-2

GMT+8, 2024-12-22 23:11

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表