偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

用Select * 進行SQL查詢的七宗罪

譯文
數(shù)據(jù)庫 Oracle
本文通過在應用編程中的實際經驗,向大家證明使用Select * from table進行SQL查詢的“七宗罪”。

【51CTO.com快譯】如今,網上許多文章都已明確地指出:使用“SELECT * ”作為SQL查詢方式是一種極其危險的代碼書寫習慣。開發(fā)人員應該盡量在自己的程序中避免出現(xiàn)此類查詢,取而代之的應該是明確地指定要查詢的列名。不過,大家可能只是“知其然,而不知其所以然”。在本文中,讓我向各位初級開發(fā)人員詳細解釋,此類SQL查詢***實踐背后的具體原因。

首先,我們經常面對的客觀情況是:在Oracle數(shù)據(jù)庫中,許多SQL開發(fā)人員都是從接觸“SELECT * from EMP”(EMP為表的名稱)之類的查詢語句,開始學習SQL語言的。因此,除非能夠給出充分的理由,否則我們很難撼動他們使用此類便捷查詢語句的習慣。

下面,我將根據(jù)自己在應用編程中的實際經驗,向大家證明使用Select * from table進行SQL查詢的“七宗罪”。

1. 不必要的I/O(輸入/輸出)

通過使用SELECT * ,您雖然可以獲得一些完全可以被忽略的返回數(shù)據(jù),但是該獲取過程可并不是免費的。那些本來可能只需要從索引頁面中讀取的數(shù)據(jù)檢索,如今您卻不得不從各個頁面中以全量的方式讀取出來。顯然,此舉會導致數(shù)據(jù)庫端白白浪費各種有限的I/O周期。

