sql語句技巧
2011/11/14 17:12:15
1、應用程序中,保證在實現(xiàn)功能的基礎(chǔ)上,盡量減少對數(shù)據(jù)庫的訪問次數(shù);通過搜索參數(shù),盡量減少對表的訪問行數(shù),最小化結(jié)果集,從而減輕網(wǎng)絡(luò)負擔;能夠分開的操作盡量分開處理,提高每次的響應速度;在數(shù)據(jù)窗口使用SQL時,盡量把使用的索引放在選擇的首列;算法的結(jié)構(gòu)盡量簡單;在查詢時,不要過多地使用通配符如SELECT * FROM T1語句,要用到幾列就選擇幾列如:SELECT COL1,COL2 FROMT1;在可能的情況下盡量限制盡量結(jié)果集行數(shù)如:SELECT TOP 300COL1,COL2,COL3 FROM T1,因為某些情況下用戶是不需要那么多的數(shù)據(jù)的。不要在應用中使用數(shù)據(jù)庫游標,游標是非常有用的工具,但比使用常規(guī)的、面向集的SQL語句需要更大的開銷;按照特定順序提取數(shù)據(jù)的查找。 
2、  避免使用不兼容的數(shù)據(jù)類型。例如float和int、char和varchar、binary和varbinary是不兼容的。數(shù)據(jù)類型的不兼容可能使優(yōu)化器無法執(zhí)行一些本來可以進行的優(yōu)化操作。例如:  SELECT name FROM employee WHERE salary > 60000  在這條語句中,如salary字段是money型的,則優(yōu)化器很難對其進行優(yōu)化,因為60000是個整型數(shù)。我們應當在編程時將整型轉(zhuǎn)化成為錢幣型,而不要等到運行時轉(zhuǎn)化。 

3、  盡量避免在WHERE子句中對字段進行函數(shù)或表達式操作,這將導致引擎放棄使用索引而進行全表掃描。如:  SELECT * FROM T1 WHERE F1/2=100應改為: SELECT * FROM T1 WHERE F1=100*2SELECT * FROM RECORD WHERE SUBSTRING(CARD_NO,1,4)=’5378’應改為:SELECT * FROM RECORD WHERE CARD_NO LIKE ‘5378%’SELECT member_number, first_name, last_name  FROM members
WHERE DATEDIFF(yy,datofbirth,GETDATE()) > 21應改為:SELECT member_number, first_name, last_name  FROM members WHERE dateofbirth < DATEADD(yy,-21,GETDATE())即:任何對列的操作都將導致表掃描,它包括數(shù)據(jù)庫函數(shù)、計算表達式等等,查詢時要盡可能將操作移至等號右邊。

4、  避免使用!=或<>、IS NULL或IS NOT NULL、IN ,NOT IN等這樣的操作符,因為這會使系統(tǒng)無法使用索引,而只能直接搜索表中的數(shù)據(jù)。例如:  SELECT id FROM employee WHERE id != 'B%'  優(yōu)化器將無法通過索引來確定將要命中的行數(shù),因此需要搜索該表的所有行。
 
5、  盡量使用數(shù)字型字段,一部分開發(fā)人員和數(shù)據(jù)庫管理人員喜歡把包含數(shù)值信息的字段設(shè)計為字符型,這會降低查詢和連接的性能,并會增加存儲開銷。這是因為引擎在處理查詢和連接回逐個比較字符串中每一個字符,而對于數(shù)字型而言只需要比較一次就夠了。

6、  合理使用EXISTS,NOT EXISTS子句。如下所示:
1.SELECT SUM(T1.C1)FROM T1 WHERE( (SELECT COUNT(*)FROM T2 WHERE T2.C2=T1.C2>0)
2.SELECT SUM(T1.C1) FROM T1WHERE EXISTS(  SELECT * FROM T2 WHERE T2.C2=T1.C2)兩者產(chǎn)生相同的結(jié)果,但是后者的效率顯然要高于前者。因為后者不會產(chǎn)生大量鎖定的表掃描或是索引掃描。如果你想校驗表里是否存在某條紀錄,不要用count(*)那樣效率很低,而且浪費服務(wù)器資源。可以用EXISTS代替。如:
IF (SELECT COUNT(*) FROM table_name WHERE column_name = 'xxx')
可以寫成:
IF EXISTS (SELECT * FROM table_name WHERE column_name = 'xxx')經(jīng)常需要寫一個T_SQL語句比較一個父結(jié)果集和子結(jié)果集,從而找到是否存在在父結(jié)果集中有而在子結(jié)果集中沒有的記錄,如:
1.SELECT a.hdr_key  FROM hdr_tbl a---- tbl a 表示tbl用別名a代替WHERE NOT EXISTS (SELECT * FROM dtl_tbl b WHERE a.hdr_key = b.hdr_key)
2.SELECT a.hdr_key  FROM hdr_tbl aLEFT JOIN dtl_tbl b ON a.hdr_key = b.hdr_key  WHERE b.hdr_key IS NULL 

3.SELECT hdr_key  FROM hdr_t

下一頁
返回列表
返回首頁 主站蜘蛛池模板: 欧美怡红院免费全视频| 亚洲一级免费视频| 一本久久伊人热热精品中文| 日韩不卡手机视频在线观看| 啊灬啊别停灬用力啊老师免费视频| 免费观看黄色的网站| 国产麻豆剧传媒精品国产AV| 一级一看免费完整版毛片| 日本男人操女人| 亚洲一线产区二线产区精华| 波多野结衣教师系列5| 免费高清日本中文| 色偷偷人人澡人人爽人人模 | 天天久久影视色香综合网| 中文字幕欧美亚洲| 日韩人妻无码一区二区三区| 亚洲国产成人精品无码区花野真一| 激情综合婷婷色五月蜜桃| 公交车后车座的疯狂运| 老师你的兔子好软水好多的车视频 | 欧美人与物VIDEOS另类| 亚洲综合在线成人一区| 精品一区二区三区在线成人| 啊灬用力啊灬啊灬快灬深| 野花日本免费观看高清电影8| 国产日韩在线观看视频| 2021年国产精品久久| 国自产拍在线天天更新91 | 北条麻妃在线一区二区| 能顺利播放的男男网站free| 国产偷国产偷亚洲高清日韩| 成人中文字幕一区二区三区| 国产精品免费_区二区三区观看 | 18av在线视频| 国产麻豆一精品一av一免费| av狼最新网址| 天堂在线最新资源| videosgratis侏儒孕交| 福利网站在线播放| 在线免费观看h片| 99香蕉国产精品偷在线观看|