柔情似水 发表于 2015-1-16 22:37:44

MSSQL编程:怎样利用USE_CONCAT提醒

MySQL最初的开发者的意图是用mSQL和他们自己的快速低级例程(ISAM)去连接表格。经过一些测试后,开发者得出结论:mSQL并没有他们需要的那么快和灵活。
利用USE_CONCAT提醒

--UseUSE_CONCAThintsinOracle

LastUpdated:Thursday,2004-11-1821:48Eygle






USE_CONCAT提醒强制优化器扩大查询中的每个OR谓词为自力的查询块.
最初兼并一切查询块的了局,前往了局集给用户。

当利用多个in-lists查询时,Oracle大概选择把单个查询扩大为多个查询块。

利用USE_CONCAT提醒示例:

1.利用scott用户及尺度表举行测试


$sqlplusscott/tigerSQL*Plus:Release9.2.0.4.0-ProductiononWedNov1715:17:512004Copyright(c)1982,2002,OracleCorporation.Allrightsreserved.Connectedto:Oracle9iEnterpriseEditionRelease9.2.0.4.0-64bitProductionWiththePartitioning,OLAPandOracleDataMiningoptionsJServerRelease9.2.0.4.0-ProductionSQL>setautotraceonSQL>select*fromempwhereempnoin(7788,7900);EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7788SCOTTANALYST756619-APR-873000207900JAMESCLERK769803-DEC-8195030ExecutionPlan----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE(Cost=2Card=2Bytes=74)10TABLEACCESS(FULL)OFEMP(Cost=2Card=2Bytes=74)--注重,此处Oracle选择了全表扫描,由于本钱较低。Statistics----------------------------------------------------------0recursivecalls0dbblockgets4consistentgets0physicalreads0redosize1032bytessentviaSQL*Nettoclient655bytesreceivedviaSQL*Netfromclient2SQL*Netroundtripsto/fromclient0sorts(memory)0sorts(disk)2rowsprocessed

2.增加提醒



SQL>select/*+use_concat*/*fromempwhereempnoin(7788,7900);EMPNOENAMEJOBMGRHIREDATESALCOMMDEPTNO------------------------------------------------------------------------------7900JAMESCLERK769803-DEC-81950307788SCOTTANALYST756619-APR-87300020ExecutionPlan----------------------------------------------------------0SELECTSTATEMENTOptimizer=CHOOSE(Cost=4Card=2Bytes=74)10CONCATENATION21TABLEACCESS(BYINDEXROWID)OFEMP(Cost=2Card=1Bytes=37)32INDEX(UNIQUESCAN)OFPK_EMP(UNIQUE)(Cost=1Card=14)41TABLEACCESS(BYINDEXROWID)OFEMP(Cost=2Card=1Bytes=37)54INDEX(UNIQUESCAN)OFPK_EMP(UNIQUE)(Cost=1Card=14)--利用use_concat提醒今后,Oracle将in-lists前提睁开为两个查询块,分离利用索引,最初CONCATENATION失掉最初输入。--注重,这里强迫利用索引诱致本钱上升为4。Statistics----------------------------------------------------------0recursivecalls0dbblockgets4consistentgets0physicalreads0redosize1032bytessentviaSQL*Nettoclient655bytesreceivedviaSQL*Netfromclient2SQL*Netroundtripsto/fromclient0sorts(memory)0sorts(disk)2rowsprocessedSQL>

3.Oracle关于实行企图的改写

关于inlist查询,Oracle一般会举行改写,将形如

select.....from.......where....in(..........)

的sql语句,改写为unionall的情势来实行,这个改写一般是潜伏的。

但是这一改写大概存在成绩,假如inlist中的值对照多的话,CBO花在剖析实行路径上的工夫和本钱城市相称年夜,此时我们一般必要制止Oracle的这一睁开操纵.
我们能够经由过程NO_EXPAND提醒来制止Oracle举行如许的改写。

那末实践上,在这里,USE_CONCAT和NO_EXPAND成了互为"反函数"。在利用了NO_EXPAND提醒后,从Oracle8以后,Oracle会利用"inlistiterator"
体例来实行SQL,如许能够用到index。



本文作者:
eygle,Oracle手艺存眷者,来自中国最年夜的Oracle手艺论坛itpub.
www.eygle.com是作者的团体站点.你可经由过程Guoqiang.Gai@gmail.com来接洽作者.接待手艺切磋交换和链接互换.

原文出处:

http://www.eygle.com/sql/How.to.Use.USE_CONCAT.hints.in.Oracle.htm


虽然可以将一个droptable语句转换成先delete再删表,性能却会降低很多。这里我们用上面说道的另外一种可用数据:“操作前数据备份”。

简单生活 发表于 2015-1-19 19:10:17

分区表是个亮点!从分区表也能看出微软要做大作强SQLServer的信心。资料很多,这里不详细说。但是重点了解的是:现在的SQLServer2005的表,都是默认为分区表的。因为它要支持滑动窗口的这个特性。这种特性对历史数据和实时数据的处理是很有帮助的。

小女巫 发表于 2015-2-5 20:21:24

无法深入到数据库系统层面去了解和探究

admin 发表于 2015-2-13 12:51:29

对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。

分手快乐 发表于 2015-3-3 21:22:11

换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的

小魔女 发表于 2015-3-18 15:57:10

where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。

再现理想 发表于 2015-3-26 03:03:26

如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
页: [1]
查看完整版本: MSSQL编程:怎样利用USE_CONCAT提醒