我在这篇文章中发现,从 ORACLE 10g 开始,有一种方法可以使特定的连接会话不区分大小写,而不需要任何疯狂的 SQL 函数,使用ALTER SESSION
.
有谁知道,在 11g 中,是否有一种方法可以使数据库在默认情况下对所有新的连接会话始终以这种模式运行,从而消除ALTER SESSION
每次连接时都运行 s 的需要?
或者,您可以在连接字符串上指定一个附加参数来打开相同的功能?
我在这篇文章中发现,从 ORACLE 10g 开始,有一种方法可以使特定的连接会话不区分大小写,而不需要任何疯狂的 SQL 函数,使用ALTER SESSION
.
有谁知道,在 11g 中,是否有一种方法可以使数据库在默认情况下对所有新的连接会话始终以这种模式运行,从而消除ALTER SESSION
每次连接时都运行 s 的需要?
或者,您可以在连接字符串上指定一个附加参数来打开相同的功能?
您可以使用该子句将文章中提到NLS_SORT
的NLS_COMP
参数设置为 Oracle 初始化文件中的值。alter system set <parameter> = <value>;
可以在此处找到有关使用 alter system 命令的信息。
这是关于正确使用参数的一个很好的链接。NLS_*
请注意,NLS_SORT 参数的某些设置可能/可能导致性能问题,即当它未设置为 BINARY 时。Oracle 文档状态:
将 NLS_SORT 设置为 BINARY 以外的任何值都会导致排序使用全表扫描,而不管优化器选择的路径如何。BINARY 是一个例外,因为索引是根据键的二进制顺序构建的。因此,当 NLS_SORT 设置为 BINARY 时,优化器可以使用索引来满足 ORDER BY 子句。如果 NLS_SORT 设置为任何语言排序,优化器必须在执行计划中包含全表扫描和全排序。
你当然可以!
让您友好的 DBA 设置这些参数:
ALTER SYSTEM SET NLS_COMP=LINGUISTIC SCOPE=SPFILE;
ALTER SYSTEM SET NLS_SORT=BINARY_AI SCOPE=SPFILE;
这摘自我关于如何使 Oracle 不区分大小写的短文
我尝试使用 alogon trigger
发出这些命令来获取不区分大小写的查询:
execute immediate 'alter session set NLS_SORT=BINARY_CI';
execute immediate 'alter session set NLS_COMP=LINGUISTIC';
虽然这确实给了我 CI,但它也给我带来了令人难以置信的糟糕性能问题。我们特别有一张表,如果没有这些设置,插入需要 2 毫秒。有了这些设置,插入需要 3秒。我已经通过多次创建和删除触发器来确认这一点。
我不知道在系统级别执行此操作,而不是在会话级别使用触发器,是否会有所作为。
我在 11g r2 中发现了与插入和 nls 相同的性能问题!对我来说幸运的是,性能影响还不够显着,需要更改应用程序。
如果您可以在 INSERT 中不使用 binary_ci,那么我会在插入之前和之后进行更改会话,因此您不必删除触发器