索引的作用,大数据查询优化

)深入浅出通晓索引结构

1、**Like语句是不是属于**SA本田UR-VG取决于所利用的通配符的种类
如:name like ‘张%’ ,那就属于SACR-VG
而:name like ‘%张’ ,就不属于SA凯雷德G。
缘由是通配符%在字符串的开明使得索引不可能运用。
2、**or 会引起全表扫描
  Name=’张三’ and 价格>5000 符号SA普拉多G,而:Name=’张三’ or 价格>伍仟 则不符合SA汉兰达G。使用or会引起全表扫描。
3、非操作符、函数引起的不满足**SA揽胜极光G方式的口舌
  不满意SA宝马X5G方式的言辞最优异的场合就是总结非操作符的说话,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT
LIKE等,别的还应该有函数。上边正是多少个不满意SA酷路泽G格局的例证:
ABS(价格)<5000
Name like ‘%三’
稍微表明式,如:
WHERE 价格*2>5000
SQL SERubiconVEXC60也会感觉是SA帕杰罗G,SQL
SETucsonVERubicon会将此式转化为:
WHERE 价格>2500/2
但大家不推荐这样使用,因为一时候SQL
SE冠道VE牧马人不能够担保这种转化与原本表明式是完全等价的。
4、**IN 的功效拾贰分与**OR
语句:
Select * from table1 where tid in (2,3)

Select * from table1 where tid=2 or tid=3
是一致的,都会引起全表扫描,假设tid上有索引,其索引也会失效。
5、尽量少用**NOT 6、exists 和 in 的实施效能是千篇一律的
  多数资料上都显示说,exists要比in的施行功效要高,同期应尽也许的用not
exists来代替not
in。但实则,笔者试验了须臾间,发掘互相无论是后边带不带not,二者之间的推行功效都以平等的。因为涉及子查询,大家试验本次用SQL SE奔驰M级VE宝马X3自带的pubs数据库。运行前大家得以把SQL
SE帕杰罗VESportage的statistics I/O状态张开:
(1)select title,price from
titles where title_id in (select title_id from sales where
qty>30)
该句的举行理并了结果为:
表 ”sales”。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。
表 ”titles”。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
(2)select title,price from
titles 
  where exists (select * from sales 
  where sales.title_id=titles.title_id and
qty>30)
其次句的实践结果为:
表 ”sales”。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。
表 ”titles”。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。
作者们以往能够看来用exists和用in的实践功用是千篇一律的。
7、用函数charindex()和后边加通配符%的**LIKE实行成效一样
  前边,大家聊起,假如在LIKE前边加上通配符%,那么将会挑起全表扫描,所以其进行作用是放下的。但部分资料介绍说,用函数charindex()来代表LIKE速度会有大的升级,经本人试验,发掘这种表明也是一无所长的:
select gid,title,fariqi,reader from tgongwen 
  where charindex(”刑事考察支队”,reader)>0 and fariqi>”2004-5-5”
用时:7秒,此外:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。
select gid,title,fariqi,reader from tgongwen 
  where reader like ”%” + ”刑事考查支队” + ”%” and fariqi>”二〇〇四-5-5”
用时:7秒,其余:扫描计数 4,逻辑读 7155 次,物理读 0 次,预读 0 次。
8、**union并不绝比较**or的试行成效高
  大家日前早已聊起了在where子句中使用or会引起全表扫描,一般的,小编所见过的资料都以推荐这里用union来代表or。事实表明,这种说法对于大大多都以适用的。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
  where fariqi=”2004-9-16” or gid>9990000
用时:68秒。扫描计数 1,逻辑读 404008 次,物理读 283 次,预读 392163 次。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi=”2004-9-16” 
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
gid>9990000
用时:9秒。扫描计数 8,逻辑读 67489 次,物理读 216 次,预读 7499 次。
总的看,用union在经常状态下比用or的频率要高的多。
  但透过考试,小编开掘只要or两边的查询列是同样的话,那么用union则相反对和平用or的实行进度差好些个,就算这里union扫描的是索引,而or扫描的是全表。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
  where fariqi=”2004-9-16” or
