我有創建和使用臨時#table
Sybase存儲過程 - 如何在#table上創建索引?
一些疑問會如果臨時#table
會對它創建了一個索引來優化極大作品的存儲過程。
然而,在存儲過程中創建索引失敗:
create procedure test1 as
SELECT f1, f2, f3
INTO #table1
FROM main_table
WHERE 1 = 2
-- insert rows into #table1
create index my_idx on #table1 (f1)
SELECT f1, f2, f3 FROM #table1 (index my_idx) WHERE f1 = 11 -- "QUERY X"
當我調用上面,對於「QUERY X」的查詢計劃顯示錶掃描。
如果我只是在存儲過程外運行上面的代碼,該消息將顯示以下警告:
指數「my_idx」在指定爲優化器提示的FROM表「#表1」的條款不存在。優化器會選擇另一個索引。
這可以通過addding「走出去」創建了索引之後分兩批分裂上面的代碼運行的ad-hoc(存儲過程外)時得到解決:
create index my_idx on #table1 (f1)
go
現在,「QUERY X 「查詢計劃顯示使用索引」my_idx「。
問題:在存儲過程中,我該如何在單獨的批處理中運行「創建索引」?我不能像在上面的特設副本那樣插入「去」。請注意,我知道「將QUERY X'分解爲單獨的存儲過程」的解決方案,並且正在尋找可以避免這種情況的解決方案。
P.S.如果它的事項,這是基於Sybase 12(ASE 12.5.4)
UPDATE:
我已經看到多次提到 「模式碰撞」 我的谷歌搜索在提出這個問題之前。但這似乎並不發生在我的情況。
您可以創建一個表,填充它,在同PORC從它創建它的索引和選擇值 ,並有充分的成本它基於 準確的信息優化。這被稱爲'模式碰撞',自11.5.1起已經到位 。
我在問題中明確聲明'請注意,我意識到「將'QUERY X'拆分爲單獨的存儲過程'的解決方案」,並且正在尋找一種避免這種情況的解決方案。 – DVK 2011-07-21 17:55:24