Что лучше использовать в SQL Server: sqrt или pow? - PullRequest
7 голосов
/ 13 февраля 2011

Что эффективнее использовать в SQL Server: pow(x,1/2) или sqrt(x)? Какой из них стоит дешевле, а какой быстрее?

Ответы [ 4 ]

14 голосов
/ 13 февраля 2011

Математически: SQRT - это просто специализированная форма POWER, использующая 1/2 в качестве показателя степени

Но в SQL Server реализация отличается.POWER может принимать любую плавающую точку в качестве второго аргумента, поэтому обнаружение особых случаев и оптимизация по-разному для каждого специального случая (p2 = 1 => identity и p2 = 0.5 => sqrt) сделает замедлением POWER, чемдолжно быть.

Если вам нужен квадратный корень, используйте 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
*/
2 голосов
/ 13 февраля 2011

Я хотел бы увидеть исходный код, который говорит, что SQRT использует POWER для внутреннего использования.SQRT обычно рассчитывается с использованием итерационного метода Ньютона;Я думал, что POWER будет более вероятно использовать что-то еще (например, натуральный логарифм и экспоненциальный).

Я согласен с комментарием, в котором говорится, что это вряд ли имеет значение.В лучшем случае это такая микрооптимизация, которая будет подавлена ​​плохими решениями о нормализации, индексации, кластеризации, плохо написанных запросах и т. Д.

0 голосов
/ 10 марта 2015

Функция 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 |
    +------+--------------------------+

Пример функции POWER в SQL:

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

     SQL> select POWER(5,4);
     +------------+
     | POWER(5,4) |
     +------------+
     | 625.0000   |
     +------------+
0 голосов
/ 22 мая 2014

Если вам нужен квадратный корень, я бы рекомендовал всегда использовать 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 Server2008 и 2008 R2)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...