国产片侵犯亲女视频播放_亚洲精品二区_在线免费国产视频_欧美精品一区二区三区在线_少妇久久久_在线观看av不卡

服務(wù)器之家:專注于服務(wù)器技術(shù)及軟件下載分享
分類導(dǎo)航

Mysql|Sql Server|Oracle|Redis|MongoDB|PostgreSQL|Sqlite|DB2|mariadb|Access|數(shù)據(jù)庫(kù)技術(shù)|

服務(wù)器之家 - 數(shù)據(jù)庫(kù) - Sql Server - SQL Server 索引結(jié)構(gòu)及其使用(二) 改善SQL語(yǔ)句

SQL Server 索引結(jié)構(gòu)及其使用(二) 改善SQL語(yǔ)句

2019-11-05 14:53mssql教程網(wǎng) Sql Server

很多人不知道SQL語(yǔ)句在SQL SERVER中是如何執(zhí)行的,他們擔(dān)心自己所寫的SQL語(yǔ)句會(huì)被SQL SERVER誤解。

比如: 
select * from table1 where name=''zhangsan'' and tID > 10000 
和執(zhí)行: 
select * from table1 where tID > 10000 and name=''zhangsan''    
一些人不知道以上兩條語(yǔ)句的執(zhí)行效率是否一樣,因?yàn)槿绻?jiǎn)單的從語(yǔ)句先后上看,這兩個(gè)語(yǔ)句的確是不一樣,如果tID是一個(gè)聚合索引,那么后一句僅僅從表的10000條以后的記錄中查找就行了;而前一句則要先從全表中查找看有幾個(gè)name=''zhangsan''的,而后再根據(jù)限制條件條件tID>10000來提出查詢結(jié)果。 

  事實(shí)上,這樣的擔(dān)心是不必要的。SQL SERVER中有一個(gè)“查詢分析優(yōu)化器”,它可以計(jì)算出where子句中的搜索條件并確定哪個(gè)索引能縮小表掃描的搜索空間,也就是說,它能實(shí)現(xiàn)自動(dòng)優(yōu)化。 

  雖然查詢優(yōu)化器可以根據(jù)where子句自動(dòng)的進(jìn)行查詢優(yōu)化,但大家仍然有必要了解一下“查詢優(yōu)化器”的工作原理,如非這樣,有時(shí)查詢優(yōu)化器就會(huì)不按照您的本意進(jìn)行快速查詢。 

  在查詢分析階段,查詢優(yōu)化器查看查詢的每個(gè)階段并決定限制需要掃描的數(shù)據(jù)量是否有用。如果一個(gè)階段可以被用作一個(gè)掃描參數(shù)(SARG),那么就稱之為可優(yōu)化的,并且可以利用索引快速獲得所需數(shù)據(jù)。 

  SARG的定義:用于限制搜索的一個(gè)操作,因?yàn)樗ǔJ侵敢粋€(gè)特定的匹配,一個(gè)值得范圍內(nèi)的匹配或者兩個(gè)以上條件的AND連接。形式如下: 
列名 操作符 <常數(shù) 或 變量> 

或 

<常數(shù) 或 變量> 操作符列名 
列名可以出現(xiàn)在操作符的一邊,而常數(shù)或變量出現(xiàn)在操作符的另一邊。如: 
Name='張三' 

價(jià)格>5000 

5000<價(jià)格 

Name='張三' and 價(jià)格>5000 
  如果一個(gè)表達(dá)式不能滿足SARG的形式,那它就無法限制搜索的范圍了,也就是SQL SERVER必須對(duì)每一行都判斷它是否滿足WHERE子句中的所有條件。所以一個(gè)索引對(duì)于不滿足SARG形式的表達(dá)式來說是無用的。 

  介紹完SARG后,我們來總結(jié)一下使用SARG以及在實(shí)踐中遇到的和某些資料上結(jié)論不同的經(jīng)驗(yàn): 

1、Like語(yǔ)句是否屬于SARG取決于所使用的通配符的類型 
如:name like ‘張%' ,這就屬于SARG 

而:name like ‘%張' ,就不屬于SARG。 
原因是通配符%在字符串的開通使得索引無法使用。 

2、or 會(huì)引起全表掃描 
  Name='張三' and 價(jià)格>5000 符號(hào)SARG,而:Name='張三' or 價(jià)格>5000 則不符合SARG。使用or會(huì)引起全表掃描。 
