www說
2018-07-27 09:09:24
SQLSERVER 中,有個語句用SELECT * 只要1S,用SELECT [字段1],[字段2]...卻要30幾秒,這是什么問題了?
3 回答

ITMISS
TA貢獻1871條經驗 獲得超8個贊
這個要看具體的執行計劃。首先我們要分析清楚select *和select a1,a2,a3的區別。
首先sql server是按照數據塊來存取數據的,一個數據塊是8K,當你需要的數據在某個數據塊上時,sql server會將整個8K的數據從磁盤上加載到內存中,而不僅僅是讀取你需要的a1、a2這幾個字段,從這種意義上來說,select *和select a1,a2,a3這種寫法速度是一樣的。
但是有一個問題在于有索引,當有索引的時候就不一樣了,比如a1, a2, a3都在索引字段里面(包括inclue),這個時候如果select a1, a2,a3的話只要掃描索引就好了,而select *卻要掃描表,通常這種情況下select a1, a2, a3要快一些。但是如果只有a1, a2在索引中,而a3不在索引中,那么select a1, a2, a3的時候就需要先掃描索引得到a1, a2,再通過索引找到表中對應的數據塊取出來a3(注意取a3的時候是8K數據塊一起取得),這時你會發現select a1, a2, a3又沒什么優勢了。當取得數據特別多的時候,掃描索引再去查找表,反而不如直接掃描表來的快,所以有時可能select *反而快。
所以要具體問題具體分析,具體的要看查詢計劃,確定問題所在。
- 3 回答
- 0 關注
- 1033 瀏覽
添加回答
舉報
0/150
提交
取消