fariqi=”2004-2-5”
用时:6423飞秒。扫描计数 2,逻辑读 14726 次,物理读 1 次,预读 7176 次。
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi=”2004-9-16” 
union
select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi=”2004-2-5”
用时:11640皮秒。扫描计数 8,逻辑读 14806 次,物理读 108 次,预读 1144 次。
9、字段提取要根据**“需多少、提多少”的原则,避免“select *”
  大家来做一个检查实验:
select top 10000 gid,fariqi,reader,title from tgongwen order by gid
desc
用时:4673毫秒
select top 10000 gid,fariqi,title from tgongwen order by gid desc
用时:1376毫秒
select top 10000 gid,fariqi from tgongwen order by gid desc
用时:80毫秒
  因而看来,大家每少提取二个字段,数据的领取速度就能够有料理的进级。升高的快慢还要看你放任的字段的大大小小来决断。
10、count(*)不比count(字段**)慢
  有些质地上说:用*会计算全体列,明显要比八个社会风气的列名功用低。这种说法实在是一贯不依照的。大家来看:
select count(*) from Tgongwen
用时:1500毫秒
select count(gid) from Tgongwen 
用时:1483毫秒
select count(fariqi) from Tgongwen
用时:3140毫秒
select count(title) from Tgongwen
用时:52050毫秒
  从上述方可阅览,如若用count(*)和用count(主键)的速度是一定的,而count(*)却比其余任何除主键以外的字段汇总速度要快,而且字段越长,汇总的进程就越慢。笔者想,要是用count(*), SQL
SE途锐VEWrangler恐怕会自动搜索最小字段来聚焦的。当然,假让你一贯写count(主键)将会来的更直白些。
11、**order by按集中索引列排序成效最高**
  大家来看:(gid是主键,fariqi是聚合索引列):
select top 10000 gid,fariqi,reader,title from tgongwen
用时:196 微秒。 扫描计数 1,逻辑读 289 次,物理读 1 次,预读 1527 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by gid
asc
用时:4720阿秒。 扫描计数 1,逻辑读 4壹玖伍陆 次,物理读 0 次,预读 1287 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by gid
desc
澳门新萄京 ,用时:4736微秒。 扫描计数 1,逻辑读 55350 次,物理读 10 次,预读 775 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi
asc
用时:173飞秒。 扫描计数 1,逻辑读 290 次,物理读 0 次,预读 0 次。
select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi
desc
用时:156飞秒。 扫描计数 1,逻辑读 289 次,物理读 0 次,预读 0 次。
  从以上大家能够阅览,不排序的快慢以及逻辑读次数都以和“order by 聚焦索引列” 的进程是极度的,但那几个都比“order
by 非聚集索引列”的询问速度是快得多的。

实际,您能够把索引驾驭为一种奇特的目录。微软的SQL
SE汉兰达VELacrosse提供了三种索引:聚焦索引(clustered
index,也称聚类索引、簇集索引)和非集中索引(nonclustered
index,也称非聚类索引、非簇集索引)。下边,大家举例来证可瑞康(Karicare)下集中索引和非集中索引的区分:

实在,我们的国语字典的正文自个儿正是壹个聚集索引。譬喻,我们要查“安”字,就能很当然地查看字典的前几页,因为“安”的拼音是“an”,而遵照拼音排序汉字的字典是以英文字母“a”发轫并以“z”结尾的,那么“安”字就自然地排在字典的前部。即便你翻完了有着以“a”开头的有个别还是找不到那么些字,那么就印证你的字典中并未有那一个字;同样的,假如查“张”字,那你也会将你的字典翻到结尾有的,因为“张”的拼音是“zhang”。也正是说,字典的正文部分自个儿就是三个索引,您没有供给再去查其余目录来找到你必要找的剧情。我们把这种正文内容作者正是一种依据一定规则排列的目录称为“聚焦索引”。