3、非操作符、函數(shù)引起的不滿足SARG形式的語(yǔ)句 
  不滿足SARG形式的語(yǔ)句最典型的情況就是包括非操作符的語(yǔ)句,如:NOT、!=、<>、!<、!>、NOT EXISTS、NOT IN、NOT LIKE等,另外還有函數(shù)。下面就是幾個(gè)不滿足SARG形式的例子: 
ABS(價(jià)格)<5000 

Name like ‘%三' 

有些表達(dá)式,如: 

WHERE 價(jià)格*2>5000 

SQL SERVER也會(huì)認(rèn)為是SARG,SQL SERVER會(huì)將此式轉(zhuǎn)化為: 
WHERE 價(jià)格>2500/2 
但我們不推薦這樣使用,因?yàn)橛袝r(shí)SQL SERVER不能保證這種轉(zhuǎn)化與原始表達(dá)式是完全等價(jià)的。 

4、IN 的作用相當(dāng)與OR 
語(yǔ)句: 
Select * from table1 where tid in (2,3) 

和 

Select * from table1 where tid=2 or tid=3 
是一樣的,都會(huì)引起全表掃描,如果tid上有索引,其索引也會(huì)失效。

5、盡量少用NOT 

6、exists 和 in 的執(zhí)行效率是一樣的 
  很多資料上都顯示說,exists要比in的執(zhí)行效率要高,同時(shí)應(yīng)盡可能的用not exists來代替not in。但事實(shí)上,我試驗(yàn)了一下,發(fā)現(xiàn)二者無論是前面帶不帶not,二者之間的執(zhí)行效率都是一樣的。因?yàn)樯婕白硬樵儯覀冊(cè)囼?yàn)這次用SQL SERVER自帶的pubs數(shù)據(jù)庫(kù)。運(yùn)行前我們可以把SQL SERVER的statistics I/O狀態(tài)打開: 
(1)select title,price from titles where title_id in (select title_id from sales where qty>30) 
該句的執(zhí)行結(jié)果為: 
表 ''sales''。掃描計(jì)數(shù) 18,邏輯讀 56 次,物理讀 0 次,預(yù)讀 0 次。 
表 ''titles''。掃描計(jì)數(shù) 1,邏輯讀 2 次,物理讀 0 次,預(yù)讀 0 次。 

(2)select title,price from titles 
where exists (select * from sales 
where sales.title_id=titles.title_id and qty>30) 
第二句的執(zhí)行結(jié)果為: 
表 ''sales''。掃描計(jì)數(shù) 18,邏輯讀 56 次,物理讀 0 次,預(yù)讀 0 次。 
表 ''titles''。掃描計(jì)數(shù) 1,邏輯讀 2 次,物理讀 0 次,預(yù)讀 0 次。 

我們從此可以看到用exists和用in的執(zhí)行效率是一樣的。 

7、用函數(shù)charindex()和前面加通配符%的LIKE執(zhí)行效率一樣 
  前面,我們談到,如果在LIKE前面加上通配符%,那么將會(huì)引起全表掃描,所以其執(zhí)行效率是低下的。但有的資料介紹說,用函數(shù)charindex()來代替LIKE速度會(huì)有大的提升,經(jīng)我試驗(yàn),發(fā)現(xiàn)這種說明也是錯(cuò)誤的: 
select gid,title,fariqi,reader from tgongwen 
where charindex(''刑偵支隊(duì)'',reader)>0 and fariqi>''2004-5-5'' 
用時(shí):7秒,另外:掃描計(jì)數(shù) 4,邏輯讀 7155 次,物理讀 0 次,預(yù)讀 0 次。 

select gid,title,fariqi,reader from tgongwen 
where reader like ''%'' + ''刑偵支隊(duì)'' + ''%'' and fariqi>''2004-5-5'' 
用時(shí):7秒,另外:掃描計(jì)數(shù) 4,邏輯讀 7155 次,物理讀 0 次,預(yù)讀 0 次。 

8、union并不絕對(duì)比or的執(zhí)行效率高 
  我們前面已經(jīng)談到了在where子句中使用or會(huì)引起全表掃描,一般的,我所見過的資料都是推薦這里用union來代替or。事實(shí)證明,這種說法對(duì)于大部分都是適用的。 
select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
where fariqi=''2004-9-16'' or gid>9990000 
用時(shí):68秒。掃描計(jì)數(shù) 1,邏輯讀 404008 次,物理讀 283 次,預(yù)讀 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 
用時(shí):9秒。掃描計(jì)數(shù) 8,邏輯讀 67489 次,物理讀 216 次,預(yù)讀 7499 次。 

