最近兩天學習優化. 有一個問題很困惑呀. 求各位大俠幫助.
按照一般的決議順序的說明,應該是
先FROM
再WHERE
再SELECT的
那假設有多個關系的時候,用最差的情況是 FROM 做了兩個關系的笛卡爾積。
按理說這個時候 已經決議了新關系的全部屬性呀. 那么問題來了!
用select * 和 用select 屬性名的性能不是一樣嗎!!!
是你們在騙我嘛嗎? 還是有別的梗我還不知道的.
uj5u.com熱心網友回復:
你在說決議屬性還是說查詢效率,笛卡爾積和屬性有啥關系。select * 和 用select 屬性名 ,性能差別基本上微乎及微,建議還是屬性名,因為你寫了*,如果欄位變化了可能會導致程式報錯。uj5u.com熱心網友回復:
啊,當然是查詢效率… 嗯 看來是一致的uj5u.com熱心網友回復:
又來看了下, 你是說寫*的話, 決議出來的欄位有變化,呼叫這段sql的程式會報錯吧.
但不寫星的話,如果基表的欄位名稱變化, sql就報錯啦... 結果不是一樣的. 所有效果上也沒區別呀...
另外你說笛卡爾積和屬性有啥關系,在看資料庫系統概念的時候,有一個原理需要補充下.
如果你的from陳述句后面跟兩個表,舉個例子。
select *
from instructor,course;
按照決議順序應該是先求兩個表的笛卡爾積,作為一個新表給輸入給select 陳述句。
情況應該是驅動表的所有列加上被驅動表的所有列,然后回傳所有行,這就是新表了。
這時再去看select的限定條件。
這里*和 所有列名的性能應該是一致的, 因為按照上面來說, 不管是*還是所有列名,該做的決議在from陳述句那一步已經做了
在這一步僅僅是展示篩選而已。
所有優化的重點是from陳述句后面的表,而不是select陳述句是不是該寫星。 這就是前兩天的疑問。
但是貌似現實中很少看到有人在from上做優化的,大部分都是直接寫表名了。
uj5u.com熱心網友回復:
用select * 和 用select 屬性名的性能不是一樣嗎!!!比如一共有 50 列,寫 * 就是回傳50 列, select col1, col2, col3 ,這個寫法,都是寫一部分列, 可能只是 10 列,也可能是 5 列,
樓主可以用客戶端回傳不同的列數,看看回應時間,是不一樣的,尤其是有 LOB 欄位時,差距還是很大的。
uj5u.com熱心網友回復:
嗯. 版主大人.可能我上面沒說的那么明白. 我想討論的是同樣的條件下.性能是不是一樣.
舉個例子,比如一共有50列, *的話毫無疑問是回傳50列,而我直接寫50個列名當然也回傳50列. 此時的性能應該是一致的吧.
而且一開始的開貼子的原因在于,其實性能差距是在FROM陳述句造成的.而select 陳述句應該對最終陳述句執行時間的影響不大.
uj5u.com熱心網友回復:
對于正常的SQL來講(就是不理會笛卡爾積,或者出現BUG等情況),排除回傳資料到客戶端這個步驟,在資料庫端,影響性能最大的是SQL執行計劃,怎么樣訪問SQL中包含的物件,是走索引,還是走表掃描?是走nested loops,還是走hash join…… 當然,并發的高低也會影響整庫的性能,從整庫角度出發,單獨陳述句執行時間比較低的SQL,在高并發的情況下,不一定單獨執行時候執行時間較長的SQL好。轉載請註明出處,本文鏈接:https://www.uj5u.com/shujuku/82481.html
標籤:基礎和管理
上一篇:oracle資料庫存盤程序
下一篇:親們,誰能幫我解釋一下這個問題:navicat能通過sql陳述句查詢到資料表,但是在表里面找不到這張表,這是怎么回事
