同事和我正在尝试微调一个非常简单的查询。他说他曾在某处读过使用较低的vs lcase会影响服务器的性能,而且一种方法比另一种更有效但我们找不到文章,我想我会问你的想法是什么。我们是否应该花时间去其他地方调整性能?
Coldfusion 8 Enterprise MS SQL Server 2000 记录集:500,000多条记录
原始查询:
select last_name lname
from phone
where uid = <cfqueryparam value="#attributes.email#" cfsqltype="cf_sql_varchar" maxlength="50">
选项A
select last_name lname
from phone
where lower(uid) = <cfqueryparam value="#attributes.email#" cfsqltype="cf_sql_varchar" maxlength="50">
选项B
select last_name lname
from phone
where uid = <cfqueryparam value="#lcase(attributes.email)#" cfsqltype="cf_sql_varchar" maxlength="50">
选项C
select last_name lname
from phone
where uid = lower(<cfqueryparam value="#attributes.email#" cfsqltype="cf_sql_varchar" maxlength="50">)
数据库已编制索引,但不包含但不包含约500,000条记录。即使这是一个简单的查询,我们将循环这约150次,所以我们可以做的任何事情来削减一两秒都会有所帮助。
答案 0 :(得分:1)
在索引列上使用lower
将导致MS SQL不使用您的索引。这可能会导致您的尺寸表中出现重大性能损失。您应该确保插入时UID始终为小写,或者可以尝试:lower function on indexed column
答案 1 :(得分:0)
在您的情况下,您正在搜索电子邮件字段,该字段大部分时间都是小写字符而不是大写字母。因此,转换为小写可以(测试会告诉你)加快速度。
要将此应用于您的查询,您必须将字段和电子邮件变量转换为小写(以使它们具有可比性):
select last_name lname
from phone
where lower(uid) = <cfqueryparam value="#lcase(attributes.email)#"
cfsqltype="cf_sql_varchar"
maxlength="50">
(在#attributes.email#
标记内转换cfqueryparam
更好,因为在将查询发送到sql-server之前只会执行一次)
答案 2 :(得分:0)
完成所有这些LCase / LOWER可能没有意义:
SQL Server Text Matching Is Case INSENSITIVE
How to perform case sensitive searches in SQL Server?:
默认的SQL Server安装不区分大小写,这意味着SQL Server不会区分大写和小写字母/字母。