在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才能用这样的逻辑来实施。