|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Прошу прощения за корявое название темы. Продолжаю оптимизацию запросов. FB3. Есть запросы типа: Код: sql 1. 2. 3.
и Код: sql 1. 2. 3.
pid - поле ключевое, 100 - это некий параметр, на самом деле переменная. Чтобы не писать два разных запроса, кто-то предложил народу вариант: Код: sql 1. 2. 3.
Оказывается, индекс по pid при таком запросе не используется. Как можно изменить запрос, чтобы он пошёл по индексу. Или может быть ссылку на решение (наверняка это всё было, но я не нашёл). Да, попробовал сделать в конструкции where условие or. Результат сильно лучше, но хуже, чем отдельные запросы, и как-то не красиво. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:11 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Код: sql 1.
В Fib-aх помню были умные параметры, и сами адаптировали SQL на = или is null в зависимости от значения параметра. Через coalesce ты "меняешь" значение поля, что неправильно. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:18 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
сорри, так: where a.pid = :pid or :pid is null ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:19 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, во-первых предложенное народом совсем не эквивалентно. Во-вторых если pid действительно ключевое поле, то зачем вообще условие where a.pid is null? Это же будет пустая выборка. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:22 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, может быть тебе просто подойдёт Код: sql 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:35 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Dorin Marcoci, Я в посте написал, что or работает, но не до конца эффективно. Грубо говоря, делается два прохода. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:50 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, нет там двух проходов. Там что-то типа условного плана, т.е. составляется как бы две версии плана, по какой ветке пойдёт выполнение определяется в зависимости от значения параметра. Проблемы там конечно есть, но только на более сложных случаях. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:55 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Симонов Денис, Поле ключевое, но это не первичный ключ. Null'ы есть. И как раз их надо учесть. Distinct, к сожалению, этого не делает. Как пример - справочник с деревянной структурой. "Верхний" уровень имеет pid=null. Остальные уровни имеют pid не null, а конкретное значение. Но запрос по вытаскиванию ветки один. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:55 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, ты бы сначала озвучил что хочешь, а то не очень ясно. То ли получить значения в которых a.pid is null, то ли получить все строки, если параметр равен null. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:57 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, is not distinct from как раз таки сравнивает с учётом null и при этом использует индекс ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 11:59 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, авторчто or работает, но не до конца эффективно А что думаешь что функция coalesce() будет эффективнее? На "or" еще есть надежда пологатся па оптимайзер. Самый верный подход когда хочется запись по id/pid или все если не указан парам, то задать заранее правильный SQL серверу. Всякие FB либы имеют типа Conditions.Add('pid = :pid'), или самому добавить в текст запроса. Один if до запроса и все. Хотя, супер оптимайзер мог бы вычислить (:pid is null) как true константу в начале, или может ошибаюсь. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:00 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXIDistinct, к сожалению, этого не делает. Делает. Или ты что-то делаешь неправильно. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:06 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Dorin Marcociи сами адаптировали SQL на = или is null в зависимости от значения параметра. сейчас FB это и сам умеет - WHERE x IS NOT DISTICNT FROM y осталось ещё запилить WHERE x in (10,20, NULL, 30, 40) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:28 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Спасибо всё-таки за наводку. Разобрался. Если :pid - null, то всё работает. А если :pid=0, то вариант такой: Код: sql 1. 2. 3.
В хранимках, естественно, используется null, а из клиента лезет 0. Почитаю про "is distinct from". Это в трёшке появилось? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:29 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Ariochосталось ещё запилить WHERE x in (10,20, NULL, 30, 40) с этим в сад ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:29 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, нет, вроде ещё в 2.1 или даже в 2.0 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:30 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, Код: sql 1.
заменить на Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:34 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXIа из клиента лезет 0. С багами приложения - к его создателю. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:35 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Даже до появления DISTINCT можно было делать Код: sql 1. 2. 3. 4. 5. 6. 7. 8.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:41 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Симонов ДенисAriochосталось ещё запилить WHERE x in (10,20, NULL, 30, 40) с этим в сад чем это отличается? cейчас он раскладывается на =/OR/=/OR/= .... будет раскладывается на not distinct/OR/not distinct/OR/not distinct .... ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 12:42 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXI, если имеется в виду, что при ":pid is null" (т.е. значение параметра не назначено или сброшено) должны выбираться все строки, то можно так: Код: plsql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 13:57 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Dimitry Sibiryakov, Ну не совсем баг (в запрос тупо подставляется число, но, наверно, можно будет поработать с этим). За nullif отдельное спасибо. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 15:21 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXIНу не совсем баг (в запрос тупо подставляется число Если в запрос конкретно подставляется ноль и при этом ожидается, что выберутся записи с NULL, то это либо баг, либо разработчику пора отрывать руки по самую задницу. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 15:53 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
А вдруг это ошибка молодости? Я так грешил в свое время. Люди до сих пор пользуются. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:03 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
Hello, Alexander A. Sak! You wrote on 15 сентября 2016 г. 16:06:16: Alexander A. Sak> Я так грешил в свое время. > Люди до сих пор пользуются.Покайся, Иваныч! Тебе скидка выйдет! (с) Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:08 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
KreatorXXIЧтобы не писать два разных запроса, кто-то предложил народу вариант: union all еще не предлагали? ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:35 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
wadmanunion all еще не предлагали?Это слишком просто, а мы лёгких путей не ищем. :) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 16:40 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 17:02 |
|
Использование Coalesce для учёта Null
|
|||
---|---|---|---|
#18+
... |
|||
:
Нравится:
Не нравится:
|
|||
15.09.2016, 17:27 |
|
|
start [/forum/topic.php?all=1&fid=40&tid=1561966]: |
0ms |
get settings: |
10ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
53ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
62ms |
get tp. blocked users: |
1ms |
others: | 265ms |
total: | 428ms |
0 / 0 |