动态网站制作指南 [  QQ表情  ]
[ 投票调查 ]
[ 企业邮箱 ]
[ 网站空间 ]
网络编程 | 站长之家 | 网页制作 | 图形图象 | 操作系统 | 冲浪宝典 | 软件教学 | 网络办公 | 邮件系统 | 网络安全 | 认证考试 | 系统进程
ASP源码 | .Net源码 | PHP源码 | JSP源码 | JAVA源码 | CGI源码 | VB源码 | C++源码 | Delphi源码 | PB源码 | VF源码 | 汇编 | 服务器
电脑书籍下载:程序设计书籍 | 数据库教程书籍 | 平面与多媒体书籍 | 网络通讯书籍 | 系统管理书籍 | 网络安全书籍 | 认证考试书籍
Firefox | IE | Maxthon | 迅雷 | 电驴 | BitComet | FlashGet | QQ | QQ空间 | Vista | 输入法 | Ghost | Word | Excel | wps | Powerpoint
asp | .net | php | jsp | Sql | c# | Ajax | xml | Dreamweaver | FrontPages | Javascript | css | photoshop | fireworks | Flash | Cad | Discuz!
当前位置 > 网站建设学院 > 网络编程 > 数据库 > 数据库技巧
Tag:注入,存储过程,分页,安全,优化,xmlhttp,fso,jmail,application,session,防盗链,stream,无组件,组件,md5,乱码,缓存,加密,验证码,算法,cookies,ubb,正则表达式,水印,索引,日志,压缩,base64,url重写,上传,控件,Web.config,JDBC,函数,内存,PDF,迁移,结构,破解,编译,配置,进程,分词,IIS,Apache,Tomcat,phpmyadmin,Gzip,触发器,socket
网络编程:ASP教程,ASP.NET教程,PHP教程,JSP教程,C#教程,数据库,XML教程,Ajax,Java,Perl,Shell,VB教程,Delphi,C/C++教程,软件工程,J2EE/J2ME,移动开发
数据库:数据库教程,数据库技巧,Oracle教程,MySQL教程,Sybase教程,Access教程,DB2教程,数据库安全,数据库文摘
文章搜索服务
邮件订阅
输入你的邮件地址,
你将不会错过任何关于:
[ 数据库技巧 ]的信息



