2010-09-08 127 views
11

案例1:我有一個30列的表格,我使用where子句中的4列進行查詢。列數是否會影響查詢性能?

案例2:我有一個6列的表,我用where子句中的4列進行查詢。

這兩種情況下的性能有什麼區別?

例如我有表

table A 
{ 
    b varchar(10), 
    c varchar(10), 
    d varchar(10), 
    e varchar(10), 
    f varchar(10), 
    g varchar(10), 
    h varchar(10) 

} 

SELECT b,c,d 
FROM A 
WHERE f='foo' 

create table B 
{ 
    b varchar(10), 
    c varchar(10), 
    d varchar(10), 
    e varchar(10), 
    f varchar(10) 

} 

SELECT b,c,d 
FROM B 
WHERE f='foo' 

A和B兩者的表具有相同的結構是指在使用列和列的數目僅區別在哪裏條件也是在選擇相同和列也是相同的。區別在於表B只有一些未使用的列,這些未在select中使用,並且在這種情況下條件爲 兩種查詢的性能是否有差異?

回答

9

SELECT返回較少的列的主要的好處是,SQL也許能夠避免從表/集羣讀書,而是,如果它能夠獲取所有從指數selected數據(無論是作爲索引列和/或覆蓋指數情況下的包含列)。謂詞中使用的列,即您的示例中的f必須位於索引的索引列中。

在一般情況下,也有在從一個SELECT返回更少列的次級益處,因爲這將減少任何I/O開銷,尤其是如果在數據庫服務器和應用程序之間的速度較慢的網絡消費數據 - 即只返回實際需要的色譜柱是很好的做法,並且避免使用SELECT *

編輯:爲響應OP的更新的帖子:

沒有索引可言,這兩個查詢會做表掃描。由於Table B的列數少於Table A,因此B上每頁的行數(密度)會更高,因此B會稍微快一點,因爲SQL需要獲取更少的頁面。

然而,具有索引按照以下

  • 指數上A(f) INCLUDE (b,c,d)
  • 指數上B(f) INCLUDE (b,c,d)

性能應爲查詢(假設兩個表中相同的數據)相同,給定SQL將會觸及現在具有相似列寬和行密度的索引。

編輯

一些其他的計劃:在B(f)

  • 指數沒有其他按鍵或INCLUDE列,或用一組INCLUDE列的不完整的(即一個或多個b, c or d缺失):

SQL Server將可能需要做一個Key or RIDLookup因爲即使使用了索引,就會有必要「加入」回到談判桌來恢復丟失select子句中的列。 (查找類型取決於表中是否存在一個羣集PK與否)上B(f,b,c,d)

+1

+供索引使用 – 2010-09-08 12:25:01

2

根據列位置不會有性能差異。現在桌子的構造是一個不同的故事,例如行數,索引,列數等

你在談論你在哪裏比較列表在兩個表中的位置的情況就像比較蘋果和桔子差不多,因爲除了蘋果之外還有很多不同的變量列位置。

1

取決於表的寬度(每行字節數),表中有多少行,以及查詢使用的列是否有索引。沒有這些信息,沒有確定的答案。但是,表格中的列越多,機會就越寬。但是正確索引的效果比表格大小的效果要重要得多。

+0

+供索引使用 – 2010-09-08 12:24:43

2

除非你有一個非常寬的列集差異,沒有使用索引(因此表掃描),你應該看到性能差別很小。話雖如此,回報儘可能少的列以滿足您的需求總是有用的/人爲的。這裏的問題是,通過返回所需的列而不是第二個數據庫獲取其他列的更好的方法。

  • 獲取你所需要的
  • 避免在同一個表中第二個數據庫查詢相同的行
  • 使用索引的選擇列(S)(WHERE子句約束部)
  • 限制列,如果你不需要它們來提高數據服務器的內存效率/分頁
+0

這就是說,SQL Server有時會抓住內存中的整個表/索引,然後將它編號爲靜音 - 嘗試查找引用。 – 2010-09-08 13:27:56

4

測試一下,看看!

將會有性能差異,然而99%的時間,你不會注意到它 - 通常你甚至無法檢測到它!

你甚至不能保證與較少列的表會更快 - 如果打擾你那麼嘗試一下,看看。

技術垃圾:(從Microsoft SQL Server的角度看)

,並假設在所有其他方面(如索引,行數,包含的6個常用列等數據...)的表是相同的,那麼唯一真正的區別將是更大的表遍佈在磁盤/內存中的更多頁上。

SQL服務器只嘗試讀取它絕對需要的數據,但它總是會一次加載整個頁面(8 KB)。即使輸入到查詢所需的數據量完全相同,如果數據分佈在更多頁面上,則需要更多的IO。這就是說,SQL服務器的數據訪問效率非常高,所以除非出現極端情況,否則您不太可能看到對性能的顯着影響。

此外,您的查詢也可能會針對索引而非表格運行,因此如果索引完全相同,則更改可能爲。

+2

+1爲測試它並看到;-) – 2010-09-08 12:53:12

相關問題