在SQL Server中使用什么更好:sqrt或pow?

时间:2011-02-12 21:07:50

标签: sql-server sql-server-2008

在SQL Server中使用效率更高:pow(x,1/2)sqrt(x)?哪一个成本更低,哪一个更快?

4 个答案:

答案 0 :(得分:14)

数学上: SQRT只是POWER的一种特殊形式,使用1/2作为指数

但在SQL Server中,实现方式不同。 POWER能够将任何浮点作为第二个参数,因此检测特殊情况并针对每种特殊情况进行不同的优化(p2 = 1 => identity和p2 = 0.5 => sqrt)制作电力比它需要的要慢。

如果您需要平方根,请使用SQRT。 POWER 明显慢了约15%

注意:请确保您使用POWER而不是POW并使用0.5 1/2(字面意思),因为1/2 = 0

比较测试(以及SQL Server 2005的时序):

declare @dummy float -- to hold the result without generating resultset
declare @t1 datetime, @t2 datetime, @t3 datetime
declare @a float
set @a = rand()*1000000
declare @i int

select @t1 = getdate()
set @i = 0
while @i < 10000000
begin
    select @dummy= sqrt(@a)
    set @i = @i + 1
end

select @t2 = getdate()

set @i = 0
while @i < 10000000
begin
    select @dummy= power(@a, 0.5)
    set @i = @i + 1
end
select @t3 = getdate()

select
Time_SQRT  = datediff(ms, @t1, @t2),
Time_POWER = datediff(ms, @t2, @t3)

/*
Time_SQRT   Time_POWER
----------- -----------
14540       16430
14333       17053
14073       16493
*/

答案 1 :(得分:2)

我希望看到SQRT内部使用POWER的源代码。 SQRT通常使用牛顿迭代法计算;我认为POWER更有可能使用其他东西(如自然日志和指数)。

我同意这一评论说它不太重要。充其量,这是一种微观优化,会被关于规范化,索引,聚类,编写不良的查询等的糟糕决策所淹没。

答案 2 :(得分:0)

如果你想要一个平方根,我建议总是使用SQRT(x),因为POWER(x,y)取决于输入值的精度:

DECLARE @Foo DECIMAL(18,6) = 12
SELECT POWER(12, 0.5), POWER(12.0,0.5), POWER(@Foo, 0.5), SQRT(12)
=      3               3.5              3.464102          3.464101615...

(SQL Server 2008&amp; 2008 R2)

答案 3 :(得分:0)

SQL SQRT函数用于查找任何数字的平方根。您可以使用SELECT语句查找任何数字的平方根,如下所示:

 SQL>  select SQRT(16);
       +----------+
       | SQRT(16) |
       +----------+
       | 4.000000 |
       +----------+

您在此处看到浮点值,因为内部SQL将在浮点数据类型中操作平方根。

您也可以使用SQRT函数查找各种记录的平方根。要更详细地了解SQRT函数,请考虑一个具有以下记录的Table_employee表:

   SQL> SELECT * FROM Table_employee;
   +------+------+------------+--------------------+
   | id   | name | work_date  | daily_typing_pages |
   +------+------+------------+--------------------+
   |    1 | Ravi | 2007-01-24 |                250 |
   |    2 | Greg | 2007-05-27 |                220 |
   |    3 | Neha | 2007-05-06 |                170 |
   |    3 | Neha | 2007-04-06 |                100 |
   |    4 | Raj  | 2007-04-06 |                220 |
   |    5 | Indi | 2007-06-06 |                300 |
   |    5 | Indi | 2007-02-06 |                350 |
   +------+------+------------+--------------------+

现在假设你想根据上表计算所有dialy_typing_pages的平方根,那么你可以使用以下命令来实现:

    SQL> SELECT name, SQRT(daily_typing_pages)
      -> FROM Table_employee;
    +------+--------------------------+
    | name | SQRT(daily_typing_pages) |
    +------+--------------------------+
    | Ravi |                15.811388 |
    | Greg |                14.832397 |
    | Neha |                13.038405 |
    | Neha |                10.000000 |
    | Raj  |                14.832397 |
    | Indi |                17.320508 |
    | Indi |                18.708287 |
    +------+--------------------------+

SQL中的POWER函数示例:

     SQL>  select POWER(2,3);
     +------------+
     | POWER(2,3) |
     +------------+
     | 8.000000   |
     +------------+

     SQL> select POWER(5,4);
     +------------+
     | POWER(5,4) |
     +------------+
     | 625.0000   |
     +------------+