TableScan 按照行在数据库中的存储顺序来读取表上所有页中的所有行。这称为顺序表扫描。
顺序表扫描在简要文本计划和详细文本计划中显示为 correlation_name<seq>,其中 correlation_name 是在 FROM 子句中指定的相关名(如果未指定相关名,则为表名)。
当大多数表页可能具有匹配查询搜索条件的行或者尚未定义合适的索引时,将使用顺序表扫描。
虽然顺序表扫描可能会比索引扫描读取更多的页,但由于这些页是以连续块的形式从磁盘中读取的,因此磁盘 I/O 的开销会非常低(如果数据库文件在磁盘上没有碎片,这种性能改善将最为明显)。顺序 I/O 会减少磁盘头移动和旋转的等待时间。对于大表,顺序表扫描还会一次读取包含多个页的组。这将进一步降低顺序表扫描相对于索引扫描的开销。
虽然顺序表扫描可能会比匹配许多行的索引扫描花费的时间少,但如果顺序表扫描被执行多次,它们将无法像索引扫描那样有效地利用高速缓存。由于索引扫描访问的表页很可能较少,因此这些页很可能会在高速缓存中,这将加快访问的速度。所以,对于重复的表访问(如嵌套循环连接的右侧),最好采用索引扫描。
对于以隔离级别 3 执行的事务,SQL Anywhere 会在所访问的每一行上获取锁—即使该行不满足搜索条件。在这一隔离级别,顺序表扫描会在表中的所有行上获取锁,而索引扫描只在匹配搜索条件的行上获取锁。这意味着顺序表扫描在多用户环境中可能会显著地降低吞吐量。因此,优化程序在隔离级别 3 会非常倾向于优先使用索引访问,而不是顺序访问。顺序扫描可在扫描过程中有效地计算表列和常数之间的简单比较谓语。其它只引用要扫描的表的搜索条件在这些简单比较之后进行计算,此方法比顺序扫描后在过滤器中计算条件要略为高效。
![]() |
使用DocCommentXchange 讨论此页。
|
版权 © 2010, iAnywhere Solutions, Inc. - SQL Anywhere 12.0.0 |