志当存高远,功到自然成!

少年强则中国强,少年进步则中国进步!

BlogJava 首页 新随笔 联系 聚合 管理
  53 Posts :: 2 Stories :: 2 Comments :: 0 Trackbacks

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


只有注册用户登录后才能发表评论。


网站导航: