这是这个问题的结果。
所以我正在处理一个看起来像这样的查询:
select count(*)
from table1
where col1 = 123
and col2 = '1';
问题是这样的: col2
被定义为一个CHAR(1)
和所有会话集NLS_SORT = 'BINARY_CI'
和NLS_COMP = 'LINGUISTIC'
。(col1
是一NUMBER
列。)
首先,在没有为会话启用 NLS 设置的情况下,定义一个多列扩展统计(col1,col2)
可以正常工作并产生适当的基数。
但是对于NLS_SORT = 'BINARY_CI'
and NLS_COMP = 'LINGUISTIC'
,它不使用扩展统计信息。我相信它很像一个索引和 NLS 设置——我们必须用(NLSSORT("COL2",'nls_sort=''BINARY_CI'''))
.
因此,我在("COL1", (NLSSORT("COL2",'nls_sort=''BINARY_CI'''))
. 但它仍然不起作用(但定义相同的索引将起作用)。
在谓词信息中,它显示在启用 NLS 设置的情况下,col2 = '1'
转换为:
NLSSORT(INTERNAL_FUNCTION(col2),'nls_sort=''BINARY_CI''')=HEXTORAW('3100')
。我相信这INTERNAL_FUNCTION()
是由于col2
被定义为CHAR(1)
。我无法改变这一点。
根据我的条件,如何为这些列创建多列扩展统计列组?
我认为您在这里唯一的选择是“滚动自己的”伪多列统计信息——因为无法在 Virtual Columns 上创建扩展统计信息。例如:
试验台:
首先尝试使用正常直方图(注意“行”估计是“差”):
现在创建虚拟串联列(注意“行”估计是“好”):
最后重复 NLS 参数集:
没有索引:
带索引: