|
|
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
Привет всем У меня возникла проблема с производительностью UDF. В следующум простейшем примере фукция принимает константные аргументы, и по идее, должна вызываться 1 раз. Однако, время выполнения запросов говорит об обратном. Смотрел планы выполнения - идентичны. В чем дело? Сколько раз вызывается UDF? Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 18:24:59 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
прошу прощения, код должен выглядеть так: Код: plaintext 1. 2. 3. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 18:35:12 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
У меня планы выполнения и стоимости запросов АБСОЛЮТНО одинаковы. SQL2000EE SP2, Win2000 AdvServ SP2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 18:56:57 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
2 Glory: у меня тоже, но время выполнения различается в разы. К тому же, время сильно зависит от величины выборки. SQL2000EE+SP2, Win2000AS+SP2 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 19:02:02 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
вот так видно все невооруженным глазом. Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. мои результаты: 810 180 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 19:16:27 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
Да планы запросов одинаковые. Но если посмотреть в Profiler будет видно, что функция dbo.fn_tmp() выполняется для каждой строки результирующего набора. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 19:29:02 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
Guest прав - пользовательская функция вызывается для каждой строки, поэтому сранивать ее с GETDATE(), которая вычисляется точно один раз некорректно. Посранивайте лучше с ну хотя бы с master.dbo.fn_varbintohexsubstring() ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 19:50:47 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
т.е. это свойство скалярной UDF. и вычислить значение 1 раз на запрос никак нельзя? тогда совсем непонятно, зачем запрещать вызов не-deterministic функций из UDF. странно, ничего подобного не нашел в боле и интернете везде грабли :( ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 20:03:34 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
чудеса! Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. результат: 70 70 в where мы вычисляемся 1 раз! оччень логично... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 03.07.2002, 20:24:51 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
ну всё правильно - теперь это же работает как фильтр ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2002, 10:18:01 |
|
||
|
производительность UDF
|
|||
|---|---|---|---|
|
#18+
в последнем примере я ошибся, профайлер показал вызов функции для каждой строки sysobjects s1. Значит, UDF вызывается столько раз, сколько сервер вычисляет все выражение, и это не зависит от аргументов функции. для примера: Код: plaintext 1. 2. 3. 4. 5. 6. 7. 8. 9. что интересно, следующий пример тоже дает несколько обращений к функции: Код: plaintext 1. 2. 3. 4. 5. только так удалось добиться одного вызова с помощью явно заданного плана запроса: Код: plaintext 1. 2. 3. 4. 5. мне одному кажется все это ненормальным??? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 04.07.2002, 13:24:26 |
|
||
|
|

start [/forum/topic.php?fid=46&msg=32035147&tid=1822011]: |
0ms |
get settings: |
8ms |
get forum list: |
17ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
76ms |
get topic data: |
9ms |
get forum data: |
2ms |
get page messages: |
45ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 375ms |

| 0 / 0 |
