Имя: Пароль:
1C
 
Как SQL читает данные по условию?
0 H A D G E H O G s
 
30.04.21
15:39
Дня доброго.
Лень делать замеры, но, зная аудиторию, придется.

Насколько оптимально SQL делает такую конструкцию?

ВЫБОР КОГДА Таблица.Условие=ИСТИНА ТОГДА
Таблица.ОченьМалоеПоле
Иначе
Таблица.ОченьБольшоеПоле
КОНЕЦ

Смысл в том, что почти вся таблица заполнения полями с Условием=ИСТИНА, а ОченьБольшоеПоле - это nvarchar (поле вне таблицы, в отдельном потоке)

Имеет ли смысл разбивать на Объединение 2-х запросов или SQL достаточно умен, чтобы не лезть за ОченьБольшимПолем?
1 ДенисЧ
 
30.04.21
15:41
А план запроса что говорит?
2 Волшебник
 
30.04.21
15:41
>> поле вне таблицы, в отдельном потоке
чего?
3 H A D G E H O G s
 
30.04.21
15:43
(2) nvarchar же. Строка переменной длины, не может храниться в таблице, так как переменная длина приводила бы к перестроению таблицы при каждом изменении
4 H A D G E H O G s
 
30.04.21
15:44
(1) План запроса не детализируется до колонок, только до строк
5 Ненавижу 1С
 
гуру
30.04.21
15:46
(3) прямо интересно стало как там в MS SQL, но всегда полагал что при фиксированном N varchar(N) тупо выделяет по максимуму место плюс метка завершения строки
6 mikecool
 
30.04.21
15:49
"Лень делать замеры, но, зная аудиторию, придется. " ветку можно закрывать, автор с порога облил всех...
7 программистище
 
30.04.21
15:50
на работе работы мало?
8 vde69
 
30.04.21
15:51
(3) не претендую на 100% правду, но вроде было так

в основной таблице выделяется 2 колонки
1 - до какого-то разумного размера (например 1000 символов)
2 - идентификатор на таблицу блобов

если фактическая страка влезает в 1000 символов она хранится в основной таблице, если нет то в блобах
9 Ivan_495
 
30.04.21
15:51
индекс по полю с условием есть?
10 H A D G E H O G s
 
30.04.21
15:51
(5) Только если меньше 4000 символов (8000 байт). Все, что выше - уйдет в отдельный поток.
11 polosov
 
30.04.21
15:53
Условие достаточно простое, чтобы оптимизатор его понял, но я за объединение.
12 H A D G E H O G s
 
30.04.21
15:53
(8) 4000 символов для 2-х байтный строк
13 vde69
 
30.04.21
15:54
(0)
по сабжу - главная проблемма такого кода это кривая статистика и неопределенный план запроса, то есть будет "плавать" и скорость и результат в зависимости от последних выборок
14 H A D G E H O G s
 
30.04.21
15:55
(13) Статистика тут не на что не влияет. Мы уже в строке данных. Вопрос - насколько умен SQL, чтобы не читать строку из BLOB, если ему по условию не надо
15 polosov
 
30.04.21
15:56
(14) Да никто не скажет тебе.
16 H A D G E H O G s
 
30.04.21
15:56
Ладно, будем мерить
17 mikecool
 
30.04.21
15:58
(14) имхо, он так же умен, как и принятое сравнение по И
если первое отрабатывает дальше не идет
18 Garykom
 
гуру
30.04.21
15:58
(0) >ОченьБольшоеПоле - это nvarchar

там китайщина с марками?
19 vde69
 
30.04.21
15:59
(14) результат запроса это динамическая вещь, по этому размер фактических данных будет разный для каждой выборки, но вот тип поля результата тут будет что-то типа составного поля, на сколько я понимаю в самом SQL будет все нормально, но вот в клиенте который будет получать эти данные будет не очень...

Скорее всего будешь получать или неопределенный тип или максимальный
20 H A D G E H O G s
 
30.04.21
16:00
(18) нет, это другое
21 H A D G E H O G s
 
30.04.21
16:01
(18) сжатые xml-ки ТТН-ок
22 Вафель
 
30.04.21
16:03
Ну вряд ли скл зачитывает оба поля а потом одно отбрасывает
23 Ivan_495
 
30.04.21
16:04
sql сначала выполнит условие
24 H A D G E H O G s
 
30.04.21
16:05
(22) Инфа - 100%, можно не мерить?
25 shuhard
 
30.04.21
16:14
(16)[Ладно, будем мерить] в пятницу, накануне майских, иных путей нет =)
26 d_monah
 
30.04.21
16:16
(25) Одинесниги постоянно меряются(по пятницам особенно)
27 shuhard
 
30.04.21
16:17
(26) ТС-у есть чем мериться, но ему нужен результат, а не процесс
29 fisher
 
30.04.21
16:21
(0) Либо имеет, либо не имеет. Если имеет, но производительности хватает, то не имеет. А если не хватает - то разбиение будет произведено в рамках тикета.
Тонкая грань между грамотным кодом и преждевременной оптимизацией.
31 Cyberhawk
 
30.04.21
18:31
Подпишусь
32 youalex
 
30.04.21
21:01
Интересно, но не помешала бы голосовалка, пока вопрос остается открытым
33 Ёпрст
 
30.04.21
22:29
(0) в case же простая логика, до первого истинного операнда. Проверить жешь можно и без поля, тупо в else поставить 1/0.
34 ДедМорроз
 
30.04.21
23:38
Если поле BLOB,то оно читается отдельно.
Если нет,то в выборку читается страница,содержащая запись,а потом уже из этой страницы делается выборка,просто для BLOB поля в этой выборке будет BLOB id.
35 youalex
 
01.05.21
01:08
CASE в SELECT, а это предпоследняя операция в запросе (последняя - ORDER)
C учетом (34) CASE будет выполняться уже по полученным данными из FROM WHERE
Я бы проголосовал за UNION - но в зависимости от объема данных.
36 Lexusss
 
01.05.21
09:11
Скорее всего считает все, а затем сделает расчёт CASE.
Так что я за union,если считываемых страниц для скана таблицы будет значимо меньше, чем страниц для blob поля. Не забываем, что при union серверу надо ещё merge union сделать
37 ДедМорроз
 
03.05.21
00:28
Если поле BLOB,то до передачи значения клиенту вместо значения поля будет записано BLOB-ID,а если это обычное поле,то в плане запроса будут перечислены поля,которые нужно выбрать,и запись сразу будет выбираться со всеми полями.
Если будет объединение с условием,то,если условие позволит выбирать по индексу,а не по самой записи,то поможет,если же по самой записи,то точно также,сначала считается вся запись,а потом будет выполнена проверка условия.
38 Вафель
 
03.05.21
08:44
(37) а в какой момент происходит передача значений?