要是你认知有些字,您能够快速地从电动中查到那一个字。但你也恐怕会遇上你不认识的字,不晓得它的失声,那时候,您就无法依照刚才的主意找到你要查的字,而急需去依据“偏旁部首”查到您要找的字,然后依照那几个字后的页码直接翻到某页来找到您要找的字。但您结合“部首目录”和“检字表”而查到的字的排序并不是确实的正文的排序方法,举个例子您查“张”字,我们能够见到在查部首事后的检字表中“张”的页码是672页,检字表中“张”的上边是“驰”字,但页码却是63页,“张”的底下是“弩”字,页面是390页。很明显,那几个字并不是确实的个别放在“张”字的上下方,以后你看来的接连的“驰、张、弩”三字实在正是他们在非聚焦索引中的排序,是字典正文中的字在非集中索引中的映射。大家能够经过这种方法来找到您所急需的字,但它须要四个进程,先找到目录中的结果,然后再翻到您所急需的页码。大家把这种目录纯粹是目录,正文纯粹是本文的排序方式叫做“非集中索引”。

透过以上例子,大家能够知道到怎么是“聚焦索引”和“非聚焦索引”。进一步引申一下,大家能够很轻松的接头:各样表只好有三个集中索引,因为目录只可以根据一种艺术进行排序。

二、何时使用聚焦索引或非集中索引

上面包车型地铁表总括了哪天使用聚集索引或非聚集索引(很关键):

动作描述

使用聚集索引

使用非聚集索引

列经常被分组排序

返回某范围内的数据

不应

一个或极少不同值

不应

不应

小数目的不同值

不应

大数目的不同值

不应

频繁更新的列

不应

外键列

主键列

频繁修改索引列

不应

实际上,大家能够通过前面聚集索引和非聚焦索引的概念的例子来通晓上表。如:重返某范围内的数目一项。举个例子您的某部表有一个时间列,恰好您把聚合索引建构在了该列,那时你查询二〇〇四年5月1日至二零零零年八月1日里面包车型大巴全部数据时,那么些速度就将是神速的,因为你的那本字典正文是按日期举行排序的,聚类索引只供给找到要物色的有所数据中的开头和最终数据就可以;而不像非集中索引,必须先查到目录中查到每一种数据对应的页码,然后再根据页码查到具体内容。

三、结合实际,谈索引使用的误区

辩解的指标是行使。纵然我们刚刚列出了曾几何时应选择聚集索引或非集中索引,但在施行中以上规则却很轻易被忽视或不可能依照实情张开汇总分析。上面大家将基于在施行中蒙受的其实难题来谈一下目录使用的误区,以便于我们通晓索引创建的格局。

1、主键正是集中索引

这种主见作者认为是Infiniti错误的,是对集中索引的一种浪费。就算SQL
SE路虎极光VE宝马7系私下认可是在主键上树立集中索引的。

一般,大家会在各类表中都成立贰个ID列,以界别每条数据,并且那一个ID列是自行叠合的,步长一般为1。大家的那几个办公自动化的实例中的列Gid正是那样。此时,要是我们将这几个列设为主键,SQL
SE福睿斯VE奥德赛会将此列默以为聚焦索引。那样做有裨益,便是能够让你的数额在数据库中服从ID进行物理排序,但作者感到那样做意义一点都不大。

一清二楚,聚集索引的优势是很明显的,而各类表中只好有多少个聚焦索引的规则,那使得聚集索引变得愈加难得。

从我们前边谈起的集中索引的定义大家能够观看,使用聚焦索引的最大好处正是能够基于查询要求,赶快减少查询范围,幸免全表扫描。在实际应用中,因为ID号是自动生成的,大家并不知道每条记下的ID号,所以大家很难在实施中用ID号来进行询问。这就使让ID号这一个主键作为聚焦索引成为一种财富浪费。其次,让种种ID号都不可同日而语的字段作为集中索引也不相符“大数量的不等值情形下不应建设构造聚合索引”规则;当然,这种场所只是指向用户时时修改记录内容,特别是索引项的时候会负作用,但对此查询速度并未影响。

在办公自动化系统中,无论是系统首页展现的急需用户签收的公文、会议或然用户张开文件查询等其余情状下实行数量查询都离不开字段的是“日期”还会有用户本身的“用户名”。

