我们目前正在研究对我们的SQL服务器的负载并寻找减轻它的方法。在我的高等教育期间,我总是被告知,从性能的角度来看,让SQL Server完成工作会更便宜。但这是真的吗?
以下是一个例子:
SELECT ord_no FROM oelinhst_sql
这将在14秒内返回783119条记录。该字段为char(8)
,但我们的所有订单号都是六位数字,因此每个订单号都有两个空白字符。我们通常修剪这个字段,所以我运行了以下测试:
SELECT LTRIM(ord_no) FROM oelinhst_sql
这在13秒内返回了783119条记录。我还试了一次测试:
SELECT LTRIM(RTRIM(ord_no)) FROM oelinhst_sql
右边没有任何东西需要修剪,但我试图看看是否有任何开销只是调用该功能,但它仍然在13秒后返回。
我的经理正在讨论将字符串修剪等问题从SQL转移到源代码中,但测试结果表明不然。我的经理也说他听说使用SQL函数意味着不会使用索引。对此有任何道理吗?
答案 0 :(得分:3)
仅优化您已证明是系统中最慢的部分的代码。到目前为止,您的数据表明SQL字符串操作函数根本不会影响性能。把这些数据交给你的经理。
如果在WHERE子句中使用函数或类型转换,则通常会阻止SQL Server使用索引。这不适用于使用函数转换返回的列。
答案 1 :(得分:1)
通常是用户定义的函数(UDF)在SQL性能方面得到了不好的说法,可能是您获得的建议的来源。
原因是你可以构建一些非常多毛的函数,这会导致巨大的开销和指数效应。
正如您在rtrim和ltrim中发现的那样,这并不是一个在sql端停止使用所有函数的理由。
答案 2 :(得分:0)
这在某种程度上取决于所有内容:“像字符串修剪之类的东西”,但是,至少对于字符串修剪,我绝对会让数据库这样做(网络流量也会减少)。至于索引,如果你的where子句只是使用列本身(而不是列的函数),它们仍将被使用。通过在您要检索的实际列上使用函数(仅根据您选择行的方式),不会影响索引的使用。
您可能需要查看有关性能改进建议的信息:http://net.tutsplus.com/tutorials/other/top-20-mysql-best-practices/
答案 3 :(得分:0)
正如我在评论中所说,减少每个查询读取的数据,您将获得速度提升。
你说:
我们的订单号码长度为六位数 所以每个都有两个空白字符 领先的
让我觉得你在一个字符串中存储数字,如果是这样,你为什么不使用数字数据类型?需要6位数字的最小数字类型是INT(我假设是SQL Server),并且已经为每个订单号保存了4个字节,超过了你提到的行数,从磁盘读取和发送的数据要少得多通过网络。
在寻求处理数据库之外的数据之前,全面优化数据库;它是数据库服务器的目的,提供数据。
答案 4 :(得分:0)
正如您所发现的那样,衡量通常是值得的,但我认为您的经理可能指的是这样的事情。
这通常要快得多
SELECT SomeFields FROM oelinhst_sql
WHERE
datetimeField > '1/1/2011'
and
datetimeField < '2/1/2011'
比这个
SELECT SomeFields FROM oelinhst_sql
WHERE
Month(datetimeField) = 1
and
year(datetimeField) = 2011
即使返回的行是相同的