我们有一个MS SQL Server 2005安装,它通过链接服务器连接连接到Oracle数据库。
许多 SELECT 语句正在通过一系列OPENQUERY()
命令执行。大多数这些语句中的 WHERE 子句都是针对VARCHAR
列的。
我听说如果 WHERE 子句区分大小写,它会对性能产生很大影响。
所以我的问题是,如何确保非二进制字符串 WHERE 子句以不区分大小写的方式执行以获得最佳性能?
我们有一个MS SQL Server 2005安装,它通过链接服务器连接连接到Oracle数据库。
许多 SELECT 语句正在通过一系列OPENQUERY()
命令执行。大多数这些语句中的 WHERE 子句都是针对VARCHAR
列的。
我听说如果 WHERE 子句区分大小写,它会对性能产生很大影响。
所以我的问题是,如何确保非二进制字符串 WHERE 子句以不区分大小写的方式执行以获得最佳性能?
其实是反过来的:
区分大小写...
WHERE column = :criteria
...将column
直接使用索引并表现良好。
不区分大小写通常需要这样的东西......
WHERE UPPER(column) = UPPER(:criteria)
...它不使用index oncolumn
并且性能很差(除非您小心并在 上创建功能索引UPPER(column)
)。
我不确定是否OPENQUERY()
有任何改变,但从纯粹的 Oracle 角度来看,区分大小写和不区分大小写的查询都可以提高性能,而不区分大小写的查询需要特别注意(功能索引)。
默认情况下,SQL Server 使用不区分大小写的排序规则,而 Oracle 默认情况下区分大小写。对于搜索,我们通常实现 Upper() 比较以确保用户有更好的搜索体验。
我听说如果 WHERE 子句区分大小写,它会对性能产生很大影响。
你从哪里听到的?对我来说听起来像是一个神话......相反,它会是另一种方式,即如果你使用类似的东西WHERE lower(field) = 'some str'
来实现不区分大小写的比较,那么性能会很糟糕。使用不区分大小写的排序规则可能会明显更快......
另一个需要考虑的重点是您的业务规则是否实际上允许不区分大小写的比较。
最后但并非最不重要的一点是,当你确实有性能问题时,你应该开始优化,而不是因为你听到了什么......
WHERE LOWER(field_name) = 'field_value'
为了WHERE clause
不区分大小写,您可以使用LOWER
orUPPER
来实现此目的。
select * from Table_Name
where lower(Column_Name) = lower('mY Any Value')
或者
select * from Table_Name
where UPPER(Column_Name) = UPPER('mY Any Value')