普普通通,办公自动化的首页会展现种种用户未有签收的文件或会议。固然大家的where语句能够独自限制当前用户并未签收的状态,但只要你的系统已确立了十分短日子,并且数据量比非常大,那么,每一趟每一种用户展开始页的时候都进展一遍全表扫描,那样做意义是纤维的,绝大好些个的用户1个月前的文本都早已浏览过了,那样做只好徒增数据库的支出而已。事实上,我们全然能够让用户张开系统首页时,数据库仅仅查询那个用户近四个月来未读书的文书,通过“日期”那些字段来限制表扫描,进步查询速度。假使您的办公自动化系统现已创设的2年,那么你的首页突显速度理论中校是原来速度8倍,乃至更加快。

在此处之所以提到“理论上”三字,是因为只要您的聚焦索引照旧盲目地建在ID这么些主键上时,您的查询速度是从未有过那样高的,尽管你在“日期”这些字段上创立的目录(非聚合索引)。上面我们就来看一下在1000万条数据量的情事下各类查询的快慢显示(7个月内的多少为25万条):

(1)仅在主键上建设构造集中索引,并且不分开时间段:

1.Select gid,fariqi,neibuyonghu,title from tgongwen

用时:128470毫秒(即:128秒)

(2)在主键上创立集中索引,在fariq上创立非集中索引:

1.select gid,fariqi,neibuyonghu,title from Tgongwen

2.where fariqi> dateadd(day,-90,getdate())

用时:53763毫秒(54秒)

(3)将聚合索引创立在日期列(fariqi)上:

1.select gid,fariqi,neibuyonghu,title from Tgongwen

2.where fariqi> dateadd(day,-90,getdate())

用时:2423毫秒(2秒)

虽说每条语句提抽取来的都以25万条数据,各类场合的反差却是巨大的,特别是将聚焦索引创设在日期列时的差距。事实上,若是你的数据库真的有一千万体积的话,把主键组建在ID列上,就如上述的第1、2种情况,在网页上的表现正是过期,根本就无法呈现。那也是自个儿抛弃ID列作为集中索引的叁个最主要的成分。得出上述速度的法子是:在逐一select语句前加:

1.declare @d datetime

2.set @d=getdate()

并在select语句后加:

1.select [语句施行费用时间(飞秒)]=datediff(ms,@d,getdate())

2、只要建立目录就可以明了增进查询速度

其实,大家能够发掘下面的事例中,第2、3条语句完全同样,且建设构造目录的字段也同等;不一样的仅是前者在fariqi字段上确立的是是非非聚合索引,后者在此字段上确立的是聚合索引,但查询速度却有着天悬地隔。所以,并非是在其余字段上粗略地创造目录就能够提高查询速度。

从建表的说话中,大家能够看出那些具备一千万数据的表中fariqi字段有5003个例外记录。在此字段上营造聚合索引是再适合可是了。在现实中,大家每日都会发多少个公文,那多少个公文的发文日期就一律,那完全符合建构集中索引需求的:“既无法绝大好多都一样,又不能够唯有极少数一样”的条条框框。因而看来,大家树立“适当”的聚合索引对于大家加强查询速度是极其关键的。

3、把具备须求巩固查询速度的字段都增加集中索引,以拉长查询速度

上边已经谈到:在拓展数量查询时都离不开字段的是“日期”还会有用户自己的“用户名”。既然这五个字段都以那样的主要,大家得以把她们统一齐来,建设构造二个复合索引(compound
index)。

数不胜数人觉着一旦把任何字段加进聚焦索引,就能够进步查询速度,也许有人感到迷惑:如若把复合的集中索引字段分别查询,那么查询速度会减速吗?带着那个难点,大家来看一下之下的查询速度(结果集都以25万条数据):(日期列fariqi首先排在复合聚集索引的早先列,用户名neibuyonghu排在后列):

1.(1)select gid,fariqi,neibuyonghu,title from Tgongwen where
fariqi>”2004-5-5”

询问速度:2513微秒

1.(2)select gid,fariqi,neibuyonghu,title from Tgongwen where
fariqi>”2004-5-5” and neibuyonghu=”办公室”

询问速度:2516微秒

