我在this article中发现,自ORACLE 10g以来,有一种方法可以使用ALTER SESSION
使特定的连接 - 会话比较字符串不区分大小写,而不需要任何疯狂的SQL函数。
有人知道,在11g中,是否有一种方法可以使数据库默认在所有新连接会话中始终以此模式运行,从而无需每次都运行ALTER SESSION
连接?
或许,您可以在连接字符串上指定一个额外的参数,该参数会相同?
答案 0 :(得分:6)
您可以使用NLS_SORT
子句将文章中提到的NLS_COMP
,alter system set <parameter> = <value>;
参数设置为Oracle init文件中的值。
可以找到使用alter system命令的信息here。
对于NLS_*
参数的正确用法,这是一个很好的link。请注意,NLS_SORT参数的某些设置可能/可能导致性能问题,即未设置为BINARY时。 Oracle文档声明:
将NLS_SORT设置为其他任何内容 比BINARY导致排序使用a 全表扫描,无论如何 优化器选择的路径。 BINARY 因为索引是例外 按照二进制顺序构建 键。因此优化器可以使用 索引以满足ORDER BY子句 当NLS_SORT设置为BINARY时。如果 NLS_SORT设置为任何语言 排序,优化器必须包含一个 全表扫描和完整的排序 执行计划。
答案 1 :(得分:5)
当然可以!
让友好的DBA设置这些参数:
ALTER SYSTEM SET NLS_COMP=LINGUISTIC SCOPE=SPFILE;
ALTER SYSTEM SET NLS_SORT=BINARY_AI SCOPE=SPFILE;
上的简短文章
答案 2 :(得分:3)
我尝试使用logon trigger
发出这些命令来获取不区分大小写的查询:
execute immediate 'alter session set NLS_SORT=BINARY_CI';
execute immediate 'alter session set NLS_COMP=LINGUISTIC';
虽然这确实给了我CI,但它也给了我难以置信的糟糕表现问题。我们特别有一个表,没有这些设置,插入需要2毫秒。有了这些设置,插入需要3 秒。我通过多次创建和删除触发器来确认这一点。
我不知道是否在系统级别进行此操作,而不是使用触发器进行会话级别,是否会产生影响。
答案 3 :(得分:0)
我在11g r2中发现了与insert和nls相同的性能问题!对我来说幸运的是,性能影响不够大,需要更换应用程序。
如果你可以在没有binary_ci的情况下执行INSERT,那么我会在插入之前和之后进行一次alter session,这样你就不必放弃触发器了