在SQL Server中使用效率更高:pow(x,1/2)
或sqrt(x)
?哪一个成本更低,哪一个更快?
答案 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
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 |
+------------+