在Sybase中我們可以象在Oracle那樣給予查尋提示嗎?如何做呢?
發表于04年8月9日
象Oracle系統那樣,在Sybase中優化器提示可以更改優化器。它們應當更慎重地使用。當數據建模正確實行,必要的索引存在,及時地更新統計,仔細編寫代碼后,ASE優化器可以完成出色的優化工作。
ASE允許你說明優化器改動如下:
[ SET FORCEPLAN ON ]
SELECT columns
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
DELETE table
FROM table ( [ INDEX indid or name | PREFETCH size | MRU | LRU ] )
WHERE columns = something
[ SET FORCEPLAN OFF ]
指定索引
通過用關鍵字INDEX及說明indid或索引名稱你可以強制使用特定的索引,如果你必須強迫使用一個索引,你應當一直用索引名稱而不是indid。這是因為indid是根據生成的次序分派給許多索引,例行的數據庫維護會改變indid。
你也可以用( INDEX 0 )來定義一個圖表掃描。這意味著ASE要進行一次全圖表掃描。
強制索引
SELECT columns
FROM table ( INDEX index_name )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( INDEX index_name )
WHERE columns = something
DELETE table
FROM table ( INDEX index_name )
WHERE columns = something
To force a Full Table Scan:
SELECT columns
FROM table ( INDEX 0 )
WHERE columns = something
UPDATE table
SET columns = something
FROM table ( INDEX 0 )
WHERE columns = something
DELETE table
FROM table ( INDEX 0 )
WHERE columns = something
象我們前面提到的,使用提示會引起應用維護和最甲優化策略的應用問題,如果你要強制實施索引或圖表掃描,不要在應用代碼內執行。用索引或圖表掃描生成一個view,用view作為圖表。這將使你的維護方便很多,并且指明了強制索引或圖表掃描的對象。
例如
CREATE
VIEW vw_[index_name | scan]_test_table
AS
SELECT columns
FROM table ( INDEX index_name | 0 )
go
這段語句訪問了圖表,強制實施了一種方法,并可以用作view
例如
SELECT columns
FROM vw_[index_name | scan]_table
WHERE columns = something
UPDATE table
SET columns = something
FROM vw_[index_name | scan]_table
WHERE columns = something
DELETE table
FROM vw_[index_name | scan]_table
WHERE columns = something
連接次序
用SET FORCEPLAN [ ON | OFF ]實施連接次序
警告!!!實施連接次序會增加應用的維護工作。另外系統的發展也會產生一條更有效的途徑。
根據選項設定的SET FORCEPLAN ON all查尋將用它們在查尋中FROM子句的次序來連接。
例如
SET FORCEPLAN ON
SELECT t1.columns
FROM table1 t1,
table2 t2
WHERE t1.column01 = t2.column01
SET FORCEPLAN OFF
go
在前面的例子中,我們強制ASE在作為Outer圖表的test_table1上進行掃描,根據統計情況這可能是一件很壞的事,只要非常熟練的DBA才能用這樣的邏輯來實施。