MSSQL教程之奥秘的DUAL ------ black_snail(原作)...
两个到底是哪一个给出了MySQL这个名字至今依然是个迷,包括开发者在内也不知道。题目奥秘的DUALblack_snail(原作)
关头字ORACLEDUAL
DUAL?有甚么奥秘的?当你想失掉ORACLE体系工夫,简复杂单敲一行SQL
不就得了吗?故弄玄虚….
SQL>selectsysdatefromdual;
SYSDATE
---------
28-SEP-03
哈哈,的确DUAL的利用很便利.可是人人晓得DUAL倒底是甚么OBJECT,它有甚么特别的举动吗?来,我们一同看一看.
起首弄分明DUAL是甚么OBJECT:
SQL>connectsystem/manager
Connected.
SQL>selectowner,object_name,object_typefromdba_objectswhereobject_namelike%DUAL%;
OWNEROBJECT_NAMEOBJECT_TYPE
-------------------------------------------
SYSDUALTABLE
PUBLICDUALSYNONYM
本来DUAL是属于SYSschema的一个表,然后以PUBLICSYNONYM的体例供其他数据库USER利用.
再看看它的布局:
SQL>descdual
NameNull?Type
-----------------------------------------------------------------------------
DUMMYVARCHAR2(1)
SQL>
只要一个名字叫DUMMY的字符型COLUMN.
然后查询一下内外的数据:
SQL>selectdummyfromdual;
DUMMY
----------
X
哦,只要一笔记录,DUMMY的值是’X’.很一般啊,没甚么奇异嘛.好,上面就有奇奥的器材呈现了!
拔出一笔记录:
SQL>connectsysassysdba
Connected.
SQL>insertintodualvalues(Y);
1rowcreated.
SQL>commit;
Commitcomplete.
SQL>selectcount(*)fromdual;
COUNT(*)
----------
2
迄今为止,统统一般.但是当我们再次查询纪录时,奇异的事变产生了
SQL>select*fromdual;
DUMMY
----------
X
方才拔出的那笔记录并没有显现出来!明显DUAL表中有两笔记录,可就是只显现一条!
再试一下删除,狠一点,全删光!
SQL>deletefromdual;/*注重没无限定前提,试图删除全体纪录*/
1rowdeleted.
SQL>commit;
Commitcomplete.
哈哈,也只要一笔记录被删失落,
SQL>select*fromdual;
DUMMY
----------
Y
为何会如许呢?岂非SQL的语法对DUAL不起感化吗?带着这个疑问,我查询了一些ORACLE官方的材料.本来ORACLE对DUAL表的操纵做了一些外部处置,只管包管DUAL表中只前往一笔记录.固然这写外部操纵是不成见的.
看来ORACLE真是储藏着无量的奇妙啊!
附:ORACLE关于DUAL表分歧平常特征的注释
Thereisinternalizedcodethatmakesthishappen.Codechecksthatensure
thatatablescanofSYS.DUALonlyreturnsonerow.Svrmgrlbehaviouris
incorrectbutthisisnowanobsoleteproduct.
Thebaseissueyoushouldalwaysrememberandkeepis:DUALtableshouldalways
have1ROW.Dualisanormaltablewithonedummycolumnofvarchar2(1).
Thisisbasicallyusedfromseveralapplicationsasapseudotablefor
gettingresultsfromaselectstatementthatusefunctionslikesysdateorother
prebuiltorapplicationfunctions.IfDUALhasnorowsatallsomeapplications
(thatuseDUAL)mayfailwithNO_DATA_FOUNDexception.IfDUALhasmorethan1
rowthenapplications(thatuseDUAL)mayfailwithTOO_MANY_ROWSexception.
SoDUALshouldALWAYShave1andonly1row
出于效率方面的考虑,InnoDB数据表的数据行级锁定实际发生在它们的索引上,而不是数据表自身上。显然,数据行级锁定机制只有在有关的数据表有一个合适的索引可供锁定的时候才能发挥效力。 是否碎片会引发效率问题?这都是需要进一步探讨的东西。varbinary(max)代替image也让SQLServer的字段类型更加简洁统一。 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 SQL语言是学习所有数据库产品的基础,无论你是做数据库管理还是做数据库开发都是这样。不过具体学习的侧重点要看你将来做哪一块,如果是做数据库管理(DBA),侧重点应该放在SQLServer的系统管理上. 多加的系统视图和实时系统信息这些东西对DBA挑优非常有帮助,但是感觉粒度还是不太细。 其实可以做一下类比,Oracle等数据库产品老早就支持了java编程,而且提供了java池参数作为用户配置接口。但是现在有哪些系统大批使用了java存储过程?!连Oracle自己的应用都不用为什么?! 如果我们从集合论(关系代数)的角度来看,一张数据库的表就是一组数据元的关系,而每个SQL语句会改变一种或数种关系,从而产生出新的数据元的关系(即产生新的表)。 其中最有名的应该是row_number了。这个终于解决了用临时表生成序列号的历史,而且SQLServer2005的row_number比Oracle的更先进。因为它把Orderby集成到了一起,不用像Oracle那样还要用子查询进行封装。 这就引发了对varchar和char效率讨论的老问题。到底如何分配varchar的数据,是否会出现大规模的碎片?
页:
[1]