本月文章推荐
.一些比较常见的SQL Server扩展存.
.如何实现将Excel表(含多张数据库.
.SQL Server编写存储过程小工具(一.
.SQL技巧:快速掌握一些异常精妙的.
.初学者必读:使用存储过程都有哪.
.实现删除主表数据时, 判断与之关.
.Microsoft数据平台开发与SQL Ser.
.讲解Informix安全特性保护数据的.
.页面中标题替换方法,在SQL中取数.
.在sqlserver2005中安装sql serve.
.列出SQL SERVER 所有表,字段名,.
.讲解关系型数据库中游标的优点及.
.简单三步走堵死SQLServer注入漏洞.
.优化数据库的方法及SQL语句优化的.
.设计数据库之经验谈.
.如何恢复/修复SQL Server的MDF文.
.查询Sql server数据死锁和阻塞的.
.SQL扩展存储过程安装与卸载 .
.把SQL数据库部署到远程数据库服务.
.带你深入了解数据仓库优化中的星.

使用"hint"设置视图内的SQL查询方式

发表日期:2008-3-11 |


本文主要介绍了Oracle数据库如何在有视图的SQL中使用hint(提示)来设置视图内的SQL查询方式。

在实际的工作中,很多人经常会用到视图访问,且视图一般都是已经写好了,但在许多情况下,并不太适宜在视图内直接加hint。

环境如下:

--创建一个表T1,有两个字段C1、C2
create table T1
(
  C1 VARCHAR2(30) not null,
  C2 NUMBER
);
--在C2上建有BTree索引(IDX$T1$C2)
create index IDX$T1$C2 on T1 (C2);
--创建一个表T2,有两个字段C1、C2
create table T2
(
  C1 VARCHAR2(30) not null,
  C2 NUMBER
);

--建有一个视图V1
create or replace view v1 as
select * from t1
union all
select * from t2;
--现有一条语句如下:
select  *  from V1  where V1.c2>'171'
--执行计划如下所示:
PLAN_TABLE_OUTPUT
-------------------------------------------------------------------
--------------------------------------------------------------------
| Id  | Operation            |  Name       | Rows  | Bytes | Cost  |
--------------------------------------------------------------------
|   0 | SELECT STATEMENT     |             | 59428 |  1741K|    21 |
|   1 |  VIEW                | V1          | 59428 |  1741K|    21 |
|   2 |   UNION-ALL          |             |       |       |       |
|*  3 |    TABLE ACCESS FULL | T1          | 59424 |   754K|    19 |
|*  4 |    TABLE ACCESS FULL | T2          |     4 |   120 |     2 |
--------------------------------------------------------------------

根据优化建议,要求T1表使用C2列上的索引IDX$T1$C2会性能更好。

当然,对表和字段进行比较细的统计分析后,可能可以达到效果,但是本次介绍是的使用hint。

经过测试以下的两种SQL都不能达到预期效果:

select /*+ index(V1,IDX$T1$C2)*/
 *
  from V1
  where V1.c2>'171';
select /*+ index(T1,IDX$T1$C2)*/
 *
  from V1
  where V1.c2>'171';
正确的写法如下
select /*+ index(V1.T1,IDX$T1$C2)*/
 *
  from V1
  where V1.c2>'171'
最后的执行计划如下:
PLAN_TABLE_OUTPUT
--------------------------------------------------------------------------------
-----------------------------------------------------------------------------
| Id  | Operation                     |  Name       | Rows  | Bytes | Cost  |
-----------------------------------------------------------------------------
|   0 | SELECT STATEMENT              |             | 59428 |  1741K|   738 |
|   1 |  VIEW                         | V1          | 59428 |  1741K|   738 |
|   2 |   UNION-ALL                   |             |       |       |       |
|   3 |    TABLE ACCESS BY INDEX ROWID| T1          | 59424 |   754K|   736 |
|*  4 |     INDEX RANGE SCAN          | IDX$T1$C2   | 59424 |       |    24 |
|*  5 |    TABLE ACCESS FULL          | T2          |     4 |   120 |     2 |
-----------------------------------------------------------------------------

其实子查询中的hint与视图的一样,如下例:

select /*+ index(a.T1,IDX$T1$C2)*/
*
from (select * from T1
union all
        select * from T2) a
 where c2 > '171'

经过测试和整理,hint在引用对象时是可以嵌套引用的,如例子中的V1.T1表示V1对象中的T1对象。

注释:

如果对象有别名,则只能使用别名,如果对象里有相同的别名则只能对第一个对象使用hint。

select /*+ index(a.b,IDX$T1$C2)*/
 *
from (select * from T2 b
union all
select * from T1 b) a
 where c2 > '171'

大家可以发现上面的SQL里的hint就没有效果,这里的a.b其实是指T2表,另外hint在引用对象时是不能加模式名的,加了反而会使hint无效。

上一篇:教你快速掌握一些异常精妙的"SQL"语句 人气:596
下一篇:SQL Server数据库:虚拟化 VS 多实例 人气:725
浏览全部SQL查询的内容 Dreamweaver插件下载 常用网页广告代码全集
  最新网站源码 最新软件下载
2008-7-25 WikyBlog v1.7.0.1 多国语言版
2008-7-25 乐彼网上开店系统(56770 Eshop)
2008-7-25 赛特网站管理系统sitecms v3.6.0
2008-7-25 Modoer多功能点评系统 v1.0.1 Bu
2008-7-25 Shangducms Teamsuit! v1.1.0 开
2008-7-25 幻影动漫网视频系统(Ppdong) v1.
2008-7-25 acteecompany企业网站建设系统 v
2008-7-25 恒浪整合管理系统 ims v4.1 ACCE
2008-7-25 艺术图库系统 v1.0 beta
2008-7-19 UltraEdit 简体中文增强版 14.10
2008-7-19 CentOS 5.2 i386 LiveCD
2008-7-19 Snapture多功能相机 v1.4
2008-7-19 iAcces中文输入法 v1.0Build016
2008-7-19 Cookbook烹饪秘籍 v2.5
2008-7-19 苹果专用DVD转换工具 v1.1.59汉化
2008-7-19 Modem修复软件ZiPhone修改版04.0
2008-7-19 AgileMessenger即时通讯工具美化
2008-7-19 Sketches画图软件 v0.7b6破解版


  发表评论
姓 名: 验证码:
内 容:
[ 汉字翻译拼音 ] [ 广告代码 ] [ 符号对照表 ] [ 进制转换 ] [ 经典小工具 ] [ 个税计算 ] [ 汉字简繁转换 ] [ 普通单位换算 ] [ 公制单位换算 ]
[ 生辰老黄历 ] [ 国内电话区号 ] [ 国家代码与域名缩写 ] [ 文字加密解密 ] [ 健康查询 ] [ 万年历 ] [ 手机号码查询 ] [ ip搜索 ] [ Google PR查询 ]
业务联系 | 广告刊登 | 频道合作 | 投稿荐稿 | 联系方式 | 加入收藏 | RSS订阅
Copyright © 2000-2008 www.knowsky.com All rights reserved | 网络实名:动态网站制作指南 | 沪ICP备05001343号