2012-08-07 82 views
0

我有一個表1 lac行與50列。我知道我必須根據主鍵精確選擇一行和一列。所以我必須使用何種查詢要麼SQL性能分析

SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

因此,任何一個請告訴我哪種方法更好,爲什麼。從性能角度來看。假設此查詢在可伸縮應用程序中頻繁運行。請說明原因。

回答

0

理想的方法是

SELECT yourcolumn FROM yourtable WHERE yourcondition 

它會產生更少的網絡流量,併爲您的要求更確切的說法。

此外,如果你的表有某些類型的列,它避免了它們的昂貴的查詢,從而給你更高的性能

+0

但是爲什麼我可以從依賴性的角度提出問題*更好。還有其他一些我也指出過的表現。這種方法會比另一種更快 – 2012-08-07 10:54:28

+0

我仍在尋求正確答案。與有效的原因 – 2012-08-08 13:56:28

0

這一切都取決於你的指標,但是,在我能想到的大多數情況下,窄選(SELECT COL_NAME)將表現更好,因爲它爲SQL提供了更多關於如何訪問數據的「選項」。

一般來說,對於任何給定的查詢,最好的情況是有一個索引,它允許您在WHERE條件下進行索引查找,但也包括您在SELECT中需要的列。這樣,RDBMS只需要使用索引來獲得查詢結果 - 它根本不需要基礎表。

在MS SQL Server中,覆蓋索引可以讓你做到這一點。

這是不可能的

SELECT * FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

將在許多情況下最優的,因爲除非你有IND_COL_NAME,其中包括表中的所有列(這將是浪費的存儲明智的,除非<IND_COL_NAME>是您的聚集索引指數)。否則,這意味着查詢需要在<IND_COL_NAME>的索引上查找,然後再回到物理表中以檢索列數據的其餘部分。

因此,對於你窄查詢

SELECT COL_NAME FROM <TAB_NAME> WHERE <IND_COL_NAME> = XXXXXX 

的最佳指標將是對<IND_COL_NAME>,其中包括COL_NAME。既然你說<IND_COL_NAME>是你的主要關鍵,它將是高度選擇性的。

+0

請看看最新的評論 – 2012-08-07 12:24:55

0

請勿使用*指定字段,請始終指定所需的字段。

提取單行時,數據大小的差異很小,但通常只應獲得減少帶寬使用所需的數據。另一方面是使用*增加了對錶格設計的依賴。如果稍後在表中添加更多字段,查詢也會提取這些字段,這可能意味着您獲得的數據多於緩衝區中的數據,並且會出現異常。

當您從表格中獲得單個字段(或幾個字段)時,會有特定的性能優勢。如果您的密鑰的索引中包含想要的字段作爲包含列,那麼查詢可以僅從索引運行,甚至不涉及表本身。

+0

據我所知,(Oracle)將數據存儲在DATA文件中。這被進一步分割爲DB_BLOCK和OS_BLOCK。正如我所說的那樣有索引,所以會有確切的行位置。然後到達DESIRED行後,他們必須掃描所有的COLUMN(最糟糕的情況)。那麼表現在哪裏。在他們兩個之間其他更多的數據塊在*的情況下。 – 2012-08-07 11:17:44

+0

@PavanSharma:Oracle在索引中沒有包含列,因此您可以使用鍵和想要的字段進行索引。如果你有這些,所有需要的信息都在索引中,並且根本不需要從數據文件中讀取。 – Guffa 2012-08-07 15:51:40

+0

在Oracle ROW中,數據存儲在[{COL_SIZE,COL_VALUE},{COL_SIZE,COL_VALUE},{COL_SIZE,COL_VALUE} {COL_SIZE,COL_VALUE} ...]中。並且索引與包含具有ROWID的索引鍵值(ROWID是其存儲在數據文件中的ROW的物理位置)的表相關聯。當我們使用索引列選擇數據時,直接在所需的物理位置(ROWID)上選擇數據,然後我認爲篩選記錄,用於列。那麼NARROW語句如何提高性能? – 2012-08-08 05:46:59