Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 о вреде case-а  [new]
case?
Guest
скажите пожалуйста, чем
case 
хуже любых других преобразований полей.
уже 2-ой человек требует от меня не использовать case-ы,
объясняя это тем, что "серверу case-ы вредны".
мне это абсолютно непонятно, вот хочу спросить знающих людей...
12 ноя 11, 00:20    [11585947]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
case?
уже 2-ой человек требует от меня не использовать case-ы,
объясняя это тем, что "серверу case-ы вредны"
Либо они дураки, либо Вы нам тут их слова переврали

молоток тоже вреден, если по голове
а если гвозди забивать, то полезен
12 ноя 11, 00:25    [11585957]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
case?
Guest
не перевираю ничего.
мое дело маленькое -- отчеты.
в первой конторе база жила на сервере терадата.
и если я для построения отчетов в универсе (ну там метаданные живут
и объекты -- обычно поля, которые надо кидать на форму)
использовала case,
приходила жалоба от проверятеля универса,
который выискивал там case-ы и требовал убрать их все,
чтоб бедная терадата не перетрудилась.
а логику типа заменить 1 на "да", а 0 на "нет"
прописывать уже в отчете IF ... THEN ...(там уже обрабатывает сервер ВО)

а второй прецедент вот сегодня был.
тоже собираю отчет, но уже данные живут в SQL Server-е.
и запрос надо просто тупо вставить в отчет Reporting Services.
у них там длинная таблица где в 1-ой колонке "линии" от 0 до 9,
во второй номер счета и потом куча всего.
им надо посчитать капитал, интересы и скидки для каждого счета (уникален)
по каждой линии(0..9).
они писали 10 одинаковых селектов с фильтрами
where linea = '0'...
, помещали во временные таблицы
и оттуда собирали отчет, где добавляют 30 колонок: капитал, интересы и скидки для каждой линии.
я переписала в 1 select где у меня 30 case-ов вида
sum (case linea when '0' then Interessi else 0)
ну так главная тетя забраковала,
говорит, у нас 12 000 000 записей, сервер загнется от 30 case-ов.
а сканировать 10 раз не загибается.
но может я и дура, конечно..
12 ноя 11, 00:43    [11586000]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
Вы ж тех.специалист, пользуйтесь

замените
select case when Field1 = 5 then 8 else 13 end as ComputedField1
  from MyTable
на
select isnull(t1.F, t2.F)
  from MyTable
 outer apply (select  8 as F where Field1  = 5) as t1
 outer apply (select 13 as F where Field1 != 5) as t2
(допустим Field1 не null)
или на что-то другое что фантазия позволит

а пока они поймут (если вообще поймут) что это такое - ищите новую работу
12 ноя 11, 01:13    [11586092]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Влияние чего-либо на производительность выясняют с помощью мониторинга, а не тыкая пальцем в небо. Ваши дяди и тети предоставили данные мониторинга? Думаю, что нет. Так что, скорее всего, они попросту некомпетентны.
12 ноя 11, 01:17    [11586112]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
case?
Guest
ясно. спасибо за советы.
с первого места и так ушла, а сегодняшняя тетя согласилась в понедельник проверить,
сколько времени обсчитывать будет. сегодня запретила запускать на всей базе (мне для тестов огрызок дали в 200 строк), сказала, все равно ответа сегодня не дождемся
12 ноя 11, 01:31    [11586170]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
ura
Member [заблокирован]

Откуда: Киев
Сообщений: 932
Посчитал для интереса примерное кол-во case-ов в проекте:
select sum((len(definition)-len(replace(definition,'case ','')))/5)
from sys.sql_modules m
	join sys.objects o on m.object_id=o.object_id
where objectproperty(o.object_id,'IsMsShipped')=0

----------------------------
7605

как сервер справляется, ума не приложу :)
12 ноя 11, 02:05    [11586285]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
GlebZ
Member

Откуда: USA
Сообщений: 286
ura
Посчитал для интереса примерное кол-во case-ов в проекте:
select sum((len(definition)-len(replace(definition,'case ','')))/5)
from sys.sql_modules m
	join sys.objects o on m.object_id=o.object_id
where objectproperty(o.object_id,'IsMsShipped')=0

----------------------------
7605

как сервер справляется, ума не приложу :)

Всего-то?
У нас 65451 :D
12 ноя 11, 02:23    [11586305]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
о каких-то "10 сканах&a
Guest
case?,

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

