仓酷云

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

[学习教程] MSSQL编程:怎样利用USE_CONCAT提醒

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

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

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

x
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 | 只看该作者
对递归类的树遍历很有帮助。个人感觉这个真是太棒了!阅读清晰,非常有时代感。
分手快乐 该用户已被删除
5#
发表于 2015-3-3 21:22:11 | 只看该作者
换言之,只有在不断的失败中尝试成功,而关于失败的总结却是很少的
小魔女 该用户已被删除
6#
发表于 2015-3-18 15:57:10 | 只看该作者
where子句的作用是在对查询结果进行分组前,将不符合where条件的行去掉,即在分组之前过滤数据,条件中不能包含聚组函数,使用where条件显示特定的行。
再现理想 该用户已被删除
7#
发表于 2015-3-26 03:03:26 | 只看该作者
如果是将来做数据库的开发设计,就应该详细学习T-SQL的各种细节,包括T-SQL的程序设计、存储过程、触发器以及具体使用某个开发语言来访问数据库。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

GMT+8, 2024-12-22 18:51

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

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