BETWEEN AND 走全表掃描

[复制链接]
查看11 | 回复9 | 2010-1-4 08:33:08 | 显示全部楼层 |阅读模式
Hello,
SQL很簡單:
SELECT VER_1, ITEM_1,ITEM_2 fromTableName WHERE :B1 BETWEEN ITEM_1 AND ITEM_2
ITEM_1& ITEM_2都有單獨建索引,兩個欄位也有建組合索引,為什麼還是全表掃描.
數據量有11萬筆,難道是不走索引更有效?
數據庫版本是RAC 10.2.0.4
Redhat 64位
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
我簡單測試後. 確實會走索引
無論是 CBO, RBO
可能跟數據庫的資料分佈有關
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
是不是 返回的数据 非常多呢
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
最多返回一行
我重新建一個測試Table,也是全表掃描
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
你可以这样试试~
单独运行这个SQL 不用绑定变量
看看执行计划
我没环境没法测试~这个应该好解决
[ 本帖最后由 iori809 于 2011-1-31 13:06 编辑 ]
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
很简单的一个SQL.
也仅仅返回一行
不绑定变量,替换为具体的值,也还是全表扫描
我是用pl/sql Developer测试的
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
至少贴一下执行计划吧,估算的Card是多少?
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
为什么不多提供点信息呢
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
插了一个图片
回复

使用道具 举报

千问 | 2010-1-4 08:33:08 | 显示全部楼层
下面是我做的测试~索引是个复合索引
都是索引扫描没问题的
scott@CCDB> select * from salgrade;
GRADELOSALHISAL
---------- ---------- ----------
1700 1200
2 1201 1400
3 1401 2000
4 2001 3000
5 3001 9999


scott@CCDB> select * from salgrade where 2222 between LOSAL and HISAL;
GRADELOSALHISAL
---------- ---------- ----------
4 2001 3000

Execution Plan
----------------------------------------------------------
Plan hash value: 3196158779
----------------------------------------------------------------------------------------
| Id| Operation
| Name | Rows| Bytes | Cost (%CPU)| Time |
----------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT
|
| 4 |40 | 2 (0)| 00:00:01 |
| 1 |TABLE ACCESS BY INDEX ROWID| SALGRADE | 4 |40 | 2 (0)| 00:00:01 |
|*2 | INDEX RANGE SCAN
| LH_INDEX | 4 | | 1 (0)| 00:00:01 |
----------------------------------------------------------------------------------------
Predicate Information (identified by operation id):
---------------------------------------------------
2 - access("HISAL">=2222 AND "LOSAL"=2222)

Statistics
----------------------------------------------------------

1recursive calls

0db block gets

3consistent gets

0physical reads

0redo size
656bytes sent via SQL*Net to client
520bytes received via SQL*Net from client

2SQL*Net roundtrips to/from client

0sorts (memory)

0sorts (disk)

1rows processed

我建议在SERVER端的SQLPLUS用trace在试试看,要不就看看统计信息
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行