2014-09-23 74 views
-1

我有這樣的SQL查詢:中()子句中如何優化查詢,如select * from(where,a,b,c,d,e,f ....)中的字段?

SELECT * FROM table WHERE field IN (a,b,c,d,e,f,g,h....) 

此列表的大小可能多達2000,該表是在SybaseIQ創建的視圖。據我所知,我無法在視圖中創建索引。 那麼有沒有其他可能的方法來優化這個查詢?

我有什麼現在通過谷歌找到:

  1. 使用union all代替的,這需要在工會所有的(最多2000),一個很長的名單
  2. 插入列表子句添加到表中並嘗試加入,但由於sybase IQ數據庫不屬於我,因此我無法執行此操作,因此我只能執行查詢。

在此先感謝。

+1

也就是這樣:mysql還是sybase? – 2014-09-23 03:52:03

+0

如果您真的需要這樣做是有效的,並且您受限於此方式,則可能需要將視圖複製到可以在其上創建表的本地數據庫中。聯盟不會更快,但有索引的單獨表格會。無論如何,視圖上的索引不會有幫助,無論如何,您需要它在列表中。 – 2014-09-23 04:14:02

回答

0

如果您有足夠的權限,請嘗試在您正在使用的視圖之上創建實體化視圖,或者將現有視圖修改爲實體化視圖本身。簡單來說,物化視圖混合了表和視圖。通過物化視圖,您可以在列上創建索引,緩存結果並且不會每次都計算。您可能想要檢查普通視圖/表上的物化視圖限制。

Sybase Documentation for Materialized View

0

假設它是Sybase和您可以創建臨時表,然後沿着這些路線的東西應該幫助提高性能:

CREATE TABLE #In_List 
    ([Code] varchar(1)) 
; 

INSERT INTO #In_List 
    ([Code]) 
VALUES 
    ('d'), 
    ('e'), 
    ('k'), 
    ('p'), 
    ('r') 
; 

CREATE CLUSTERED INDEX IDX_In_List_Code ON #In_List([Code]) 
; 

select 
* 
from My_Table 
inner join #In_List on my_table.code = #in_list.code 
; 

注:這僅是試用SQL Server 2008上(using this SQLFiddle

相關問題