1.(3)select gid,fariqi,neibuyonghu,title from Tgongwen where
neibuyonghu=”办公室”

询问速度:60280阿秒

从上述试验中,大家能够看出假诺仅用聚集索引的起头列作为查询条件和同不常候用到复合集中索引的总体列的查询速度是大致同一的,以至比用上海市总体的复合索引列还要略快(在询问结果集数目一样的状态下);而一旦仅用复合聚焦索引的非起首列作为查询条件的话,那几个目录是不起其余效用的。当然,语句1、2的询问速度同样是因为查询的条文数一致,若是复合索引的全部列都用上,而且查询结果少的话,那样就能造成“索引覆盖”,因此品质能够达到规定的标准最优。同有时间,请牢记:无论你是还是不是平常使用聚合索引的其他列,但其前导列一定借使采纳最频仍的列。

四、其余书上未有的目录使用经验总计

1、用聚合索引比用不是聚合索引的主键速度快

上面是实例语句:(都是领取25万条数据)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi=”2004-9-16”

利用时间:3326纳秒

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
gid<=250000

运用时间:4470纳秒

此间,用聚合索引比用不是聚合索引的主键速度快了近三分之二。

2、用聚合索引比用一般的主键作order by时进程快,非常是在小数据量情状下

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by
fariqi

用时:12936

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen order by gid

用时:18843

此地,用聚合索引比用一般的主键作order
by时,速度快了3/10。事实上,倘若数据量一点都不大的话,用聚焦索引作为排种类要比使用非聚焦索引速度快得明显的多;而数据量如若十分大的话,如10万之上,则二者的快慢差异不醒目。

3、使用聚合索引内的时光段,寻找时间会按数量占全体数据表的比例成比例减弱,而无论是聚合索引使用了不怎么个:

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi>”2004-1-1”

用时:6343毫秒(提取100万条)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi>”2004-6-6”

用时:3170毫秒(提取50万条)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi=”2004-9-16”

用时:3326纳秒(和上句的结果一模一样。假诺收集的多少同样,那么用当先号和优秀号是一致的)

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi>”2004-1-1” and fariqi<”2004-6-6”

用时:3280毫秒

4、日期列不会因为有弹指间的输入而减慢查询速度

上面包车型地铁事例中,共有100万条数据,二零零四年五月1日之后的数量有50万条,但只有七个例外的日期,日期正确到日;从前有数量50万条,有陆仟个不等的日期,日期正确到秒。

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi>”2004-1-1” order by fariqi

用时:6390毫秒

1.select gid,fariqi,neibuyonghu,reader,title from Tgongwen where
fariqi<”2004-1-1” order by fariqi

用时:6453毫秒

五、别的注意事项

“水可载舟,亦可覆舟”,索引也一律。索引有助于提最高人民公诉机关索品质,但过多或不当的目录也会导致系统低效。因为用户在表中每加进贰个索引,数据库将要做更加多的行事。过多的目录乃至会造成索引碎片。

据此说,大家要营造一个“适当”的目录种类,非常是对聚合索引的创制,更应革新,以使您的数据库能获取高品质的发挥。

自然,在奉行中,作为一个效忠的数据库管理员,您还要多测试一些方案,找寻哪一类方案功效最高、最为有效。

(二)改善SQL语句

广大人不通晓SQL语句在SQL
SE昂CoraVECR-V中是哪些推行的,他们忧郁本人所写的SQL语句会被SQL
SE汉兰达VELacrosse误解。比方:

1.select * from table1 where name=”zhangsan” and tID >
10000和执行select * from table1 where tID > 10000 and
name=”zhangsan”

有个别人不明白以上两条语句的试行功效是或不是同样,因为假诺轻巧的从言语先后上看,那多个语句的确是不雷同,尽管tID是三个聚合索引,那么后一句仅仅从表的一千0条现在的笔录中检索就行了;而前一句则要先从全表中搜索看有多少个name=”zhangsan”的,而后再依赖限制条件规范化tID>一千0来建议询问结果。

