2012-10-09 64 views
-4

我是新手,我有很大的問題。如何使用索引優化SELECT *命令?

我查詢SELECT * FROM TABLE時間太長。

是否可以使用索引對此進行優化以獲得更快的結果?

我知道,索引是WHERE條款有用的相似,但是這是SELECT *

我有超過20萬的記錄,當然它們都具有唯一的ID。

將足以只是創建一個ID列或什麼是最好的策略一個指數?

+4

如果您正在選擇200k條記錄,那麼將結果從數據庫服務器傳輸到目標應用程序(數據庫管理套件,最終應用程序等)的可能性更大。如果你選擇了一小部分(ish)的數據子集並且需要很長時間,那麼索引可能會有所幫助。這個問題太模糊了。發佈有關您的表結構的特定詳細信息以及提供問題的示例查詢 – Tobsey

+0

我正在使用DB2數據庫。它有表TICKET當我使用SELECT * FROM TABLE IT RETURN 200K記錄但它太長。如果我想僅返回示例SELECT * FROM TICKET WHERE NAME ='AAA'的三條記錄,它也會持續太長 – Dejan

+0

這基本上是一些使用此DB的應用程序。如果用戶在沒有任何過濾器的情況下點擊ENTER,它會向他顯示所有結果 – Dejan

回答

0

你指的是獨有的ID是不是有可能,因爲它是一個索引鍵更多。在應用程序中選擇如此多的數據並處理它不會很快,特別是如果您正在構建網頁。您可能想嘗試:

  • 選擇部分數據並對其進行部分處理。
  • 在顯示應用程序中的結果之前,儘可能多地使用數據庫上的sql處理數據。
3

不要建立在25列的索引。創建多個索引,甚至可以爲每個列創建一個索引。如果用戶可以過濾所有列,那麼確保過濾器是AND而不是OR。如果你在過濾器之間,那麼索引也不會工作。

試試這個首先是作爲一個測試:

SELECT * FROM Ticket WHERE Name = 'AAA' 
-- Take length of time that takes 

CREATE INDEX IX_TICKET_NAME ON Ticket(Name) 

SELECT * FROM Ticket WHERE Name = 'AAA' 
-- Seel how long it takes now 

如果你看到一個大的性能提升,然後是指數會有所幫助。然後嘗試找出哪些其他列需要索引。

編輯:不允許用戶將所有過濾器留空。給他們一個警告,說明至少必須應用一些過濾器。或者,如果你不能做到這一點,如果所有的過濾器是空白的只是將搜索結果限於100行或某事

+0

謝謝這是非常有用的。只是爲了說明一些事情。我的QUERY始終爲AND。但系統的工作方式,他們可以留下一切空白,並進行過濾!這是一些IBM應用程序,它是如何工作的 – Dejan

+0

也我不能限制爲100個結果。查看所有記錄是整個系統的重點。 – Dejan

+0

再次嗨。我現在檢查過了,我的應用程序已經有了只有NAME列的INDEX。但是,如果我想用此參數進行過濾,我的查詢將會持續太久。爲什麼它發生,如果它已經在該領域的索引? – Dejan

3
  1. 對於要過濾的所有列,加只包含這列的索引

  2. 在DB2中,可以通過添加FETCH FIRST N ROWS ONLY來限制返回的行數,請參見http://publib.boulder.ibm.com/infocenter/dzichelp/v2r2/index.jsp?topic=%2Fcom.ibm.db2.doc.admin%2Ffrstnrw.htm。這將盡可能快,因爲在找到所有200k行之前返回前N行(只要搜索標準已編入索引)。

  3. 由於沒有人會看到它們,所以取20萬行是荒謬的。您可能想要計算行數(確實可以使用COUNT等快速完成),並僅顯示前N行,請參閱上文。重點是查看有多少行匹配,而不是查看行本身。我敢打賭!或者你們百分百瘋狂。