小魔女 发表于 2015-1-16 22:37:44

MSSQL教程之利用索引的误区之二:利用了 和 != 操...

Cluster/NDB高冗余的存储引擎,用多台数据机器联合提供服务以提高整体性能和安全性。适合数据量大,安全和性能要求高的应用索引利用索引的误区之二:利用了和!=操纵符,招致查询不利用索引
起首,请记着这个结论:

利用了和!=后,就不会利用索引



比方,上面的例子利用了,以是查询没有效到索引

selectempnofromempwhereempno10;



PLAN_TABLE_OUTPUT

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

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

|Id|Operation|Name|Rows|Bytes|Cost|

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

|0|SELECTSTATEMENT|||||

|*1|TABLEACCESSFULL|EMP||||

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

PredicateInformation(identifiedbyoperationid):

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

1-filter("EMP"."EMPNO"10)

Note:rulebasedoptimization



14rowsselected





将下面的查前提“empno10”转换成“empno<10andempno>10”后,就能够利用索引了

selectempnofromempwhereempno<10andempno>10;



PLAN_TABLE_OUTPUT

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

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

|Id|Operation|Name|Rows|Bytes|Cost|

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

|0|SELECTSTATEMENT|||||

|*1|INDEXRANGESCAN|EMP_ID1||||

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

PredicateInformation(identifiedbyoperationid):

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

1-access("EMP"."EMPNO">10AND"EMP"."EMPNO"<10)

Note:rulebasedoptimization



14rowsselected



SQL>



再看上面的例子:

因为利用了前导列,以是利用了索引,前面的"!="是从索引局限扫描的了局中选择符合的纪录的

selectempnofromempwhereempno<=10andename!=RICH;



PLAN_TABLE_OUTPUT

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

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

|Id|Operation|Name|Rows|Bytes|Cost|

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

|0|SELECTSTATEMENT|||||

|*1|INDEXRANGESCAN|EMP_ID1||||

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

PredicateInformation(identifiedbyoperationid):

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

1-access("EMP"."EMPNO"<=10)

filter("EMP"."EMPNO"<=10AND"EMP"."ENAME"RICH)

Note:rulebasedoptimization



15rowsselected





再做一个实验:

SQL>descdept

NameTypeNullableDefaultComments

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

DEPTNONUMBER(2)Y

DNAMEVARCHAR2(14)Y

LOCVARCHAR2(13)Y



创立一个单键索引:

SQL>createindexdept_id1ondept(dname);



Indexcreated



假如利用"",则查询不利用索引:

selectdepTnofromdeptwherednameDEVELOPER;



PLAN_TABLE_OUTPUT

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

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

|Id|Operation|Name|Rows|Bytes|Cost|

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

|0|SELECTSTATEMENT|||||

|*1|TABLEACCESSFULL|DEPT||||

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

PredicateInformation(identifiedbyoperationid):

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

1-filter("DEPT"."DNAME"DEVELOPER)

Note:rulebasedoptimization



14rowsselected



将前提修正为“dname<DEVELOPERanddname>DEVELOPER”,则可使用索引

selectdeptnofromdeptwheredname<DEVELOPERanddname>DEVELOPER;



PLAN_TABLE_OUTPUT

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

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

|Id|Operation|Name|Rows|Bytes|Cost|

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

|0|SELECTSTATEMENT|||||

|1|TABLEACCESSBYINDEXROWID|DEPT||||

|*2|INDEXRANGESCAN|DEPT_ID1||||

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

PredicateInformation(identifiedbyoperationid):

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

2-access("DEPT"."DNAME">DEVELOPERAND"DEPT"."DNAME"<DEVELOPER)

Note:rulebasedoptimization



15rowsselected



SQL>




BDB源自BerkeleyDB,事务型数据库的另一种选择,支持COMMIT和ROLLBACK等其他事务特性

爱飞 发表于 2015-1-19 19:13:49

原理很简单,对要求长时间计算某一时间点的报表生成和防用户操作错误很有帮助。但是比起Oracle10g的闪回技术还是细粒度不够。可惜!

只想知道 发表于 2015-1-25 22:41:06

我们学到了什么?思考问题的时候从表的角度来思考问

莫相离 发表于 2015-2-4 10:46:03

从项目平台的选择上讲,我们关心的,应该是一款产品能不能满足任务需求,而不是网上怎么说。

灵魂腐蚀 发表于 2015-2-9 22:15:09

在select语句中可以使用groupby子句将行划分成较小的组,然后,使用聚组函数返回每一个组的汇总信息,另外,可以使用having子句限制返回的结果集。

兰色精灵 发表于 2015-2-28 00:20:18

另一个是把SQL语句写到服务器端,就是所谓的SP(存储过程);

若天明 发表于 2015-3-9 16:58:49

我是一个ERP初学者,对于前台运用基本熟悉,但对于后台SQLServer的运用一点也不懂,特想学习下相关资料。至少懂得一些基本的运用。希望各位能给于建议,小弟再谢过!

若相依 发表于 2015-3-23 09:09:28

SP4包括用于以下SQLServer2000组件的程序包:Database组件(下载文件:SQL2000-KB884525-SP4-x86.EXE)更新SQLServer2000的32位Database组件,包括数据库引擎、复制、客户端连接组件及工具。有关其他信息,请参阅ReadmeSql2k32Sp4.htm。AnalysisServices组件(下载文件:SQL2000.AS-KB884525-SP4-x86.EXE)更新SQLServer2000的32位AnalysisServices。
页: [1]
查看完整版本: MSSQL教程之利用索引的误区之二:利用了 和 != 操...