实际,那样的担心是不须要的。SQL
SE帕杰罗VE卡宴中有贰个“查询深入分析优化器”,它能够测算出where子句中的搜索条件并显著哪些索引能压缩表扫描的搜寻空间,也便是说,它能促成全自动优化。

就算如此查询优化器能够依照where子句自动的进展查询优化,但大家还是有至关重要掌握一下“查询优化器”的行事规律,如非那样,有的时候查询优化器就能不根据你的本心举行急速查询。

在查询剖析阶段,查询优化器查看查询的每一种阶段并决定限制须要扫描的数据量是不是有用。若是几个阶段能够被视作三个扫描参数(SA福特ExplorerG),那么就叫做可优化的,并且能够应用索引快捷得到所需数据。

SASportageG的概念:用于限制寻找的三个操作,因为它一般是指一个一定的同盟,二个值得范围内的合营只怕四个以上标准的AND连接。情势如下:

列名 操作符 <常数 或 变量>或<常数 或 变量> 操作符列名

列名能够出现在操作符的一边,而常数或变量出现在操作符的另三只。如:

Name=’张三’

价格>5000

5000<价格

Name=’张三’ and 价格>5000

纵然七个表明式不可能满意SA酷路泽G的款型,那它就无法界定寻找的限制了,也正是SQL
SE昂科威VE揽胜极光必须对每一行都认清它是还是不是知足WHERE子句中的全部标准。所以八个目录对于不满意SAXC60G方式的表明式来讲是无效的。

介绍完SAXC60G后,大家来总计一下行使SA库罗德G以及在实行中碰到的和一些材质上敲定区别的经验:

1、Like语句是不是属于SAKoleosG取决于所选拔的通配符的品类

如:name like ‘张%’ ,这就属于SA途胜G

而:name like ‘%张’ ,就不属于SA科雷傲G。

由来是通配符%在字符串的开始展览使得索引不能够选用。

2、or 会引起全表扫描

Name=’张三’ and 价格>四千 符号SA揽胜G,而:Name=’张三’ or 价格>陆仟则不适合SA奥迪Q7G。使用or会引起全表扫描。

3、非操作符、函数引起的不知足SA奥迪Q5G情势的语句

不满意SA福睿斯G情势的言语最非凡的情况正是归纳非操作符的言辞,如:NOT、!=、<>、!<、!>、NOT
EXISTS、NOT IN、NOT
LIKE等,其余还会有函数。下边就是多少个不满意SA奇骏G方式的例证:

ABS(价格)<5000

Name like ‘%三’

稍微表达式,如:

WHERE 价格*2>5000

SQL SEMuranoVEMurano也会以为是SA昂科拉G,SQL SEHighlanderVE陆风X8会将此式转化为:

WHERE 价格>2500/2

但大家不推荐那样使用,因为不时候SQL
SE奥迪Q7VE宝马7系不可能担保这种转化与原本表达式是完全等价的。

4、IN 的效应十分与OGL450

语句:

Select * from table1 where tid in (2,3)和Select * from table1 where
tid=2 or tid=3

是一致的,都会唤起全表扫描,借使tid上有索引,其索引也会失灵。

5、尽量少用NOT

6、exists 和 in 的执行功效是均等的

洋洋材质上都展现说,exists要比in的实行效用要高,同有时间应尽也许的用not
exists来顶替not
in。但实在,笔者试验了一下,开采两个无论是前面带不带not,二者之间的实践功能都以毫无二致的。因为涉及子查询,大家试验此次用SQL
SE汉兰达VE揽胜自带的pubs数据库。运维前大家能够把SQL SE奇骏VE中华V的statistics
I/O状态张开:

1.(1)select title,price from titles where title_id in (select
title_id from sales where qty>30)

该句的实行理并了结果为:

表 ”sales”。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

表 ”titles”。扫描计数 1,逻辑读 2 次,物理读 0 次,预读 0 次。

1.(2)select title,price from titles where exists (select * from
sales where sales.title_id=titles.title_id and qty>30)

其次句的试行结果为:

表 ”sales”。扫描计数 18,逻辑读 56 次,物理读 0 次,预读 0 次。

发表评论

电子邮件地址不会被公开。 必填项已用*标注