PR1ST Ответов: 2

Медленно ли заполняется поле проверки isnull?


У меня есть TSQL, запрос в SQL Server с помощью ISNULL для преобразования нулевого поля в левое значение поля или 0.
Это заставляет производительность замедляться?

Select
    R1=ISNULL(R1,0),
    R2=ISNULL(R2,ISNULL(R1,0)),
    R3=ISNULL(R3,ISNULL(R2,ISNULL(R1,0))),
    R4=ISNULL(R4,ISNULL(R3,ISNULL(R2,ISNULL(R1,0)))),
    R5=ISNULL(R5,ISNULL(R4,ISNULL(R3,ISNULL(R2,ISNULL(R1,0))))),
    R6=ISNULL(R6,ISNULL(R5,ISNULL(R4,ISNULL(R3,ISNULL(R2,ISNULL(R1,0))))))
From R


Что я уже пробовал:

любые рекомендации или рекомендации, пожалуйста.

2 Ответов

Рейтинг:
9

CHill60

Вы можете найти что-то вроде этого. маленький быстрее

Select
    R1=ISNULL(R1,0),
    R2=COALESCE(R2,R1,0),
    R3=COALESCE(R3,R2,R1,0),
    R4=COALESCE(R4,R3,R2,R1,0),
    R5=COALESCE(R5,R4,R3,R2,R1,0),
    R6=COALESCE(R6,R5,R4,R3,R2,R1,0)
From R
Видеть COALESCE (Transact-SQL) | Microsoft Docs[^]
Однако в целом я согласен с Дейвом Кресковяком - ваш дизайн базы данных и / или ввод данных требуют некоторого внимания


Рейтинг:
1

Dave Kreskowiak

Что вы обнаружили, когда запустили SQL Profiler по этому вопросу и сравнили результаты с другими запросами, где вы не делаете 21 вызов функции в строке?


PR1ST

Это небольшой тест для сравнения: я использую более 400 функций ISNULL в каждой строке.
Результат в профиле SQL:
Чашка читает пишет продолжительность
С ИСНУЛЛОМ 78 1752 3 77
Другие 3841 63 15 73

Интересно, функция isnull(а, функция isnull(B,С)) будет делать только один раз, если a не равно null или SQL будет обрабатывать все функции isnull функции?

Dave Kreskowiak

Вы должны запустить его несколько раз и по набору данных, сопоставимому с тем, что вы собираетесь получить в производстве. Но, исходя из этого, да, это будет медленнее. Четыреста звонков ИСНУЛЛУ!?!?! Ты с ума сошел?

Если вы думаете, что вам нужно сделать что-то подобное, вам действительно нужно взглянуть на дизайн вашей базы данных и, возможно, массировать данные, когда они записываются в базу данных, чтобы устранить необходимость делать так много обработки во время выбора.

PR1ST

Если всего в самом процессе должно быть около 1000 ISNULL использовать каждую отдельную строку.

This is the problem
R1    R2   R3
---------------
100    
      200
            300
---------------
100 | 200 | 300
What we want 
R1    R2   R3
---------------
100 | 100 | 100
      200 | 200
            300
---------------
100 | 300 | 600