SQL函数与代码函数的性能

时间:2011-06-17 20:04:31

标签: sql performance string

我们目前正在研究对我们的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函数意味着不会使用索引。对此有任何道理吗?

5 个答案:

答案 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

即使返回的行是相同的