Oracle 当只在主键上筛选单个表时,为什么优化器要执行完整表扫描?

Oracle 当只在主键上筛选单个表时,为什么优化器要执行完整表扫描?,oracle,sql-execution-plan,Oracle,Sql Execution Plan,我有一张怪物大小的无隔板桌子。我最近也更新了统计数据 主键位于名为“ID”的字符字段上 该计划说的是表访问(完整),并且有一个ID的筛选器谓词。这将导致一个运行需要8秒的查询 如果我给优化器一个使用主键的提示,查询运行需要1.6秒 我觉得奇怪的是,我需要提供这个提示。索引计划估计较低的成本,优化器应该意识到这一点 以下是筛选器谓词: NLSSORT(INTERNAL_FUNCTION(ID),'nls_sort="JAPANESE_M"')=HEXTORAW('017...') 数据库NLS\

我有一张怪物大小的无隔板桌子。我最近也更新了统计数据

主键位于名为“ID”的字符字段上

该计划说的是
表访问(完整)
,并且有一个ID的筛选器谓词。这将导致一个运行需要8秒的查询

如果我给优化器一个使用主键的提示,查询运行需要1.6秒

我觉得奇怪的是,我需要提供这个提示。索引计划估计较低的成本,优化器应该意识到这一点

以下是筛选器谓词:

NLSSORT(INTERNAL_FUNCTION(ID),'nls_sort="JAPANESE_M"')=HEXTORAW('017...')
数据库
NLS\u排序
设置为
JAPANESE\u M
,而
NLS\u字符集
JA16SJIS
。 因此,似乎没有什么不匹配的地方会导致调用特殊的排序函数。不过有点奇怪

还有一条信息,如果我在查询中只选择“ID”列,那么刨床会自动选择
索引(快速全扫描)
。 只有当我使用
select*
时,问题才会出现


Oracle数据库验证:10.2.0.5.0。

您应该提供ddl和查询计划。我假设我在主键smt的ddl中看到这样的'NLS_SORT=“JAPANESE_M'。我相信这是因为客户端会话和数据库之间的某些NLS参数不匹配。请看下面的线程--我认为在您的例子中,输入没有使用与数据相同的NLS设置进行处理,从而导致转换和搜索。在某些情况下,分析表会有所帮助。列
id
的数据类型是什么?请运行
描述“MYDATA”
;很多时候,人们认为他们知道数据类型,然后在六天和八个答案之后,他们说“对不起,实际上我错了,这是不一样的。”我不允许描述实际的表,但我已经验证了“ID”是CHAR(10)。此外,选择“ID”、“NAME”将导致完全表访问,而仅选择“ID”将导致快速索引搜索。我开始怀疑优化器的成本计算不正确。
NLSSORT(INTERNAL_FUNCTION(ID),'nls_sort="JAPANESE_M"')=HEXTORAW('017...')