另外,該方式也可能會拖慢您的查詢速度。如果您好奇并想探究數(shù)據(jù)庫后臺的查詢執(zhí)行過程,以及查詢引擎是如何順次處理查詢語句的話,我建議您參考:Markus Winand的《SQL Performance Explained》(請參見http://www.amazon.com/Performance-Explained-Everything-Developers-about/dp/3950307826/?tag=javamysqlanta-20),以及Udemy的《The Complete SQL BootCamp》(請參見https://click.linksynergy.com/fs-bin/click?id=JVFxdTr9V80&subid=0&offerid=323058.1&type=10&tmpid=14538&RD_PARM1=https%3A%2F%2Fwww.udemy.com%2Fthe-complete-sql-bootcamp%2F)課程。

2. 增加的網絡流量

SELECT * 雖然能返回比用戶預期更多的數(shù)據(jù),但是相應地,這些數(shù)據(jù)的傳輸勢必會消耗更多的網絡帶寬資源。與此同時,網絡帶寬的增加也就意味著:那些真正為用戶所需要的數(shù)據(jù)將會花費更長的時間,才能被傳送到客戶端的應用程序上。例如:如果您可能是在本地計算機上運行由SQL Server Management Studio(請詳見http://bit.ly/2CXPyBB)、Toad或SQL Developer for Oracle(請參見http://bit.ly/2xQzAsd)提供的查詢編輯器,或是在某個Java應用服務器上運行此類查詢,這都會耗費您不少的網絡流量與資源。

3.更多的應用內存

隨著業(yè)務數(shù)據(jù)的猛增,您的應用程序可能需要使用更多的內存,來保存由此類查詢方式所產生的,可能來自Microsoft SQL Server(請參見http://www.java67.com/2018/01/top-4-free-microsoft-sql-server-books.html)的各種無用數(shù)據(jù)。

4.產生依賴于列排序的結果集(ResultSet)

當您在應用程序中使用SELECT * 查詢后,您會得到一些依賴于數(shù)據(jù)表的列排序的結果集。因此,一旦有新的列被添加,或者是列排序被修改了,它們都會對查詢的結果集產生不同的影響。

5.新增列會破壞既有的視圖

如果您在視圖(請參見http://www.java67.com/2012/11/what-is-difference-between-view-vs-materialized-view-database-sql.html)中使用了SELECT * ,那么一旦有新的列被添加,同時舊的列從表中被去除時,您所構建的原有視圖就會被破壞,進而返回給用戶錯誤的結果。

為避免此類情況的發(fā)生,您應該始終在SQL Server數(shù)據(jù)庫(請參見http://javarevisited.blogspot.sg/2013/11/difference-between-char-varchar-nchar-nvarchar-sql-database.html#axzz5CSnhvSWV)里,對于視圖的定義中,包含WITH SCHEMABINDING選項。

6. 連接查詢中的沖突

如果您在連接查詢(JOIN Query,請參見https://javarevisited.blogspot.com/2012/11/how-to-join-three-tables-in-sql-query-mysql-sqlserver.html#axzz5az3hfsHW)中使用了SELECT * ,那么一旦在多個表中出現(xiàn)了具有相同名稱的列,例如status、active和name等,就可能會產生各種并發(fā)式的沖突。

雖說在直接查詢中,出現(xiàn)問題的可能性不大,但是當您試著按其中的某一列進行排序、或是在公用表表達式(Common Table Expression,CTE)、以及派生表(derived table)中使用查詢的時候,您就需要進行各種進一步的調整,以避免產生沖突了。

7.在表間復制數(shù)據(jù)時的風險

您可能會經常使用“SELECT * into INSERT . . .”之類的語句,以實現(xiàn)將某些數(shù)據(jù)從一張表復制到另一張表。如果在兩張表中,各個列的排列順序略有不同,那么就可能會出現(xiàn)將不正確的數(shù)據(jù)復制到錯誤列中的情況。

一些程序員可能會認為:由于查詢解析器必須額外地驗證某些靜態(tài)值,因此導致了在EXISTS語句(譯者注:即檢驗查詢的結果是否返回數(shù)據(jù),請參見https://javarevisited.blogspot.com/2016/01/sql-exists-example-customers-who-never-ordered.html)中使用SELECT * 要比SELECT 1的速度更快一些。此觀點擱在過去可能會有幾分道理。但是現(xiàn)在,各種數(shù)據(jù)庫解析器已經發(fā)展得相當智能了,它們判斷EXISTS語句的效率,與產生SELECT結果列表(請參見https://javarevisited.blogspot.com/2016/04/how-to-convert-result-of-select-command-to-comma-separated-String-in-SQL-Server.html)將毫無關系。

結論

通過上述七點分析,相信您應該明白了為什么不能在SQL查詢中濫用SELECT * 的原因吧?可見,您應該盡可能地在查詢中,使用顯式的列名稱,而不是那些星號通配符。此舉不但能夠提高您的代碼效率,也可以使您的程序更加清晰。與此同時,該方法還能夠幫助您創(chuàng)建各種具有可維護性的代碼。而且,如果后期在表中有新的一列被添加的話,您的代碼也不會因此受到影響,您仍然會擁有來自原始數(shù)據(jù)表的參考視圖。

原文標題:7 Reasons Why Using SELECT * FROM TABLE in SQL Query Is a Bad Idea,作者:Javin Paul

【51CTO譯稿,合作站點轉載請注明原文譯者和出處為51CTO.com】

責任編輯:龐桂玉 來源: 51CTO
相關推薦

2023-05-08 10:54:39

IT管理CIO

2024-06-19 19:28:51

2018-02-05 23:14:35

光纖網絡光纖施工

2011-02-21 09:04:25

2014-01-13 09:35:13

創(chuàng)業(yè)企業(yè)

2021-03-01 18:48:21

Go管理工具

2013-01-17 17:14:52

Objective-C

2013-05-10 10:49:53

2015-09-15 13:22:08

數(shù)據(jù)分析七宗罪

2010-08-18 10:05:27

IE7IE6

2011-02-23 10:51:36

Chrome

2012-09-07 14:41:26

2023-10-17 20:28:13

軟件開發(fā)代碼

2015-07-16 09:14:50

數(shù)據(jù)中心數(shù)據(jù)中心效率

2016-12-08 13:12:36

數(shù)據(jù)中心綠色認證

2012-04-04 22:15:19

移動游戲

2021-03-03 14:08:48

自動化高管IT投資

2013-12-04 09:52:27

程序員漫畫

2017-01-09 15:25:49

物聯(lián)網策略設計

2017-08-02 16:24:04

點贊
收藏

51CTO技術棧公眾號