|
Как 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) а в какой момент происходит передача значений?
|
Форум | Правила | Описание | Объявления | Секции | Поиск | Книга знаний | Вики-миста |