【发布时间】:2018-02-12 15:13:19
【问题描述】:
在我的项目数据库中,当前表 Products 中有一列名为“Name” 因此,此表可以包含“产品 A”和“产品 a” 两种产品都应该在简单的选择查询中被选中。
我创建索引:
CREATE INDEX IDX_PRODUCT_NAME ON PRODUCTS(NAME)
然后运行 SQL 查询:
SELECT /*+ INDEX(PRODUCTS IDX_PRODUCT_NAME)*/ *
FROM PRODUCTS
WHERE NAME='Product_a'
我做错了什么?
附:我知道改变会话标志的变体:
NLS_COMP=ANSI;
NLS_SORT=BINARY_CI;
但对我来说,没有更改数据库设置的有趣变体,有可能吗?或者例如仅为我的查询更改此标志。
更新:
William Robertson 在 cmets 中帮助了我。
CREATE INDEX IDX_PRODUCT_NAME ON PRODUCTS(UPPER(NAME))
之后运行查询:
SELECT *
FROM PRODUCTS
WHERE **UPPER**(NAME)='PRODUCT_A'
而且这个变体很好用!
【问题讨论】:
-
有什么问题?您是否收到错误或意外行为?
-
SELECT /*+ INDEX(PRODUCTS IDX_PRODUCT_NAME)*/ * FROM PRODUCTS WHERE NAME='Product_a'之后我没有任何输出和计划显示索引没有被使用,但是如果我的索引只是用于名称,没有 LOWER 函数并且我运行了简单的选择,计划显示索引有被使用了 -
查看基于函数的索引,在 products(upper(name)) 上创建索引,在谓词中使用 upper(name)。
-
带有 UPPER 功能的索引也不起作用。检查我上面的评论,我改变了它。
-
除非您在
where子句中指定upper(name),否则它不是区分大小写的查询。
标签: sql oracle oracle11g query-hints