看來,用union在通常情況下比用or的效率要高的多。 

  但經(jīng)過試驗(yàn),筆者發(fā)現(xiàn)如果or兩邊的查詢列是一樣的話,那么用union則反倒和用or的執(zhí)行速度差很多,雖然這里union掃描的是索引,而or掃描的是全表。 
select gid,fariqi,neibuyonghu,reader,title from Tgongwen 
where fariqi=''2004-9-16'' or fariqi=''2004-2-5'' 
用時(shí):6423毫秒。掃描計(jì)數(shù) 2,邏輯讀 14726 次,物理讀 1 次,預(yù)讀 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'' 
用時(shí):11640毫秒。掃描計(jì)數(shù) 8,邏輯讀 14806 次,物理讀 108 次,預(yù)讀 1144 次。 

9、字段提取要按照“需多少、提多少”的原則,避免“select *” 
我們來做一個(gè)試驗(yàn): 
select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc 
用時(shí):4673毫秒 

select top 10000 gid,fariqi,title from tgongwen order by gid desc 
用時(shí):1376毫秒 

select top 10000 gid,fariqi from tgongwen order by gid desc 
用時(shí):80毫秒 

  由此看來,我們每少提取一個(gè)字段,數(shù)據(jù)的提取速度就會(huì)有相應(yīng)的提升。提升的速度還要看您舍棄的字段的大小來判斷。 

10、count(*)不比count(字段)慢 
  某些資料上說:用*會(huì)統(tǒng)計(jì)所有列,顯然要比一個(gè)世界的列名效率低。這種說法其實(shí)是沒有根據(jù)的。我們來看: 
select count(*) from Tgongwen 
用時(shí):1500毫秒 

select count(gid) from Tgongwen 
用時(shí):1483毫秒 

select count(fariqi) from Tgongwen 
用時(shí):3140毫秒 

select count(title) from Tgongwen 
用時(shí):52050毫秒 

  從以上可以看出,如果用count(*)和用count(主鍵)的速度是相當(dāng)?shù)模鴆ount(*)卻比其他任何除主鍵以外的字段匯總速度要快,而且字段越長(zhǎng),匯總的速度就越慢。我想,如果用count(*), SQL SERVER可能會(huì)自動(dòng)查找最小字段來匯總的。當(dāng)然,如果您直接寫count(主鍵)將會(huì)來的更直接些。 

11、order by按聚集索引列排序效率最高 
我們來看:(gid是主鍵,fariqi是聚合索引列): 
select top 10000 gid,fariqi,reader,title from tgongwen 
用時(shí):196 毫秒。 掃描計(jì)數(shù) 1,邏輯讀 289 次,物理讀 1 次,預(yù)讀 1527 次。 

select top 10000 gid,fariqi,reader,title from tgongwen order by gid asc 
用時(shí):4720毫秒。 掃描計(jì)數(shù) 1,邏輯讀 41956 次,物理讀 0 次,預(yù)讀 1287 次。 

select top 10000 gid,fariqi,reader,title from tgongwen order by gid desc 
用時(shí):4736毫秒。 掃描計(jì)數(shù) 1,邏輯讀 55350 次,物理讀 10 次,預(yù)讀 775 次。 
用時(shí):173毫秒。 

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi asc 
掃描計(jì)數(shù) 1,邏輯讀 290 次,物理讀 0 次,預(yù)讀 0 次。 

select top 10000 gid,fariqi,reader,title from tgongwen order by fariqi desc 
用時(shí):156毫秒。 掃描計(jì)數(shù) 1,邏輯讀 289 次,物理讀 0 次,預(yù)讀 0 次。 

  從以上我們可以看出,不排序的速度以及邏輯讀次數(shù)都是和“order by 聚集索引列” 的速度是相當(dāng)?shù)模@些都比“order by 非聚集索引列”的查詢速度是快得多的。 
  同時(shí),按照某個(gè)字段進(jìn)行排序的時(shí)候,無論是正序還是倒序,速度是基本相當(dāng)?shù)摹?nbsp;

12、高效的TOP 
  事實(shí)上,在查詢和提取超大容量的數(shù)據(jù)集時(shí),影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間的最大因素不是數(shù)據(jù)查找,而是物理的I/0操作。如: 
