2010-01-04 70 views
6

我在this article中发现,既然ORACLE 10g有一种方法可以使用ALTER SESSION来使特定的连接会话比较字符串不区分大小写,而不需要任何疯狂的SQL函数。默认情况下ORACLE 11g不区分大小写

有谁知道,在11g中,有可能是一种方法,使数据库总是在这种模式下所有的新连接的会话运行在默认情况下,从而消除了对运行在每次连接ALTER SESSION S上的需求?

或者,也许,你可以在连接字符串上指定一个额外的参数,可以打开相同的?

回答

6

只需将文章中提到的NLS_SORT,NLS_COMP参数设置为使用alter system set <parameter> = <value>;子句的Oracle init文件中的值即可。

使用alter system命令的信息可以在here找到。

这里是一个很好的link关于NLS_*参数的正确用法。请注意,NLS_SORT参数的某些设置可能会导致性能问题,即未设置为BINARY时。甲骨文文档状态:

设置NLS_SORT到其他 比BINARY什么导致一种使用 全表扫描,无论通过优化程序选择的 路径。二进制 是例外,因为索引是根据 键的二进制顺序构建的 。因此,当NLS_SORT设置为BINARY时,优化程序可以使用 索引来满足ORDER BY子句 。如果 NLS_SORT设置为任何语言 排序,则优化程序必须在 执行计划中包含 全表扫描和完整排序。

+0

虽然这个报价是从Oracle文档, “无论优化程序选择的路径如何”也没有意义。更有用的参考资料是 http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch5lingsort.htm#sthref650 – 2010-01-04 21:56:20

+1

“正确使用NLS_ *参数的良好链接”我在答复中提供的链接和信息与您提供的链接相同,只是我的答案中的链接来自11g文档。 – 2010-01-05 00:33:40

+0

我正在处理这个问题,我发现为了避免性能问题,可以为该列创建一个CI索引:在table_name上创建索引index_name(NLSSORT(column_name,'NLS_SORT = BINARY_CI')); [参考资料](http://geekzspot.blogspot.com.es/2010/01/case-insensitive-oracle-database.html) – Marc 2013-04-10 15:27:45

3

当然可以!

获得UR友好DBA来设置这些PARAMATERS:

ALTER SYSTEM SET NLS_COMP =语言范畴SPFILE;

ALTER SYSTEM SET NLS_SORT = BINARY_AI SCOPE SPFILE;

这是从我的短文章采取How to make Oracle Case Insensitive

+0

RC的答案是什么?这样做是否会完全破坏系统的性能,这似乎表明了这一点? – eidylon 2010-03-02 02:50:35

3

我使用logon trigger发出这些命令来获取不区分大小写的查询尝试:

execute immediate 'alter session set NLS_SORT=BINARY_CI'; 
execute immediate 'alter session set NLS_COMP=LINGUISTIC'; 

尽管这的确给我CI,它也给了我难以置信的糟糕的性能问题。我们有一张特别的表,如果没有这些设置,插入需要2毫秒。使用这些设置,插入花费了3 。我通过多次创建和删除触发器来确认这一点。

我不知道在系统级别执行操作,而不是触发器的会话级别,会影响与否。

+1

Eeks!这是相当可怕的表现!我不敢相信ORACLE还没有加入更好的支持。我的意思是,如果你正在搜索发票或评论,笔记或几乎任何常见的文本字段,你真的不在乎是否有人写道“把猫带到兽医”或“把猫带到兽医”。 – eidylon 2011-07-11 14:17:43

+1

昨天我们与甲骨文顾问会面之后,我们发现使用这两个设置的诀窍是您必须在很多地方放置功能索引。在我们的例子中,我们使用varchar2(32)UUID作为主键。由于有两个NSL设置,所以没有使用正常的PK索引。我们必须添加索引,如 在Person上创建索引foo_ok(nlssort(Id,'NLS_SORT = BINARY_CI')); 我们所有的PK。 – 2011-07-12 14:54:21

+1

Egads!将“黄昏地带”与“黄昏地带”作为同一件事,这是很多工作。 – eidylon 2011-07-13 03:45:04

0

我发现与11g r2中的inserts和nls相同的性能问题!幸运的是,对于我来说,性能的提升还不够明显,需要改变应用程序。

如果你可以不binary_ci为INSERT这样做,那么我只想插入事后之前做一个ALTER会议,所以你不必删除触发器

相关问题