2012-08-09 92 views
3

爲什麼select * from table的性能不如select col_1,col_2 from table?據我所知,這是行佔用時間的位置,而不是返回多少列。oracle中select * vs select colname的性能

+0

請參閱[*此*](http://stackoverflow.com/questions/3180375/select-vs-select-column) – alfasin 2012-08-09 22:49:22

+0

您是指僅有兩列的表格嗎? – 2012-08-10 00:45:02

回答

9

選擇不必要的列可能會導致查詢計劃更改對性能產生巨大影響。例如,如果col_1, col2上有一個索引,但表中還有其他列,則select *查詢必須執行全表掃描,而select col_1, col_2查詢可以簡單地掃描可能更小的索引,因此很多查詢成本較低。如果您開始處理涉及多個表的查詢或涉及查詢的查詢,則選擇列的子集有時也可以通過允許Oracle消除不必要的連接或功能評估來更改查詢計劃。現在,公平地說,查詢計劃將根據所選列進行更改並不常見,但如果這樣做,更改通常很重要。

如果您從數據庫外的應用程序發出SQL語句,則選擇其他列會強制Oracle通過網絡發送其他數據,這樣您的應用程序將花費更多時間等待網絡I/O發送數據不感興趣,這可能是非常低效的,特別是如果你的應用程序被部署在WAN上。

選擇不必要的列也可以強制Oracle在不更改計劃的情況下執行額外的I/O。例如,如果您不需要的表格中的某一列是LOB,則Oracle必須執行額外的工作才能獲取LOB數據。如果數據存儲在磁盤上的鏈接塊中,但您感興趣的列恰好位於第一行中,則Oracle不必爲指定列的子集的查詢獲取額外的行塊。另一方面,執行select *的查詢必須提取每一行。

當然,這是在考慮維護方面之前。如果您正在編寫PL/SQL之外的應用程序,那麼執行SELECT *意味着在將來有人向表中添加新列時代碼會中斷,或者您的應用程序必須在運行時動態確定一組列被返回以自動適應新列。雖然這當然是可行的,但它很可能導致代碼更復雜,因此更難以調試和維護。如果您正在編寫PL/SQL並將數據提取到%ROWTYPE變量中,那麼在生產代碼中執行SELECT *可能是完全合理的;在其他語言中,如果您執行SELECT *,則通常會設置自己的維護噩夢。

+0

+ +1爲了將大局置入考慮範圍......即,將數據發送到Oracle外的應用程序 – Victor 2012-08-10 16:27:57

0

當您執行SELECT *時,存在從數據字典中爲表查找定義的問題。

當您需要的唯一列是col_1和col_2時,還有一個問題是數據庫要做的工作多一點。對於大型表格,這尤其是個問題。

而且存在網絡帶寬被大於所需數據集所吞噬的問題。

這不是做SELECT *的最佳做法。 它也使嵌入式SQL代碼難以閱讀。

+0

在(hard?)解析時間,Oracle需要在數據字典中查找「select *」還是「select col_1,col2」。不查看數據字典,Oracle不會知道col_1和col_2是否是表,函數等中的列。也不知道行的哪裏查找它們,數據類型等。 – 2012-08-09 23:32:38