select top 10 * from ( 
select top 10000 gid,fariqi,title from tgongwen 
where neibuyonghu=''辦公室'' 
order by gid desc) as a 
order by gid asc 
  這條語(yǔ)句,從理論上講,整條語(yǔ)句的執(zhí)行時(shí)間應(yīng)該比子句的執(zhí)行時(shí)間長(zhǎng),但事實(shí)相反。因?yàn)椋泳鋱?zhí)行后返回的是10000條記錄,而整條語(yǔ)句僅返回10條語(yǔ)句,所以影響數(shù)據(jù)庫(kù)響應(yīng)時(shí)間最大的因素是物理I/O操作。而限制物理I/O操作此處的最有效方法之一就是使用TOP關(guān)鍵詞了。TOP關(guān)鍵詞是SQL SERVER中經(jīng)過系統(tǒng)優(yōu)化過的一個(gè)用來提取前幾條或前幾個(gè)百分比數(shù)據(jù)的詞。經(jīng)筆者在實(shí)踐中的應(yīng)用,發(fā)現(xiàn)TOP確實(shí)很好用,效率也很高。但這個(gè)詞在另外一個(gè)大型數(shù)據(jù)庫(kù)ORACLE中卻沒有,這不能說不是一個(gè)遺憾,雖然在ORACLE中可以用其他方法(如:rownumber)來解決。在以后的關(guān)于“實(shí)現(xiàn)千萬(wàn)級(jí)數(shù)據(jù)的分頁(yè)顯示存儲(chǔ)過程”的討論中,我們就將用到TOP這個(gè)關(guān)鍵詞。 

  到此為止,我們上面討論了如何實(shí)現(xiàn)從大容量的數(shù)據(jù)庫(kù)中快速地查詢出您所需要的數(shù)據(jù)方法。當(dāng)然,我們介紹的這些方法都是“軟”方法,在實(shí)踐中,我們還要考慮各種“硬”因素,如:網(wǎng)絡(luò)性能、服務(wù)器的性能、操作系統(tǒng)的性能,甚至網(wǎng)卡、交換機(jī)等。

延伸 · 閱讀

精彩推薦
Weibo Article 1 Weibo Article 2 Weibo Article 3 Weibo Article 4 Weibo Article 5 Weibo Article 6 Weibo Article 7 Weibo Article 8 Weibo Article 9 Weibo Article 10 Weibo Article 11 Weibo Article 12 Weibo Article 13 Weibo Article 14 Weibo Article 15 Weibo Article 16 Weibo Article 17 Weibo Article 18 Weibo Article 19 Weibo Article 20 Weibo Article 21 Weibo Article 22 Weibo Article 23 Weibo Article 24 Weibo Article 25 Weibo Article 26 Weibo Article 27 Weibo Article 28 Weibo Article 29 Weibo Article 30 Weibo Article 31 Weibo Article 32 Weibo Article 33 Weibo Article 34 Weibo Article 35 Weibo Article 36 Weibo Article 37 Weibo Article 38 Weibo Article 39 Weibo Article 40
主站蜘蛛池模板: 一区二区三区精品视频 | 亚洲国产精品美女 | 成人av一区二区三区 | 中文字幕在线永久在线视频 | 91看片淫黄大片一级在线观看 | 日韩欧美成人一区二区三区 | 欧美精三区欧美精三区 | 国产亚洲综合一区二区 | 一区二区三区日韩 | 日韩欧美手机在线 | 国产高清精品在线 | 色国产精品 | 亚洲国产高清在线 | 亚洲电影在线看 | 欧美亚洲国产日韩 | 日韩欧美一二三区 | 国产精品免费视频一区 | 韩日中文字幕 | 日韩国产精品一区 | 中文字幕一区二区在线观看 | 亚洲精品久久久一区二区三区 | 久久国产一区二区 | 一级黄色片视频 | 成人精品一区二区 | 国产中文字幕一区 | 欧美一区二区在线视频 | 日韩国伦理久久一区 | 成人午夜视频在线 | 伊人久久综合 | 一级视频免费观看 | 亚洲乱码国产乱码精品精的特点 | 一区二区三区无码高清视频 | 精品久久久久一区二区国产 | 91久久 | 狠狠爱综合 | 久久久国产一区二区三区 | 欧美日韩国产一区二区三区 | 免费观看国产精品 | 国产成人精品免费视频大全最热 | 激情欧美一区二区三区中文字幕 | 亚洲精品一区二区三区在线 |