смысла в "убрать второстепенную работу с одного сервера на другой" вы не видите,
вместо разбора плана выполнения, оценки стоимости каждой операции в нем говорите о каких-то "10 сканах".
10 раз написанный SELECT - это и есть 10 сканов?
12 ноя 11, 09:42    [11586423]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
case?
они писали 10 одинаковых селектов с фильтрами
where linea = '0'...
, помещали во временные таблицы
и оттуда собирали отчет, где добавляют 30 колонок: капитал, интересы и скидки для каждой линии.
я переписала в 1 select где у меня 30 case-ов вида
sum (case linea when '0' then Interessi else 0)
ну так главная тетя забраковала,
говорит, у нас 12 000 000 записей, сервер загнется от 30 case-ов.
а сканировать 10 раз не загибается.
но может я и дура, конечно..


1. Несомненно, вы практически неотличимы от дуры.

2. Если 10 селектов с
where linea = '0'...
выбирают по 1-1000 записей по индексу linea, то это эффективннее чем сканирование таблицы
sum (case linea when '0' then Interessi else 0)
.

3. Если селекты с
where linea = '0'...
выбирают >50% записей таблицы, то
sum (case linea when '0' then Interessi else 0)
может быть и эффективнее.

4. Но мне почемуто кажется, что вероятнее п.2.
12 ноя 11, 11:56    [11586513]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
скорее п. 3, т.к.:
case?
длинная таблица где в 1-ой колонке "линии" от 0 до 9,
во второй номер счета и потом куча всего.
им надо посчитать капитал, интересы и скидки для каждого счета (уникален)
по каждой линии(0..9)
и уникальный индекс (линия, счет).
12 ноя 11, 14:39    [11586787]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
aleks2,

еще можно обратить внимание на
case?
"линии" от 0 до 9
и
case?
12 000 000 записей
,
так что селективность
aleks2
по индексу linea
(если он даже и есть) сами посчитаете, ога?
Так что кто тут
aleks2
практически неотличимы от дуры.
еще большой вопрос.
12 ноя 11, 15:12    [11586872]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
andrey odegov
Member

Откуда:
Сообщений: 473
case?, может посмотреть на indexed view?
13 ноя 11, 13:34    [11588746]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
SomewhereSomehow
aleks2,

еще можно обратить внимание на
case?
"линии" от 0 до 9
и
case?
12 000 000 записей
,
так что селективность
aleks2
по индексу linea
(если он даже и есть) сами посчитаете, ога?
Так что кто тут
aleks2
практически неотличимы от дуры.
еще большой вопрос.


Сам считай, умный ты наш.
Я, аднако, полагаю, что коли " главная тетя" дожидалась таки конца своих 10-и запросов, речь о сканировании 12 000 000 записей вести глупо.
13 ноя 11, 14:29    [11588818]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
aleks2
Я, аднако, полагаю, что коли " главная тетя" дожидалась таки конца своих 10-и запросов, речь о сканировании 12 000 000 записей вести глупо.
А мне чёта паказалось даже чуть ли не наоборот.

case?, вам нужно больше уверенности и ... немного более подробного описания.

Видел ровно наоборот, зафигачат лимон строк во времянку, а потом 100500 идентичных блоков с IF-ами, а в итоге выходит строк с сотню. Потом приходится это совершенно неподдерживаемое месиво говно-кода вычищать до одного маленького запросика, естественно работающего в тысячи раз быстрее.

Так что вы делаете всё правильно, код должен быть максимально простым и понятным. А вот скорость обеспечивается знанием всех принципов работы сиквела, понимаем всего процесса. А не какими-то там бездумными дибильными правилами "спасающих" от необходимости немного подумать.
13 ноя 11, 15:45    [11588918]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
Mnior
А мне чёта паказалось даже чуть ли не наоборот.

Эээээ, дарагой, 10 (десять) селектов с
where linea = '0'...
Вопще НИ ГРАММА не просрут
sum (case linea when '0' then Interessi else 0)
если у "главной тети" кластерный индекс по linea. И идет сканирование действительно всей таблицы.

Mnior
Так что вы делаете всё правильно, код должен быть максимально простым и понятным.

Я, канешно, не показатель, но 30-ть CASE-ов мне не кажутся чрезмерно понятным вариантом.

Mnior
необходимости немного подумать.

