2016-07-26 108 views
0

我一直在閱讀此內容,並且我明白最好明確列出列名稱,但我仍然有一個問題。選擇* vs選擇所有列名稱

讓我們假設下面的情況(這是非常接近我的真實的生活場景):我沒有使用任何BLOB數據

    1. 新列將永遠不會被添加

    2. 我其實想要返回所有的列

    3. 我有一張大約有1.4億行的表格
    4. 我實際上並不需要所有1.4億行,但讓我們假裝我爲了參數而做
    5. 我沒有使用任何連接,也沒有人會使用
    6. 下面的查詢實際上完全是我如何運行查詢。

    有以下查詢之間的性能差異:

    select * 
    from table 
    

    VS

    select every_column_name 
    from table 
    

    編輯:據我所知,在這個題目上百萬的問題。但是對於這個特定的情景是否有任何性能差異?是select *仍然不好或將兩個查詢具有相同的性能?

    從我所知道的情況來看,基於使用explain的結果,對於這種特殊情況沒有區別。

  • +1

    使用'select *'沒有什麼壞處,特別是對於臨時查詢。有一些風險,但你似乎理解它們,所以你可以在你的特定情況下做出最好的決定。 –

    回答

    2

    這是對我評論的闡述。

    使用select *作爲即席查詢肯定沒有壞處。這是一個很大的便利和共同點。

    當您想要隨時間運行相同的查詢時出現問題。特別是,如果查詢已編譯,則對基礎表的更改可能會導致意外問題。我在一個視圖中「深情地」回想花費大約10個小時來調試一個問題(從早上6點開始),這個問題是由select *引起的,當時底層表中的列類型發生了變化。該代碼未重新編譯,數據記錄中的偏移量已關閉。

    即使這種情況可以通過強制重新編譯來解決。而且,我通常在臨時查詢中使用SELECT *

    您的問題總結了一些關鍵點,如寬列減慢查詢。

    +0

    「代碼沒有重新編譯,數據記錄中的偏移量已關閉」 - 因此在代碼列索引中沒有使用名稱?o_O – zerkms

    +0

    @zerkms。 。 。編譯代碼時,列的位置將存儲爲偏移量和其他信息。該列的符號名稱未使用。 –

    +0

    那是什麼編程語言? PSQL? – zerkms

    0

    它們之間沒有任何性能差異。當DBMS分析這兩條語句時,它會產生相同的查詢。也就是說,*是every_column_name的快捷鍵。