Вход | Регистрация
 

Как SQL читает данные по условию?

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

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

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

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

Скорее всего будешь получать или неопределенный тип или максимальный
   H A D G E H O G s
 
20 - 30.04.21 - 16:00
(18) нет, это другое
   H A D G E H O G s
 
21 - 30.04.21 - 16:01
(18) сжатые xml-ки ТТН-ок
   Вафель
 
22 - 30.04.21 - 16:03
Ну вряд ли скл зачитывает оба поля а потом одно отбрасывает
   Ivan_495
 
23 - 30.04.21 - 16:04
sql сначала выполнит условие
   H A D G E H O G s
 
24 - 30.04.21 - 16:05
(22) Инфа - 100%, можно не мерить?
   shuhard
 
25 - 30.04.21 - 16:14
(16)[Ладно, будем мерить] в пятницу, накануне майских, иных путей нет =)
   d_monah
 
26 - 30.04.21 - 16:16
(25) Одинесниги постоянно меряются(по пятницам особенно)
   shuhard
 
27 - 30.04.21 - 16:17
(26) ТС-у есть чем мериться, но ему нужен результат, а не процесс
   fisher
 
29 - 30.04.21 - 16:21
(0) Либо имеет, либо не имеет. Если имеет, но производительности хватает, то не имеет. А если не хватает - то разбиение будет произведено в рамках тикета.
Тонкая грань между грамотным кодом и преждевременной оптимизацией.
   Cyberhawk
 
31 - 30.04.21 - 18:31
Подпишусь
   youalex
 
32 - 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.
   youalex
 
35 - 01.05.21 - 01:08
CASE в SELECT, а это предпоследняя операция в запросе (последняя - ORDER)
C учетом (34) CASE будет выполняться уже по полученным данными из FROM WHERE
Я бы проголосовал за UNION - но в зависимости от объема данных.
   Lexusss
 
36 - 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) а в какой момент происходит передача значений?


Список тем форума
 
ВНИМАНИЕ! Если вы потеряли окно ввода сообщения, нажмите Ctrl-F5 или Ctrl-R или кнопку "Обновить" в браузере.
Тема не обновлялась длительное время, и была помечена как архивная. Добавление сообщений невозможно.
Но вы можете создать новую ветку и вам обязательно ответят!
Каждый час на Волшебном форуме бывает более 2000 человек.