Ну я тоже за подумать...
13 ноя 11, 16:29    [11588985]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
всё на linq2sql
Guest
aleks2,

на хабре одноклассники хвастались своими "best-practices": даже джойнов не пишут, не то что кейсы.
всё на linq2sql.
13 ноя 11, 16:58    [11589037]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
всё на linq2sql
aleks2,

на хабре одноклассники хвастались своими "best-practices": даже джойнов не пишут, не то что кейсы.
всё на linq2sql.


Типо, ишо адын поклонник CASE-ов?
Нешто, дарагуля, ты всерьез полагаешь, что вся правда, тьху... крутизна в JOIN-ах?
Дык тебя можна тока пожалеть...
13 ноя 11, 17:12    [11589046]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22550
всё на linq2sql
всё на linq2sql.
а Вы их попросите написать на linq2sql рекурсивный запрос
13 ноя 11, 17:14    [11589050]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
всё на linq2sql
Guest
aleks2
Типо, ишо адын поклонник CASE-ов?
Нешто, дарагуля, ты всерьез полагаешь, что вся правда, тьху... крутизна в JOIN-ах?
Дык тебя можна тока пожалеть...

что за ахинея?
ткнули носом в неудачную попытку поумничать 11586872 и словестные понос разразился?
13 ноя 11, 18:28    [11589216]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
всё на linq2sql
aleks2
Типо, ишо адын поклонник CASE-ов?
Нешто, дарагуля, ты всерьез полагаешь, что вся правда, тьху... крутизна в JOIN-ах?
Дык тебя можна тока пожалеть...

что за ахинея?
ткнули носом в неудачную попытку поумничать 11586872 и словестные понос разразился?

Дарагуля, ты могешь чего-нибудь возразить ПО СУЩЕСТВУ?
Нет?
Тады молчи - сойдешь за умного.
13 ноя 11, 18:32    [11589232]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Mnior,
+1

aleks2,
Вы почитайте внимательнее, что "10 селектов вставлялись во временные таблицы", а про то как там вообще нагружена и размещена tempdb мы ни сном, ни духом. Если все ок, то аргументов в пользу 10 запросов как-то не добавляется, а вот если нет, то добавляются аргументы против.
Насчет 30 кейсов, может и не сильно понятно, но сильно непонятного тоже ничего нет. Может тут вообще дело в неудачной архитектуре, но вот что точно не айс, так это "они писали 10 одинаковых селектов", потому как если потребуется поменять, например, условие, придется менять в 10 разных местах.
Маловато как-то исходных данных для столь категоричных суждений, которые вы высказали.
13 ноя 11, 19:55    [11589556]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
aleks2
Guest
SomewhereSomehow
Mnior,
+1

aleks2,
Вы почитайте внимательнее, что "10 селектов вставлялись во временные таблицы", а про то как там вообще нагружена и размещена tempdb мы ни сном, ни духом. Если все ок, то аргументов в пользу 10 запросов как-то не добавляется, а вот если нет, то добавляются аргументы против.
Насчет 30 кейсов, может и не сильно понятно, но сильно непонятного тоже ничего нет. Может тут вообще дело в неудачной архитектуре, но вот что точно не айс, так это "они писали 10 одинаковых селектов", потому как если потребуется поменять, например, условие, придется менять в 10 разных местах.
Маловато как-то исходных данных для столь категоричных суждений, которые вы высказали.


Относительно сканирования таблицы и отсутствия даже потенциального выигрыша я уже писал.
Ну а чо лучше - менять 10 селектов или 30 case-ов... каждый решает сам.
14 ноя 11, 05:21    [11590902]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
Кудряшка
Member

Откуда: Сидней
Сообщений: 2219
всё на linq2sql
aleks2,

на хабре одноклассники хвастались своими "best-practices": даже джойнов не пишут
всё на linq2sql.


очень оригинально:)
14 ноя 11, 09:03    [11591041]     Ответить | Цитировать Сообщить модератору
 Re: о вреде case-а  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Кудряшка,

Я тут прочитал в одном издании, что Facebook работает на MySQL, который используется просто как хранилище. А все запросы идут, как запросы ключ-значение, никакого тебе классического SQL. Не знаю, насколько этой инфе можно верить, но если это правда, то, учитывая масштаб фейсбука - впечатляет...
сорри за офтоп.
14 ноя 11, 09:33    [11591114]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить