Выбрать не пустые строки. HELP!

Запросы, планы, оптимизация запросов, ...

Модераторы: kdv, CyberMax

Ответить
Эстет
Сообщения: 15
Зарегистрирован: 17 янв 2005, 13:36

Выбрать не пустые строки. HELP!

Сообщение Эстет » 13 фев 2006, 21:12

В общем есть табличька в ней varchar(30) поле RETURN_DOCS.
На всем протяжении жизни таблички в неё добавляют редактируют и удаляют записи ... при этом RETURN_DOCS порой бывает NULL после добавления строки, но без занесения данных в RETURN_DOCS, ... также бывает просто пустой если данные в RETURN_DOCS потёрли ... ну соответствено забит буквенными данными. По RETURN_DOCS построенн индекс.

Требуется выбрать не пустые строки из всей таблицы.
У меня идея только делать так:
SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE
DOSTAVKA.RETURN_DOCS <> ''

но FB-1.5.3 строит план: PLAN (DOSTAVKA NATURAL)

Как правильно выбрать не пустые строки используя только индексные чтения ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 13 фев 2006, 21:53

при неравенстве индекс не может быть использован никогда.
null <> '', также null <> null

Эстет
Сообщения: 15
Зарегистрирован: 17 янв 2005, 13:36

Сообщение Эстет » 14 фев 2006, 01:39

kdv писал(а):при неравенстве индекс не может быть использован никогда.
null <> '', также null <> null
Это понятно ... вопрос как быть ?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 14 фев 2006, 08:42

А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null

Эстет
Сообщения: 15
Зарегистрирован: 17 янв 2005, 13:36

Сообщение Эстет » 14 фев 2006, 11:54

Ivan_Pisarevsky писал(а):А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null
Тоже самое .... индекс не используется ... но идея неплохая ... создам smalint поле return_docs_flag check in (0,1) попробую триггером его формировать .. если не пустое поле return_docs то в return_docs_flag капает 1 ... ну и потом выборку делать по return_docs_flag

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 14 фев 2006, 13:55

и получить бесполезность такого столбца и индекса по нему в зависимости от соотношения количества записей с 0 и 1...

Эстет
Сообщения: 15
Зарегистрирован: 17 янв 2005, 13:36

Сообщение Эстет » 14 фев 2006, 18:16

kdv писал(а):и получить бесполезность такого столбца и индекса по нему в зависимости от соотношения количества записей с 0 и 1...
Хорошо ... твой вариант kdv ?

kdv
Forum Admin
Сообщения: 6595
Зарегистрирован: 25 окт 2004, 18:07

Сообщение kdv » 15 фев 2006, 01:24

мой вариант? я таких баз не делаю.

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 15 фев 2006, 09:10

Эстет писал(а):
Ivan_Pisarevsky писал(а):А если триггером из пустой строки делать NULL-ы и искать
where some_field is not null
Тоже самое .... индекс не используется ... но идея неплохая ... создам smalint поле return_docs_flag check in (0,1) попробую триггером его формировать .. если не пустое поле return_docs то в return_docs_flag капает 1 ... ну и потом выборку делать по return_docs_flag
Ну не null-ы, это я так навскидку не проверив... можно триггером null-ы и пустые строки менять на что-нидь вида "~ПОЛЕ_НЕ_ЗАПОЛНЕНО~" и никуда оно не денется отберется по индексу.

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Re: Выбрать не пустые строки. HELP!

Сообщение v6y » 15 фев 2006, 09:51

Эстет писал(а):В общем есть табличька в ней varchar(30) поле RETURN_DOCS.
На всем протяжении жизни таблички в неё добавляют редактируют и удаляют записи ... при этом RETURN_DOCS порой бывает NULL после добавления строки, но без занесения данных в RETURN_DOCS, ... также бывает просто пустой если данные в RETURN_DOCS потёрли ... ну соответствено забит буквенными данными. По RETURN_DOCS построенн индекс.

Требуется выбрать не пустые строки из всей таблицы.
У меня идея только делать так:
SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE
DOSTAVKA.RETURN_DOCS <> ''

но FB-1.5.3 строит план: PLAN (DOSTAVKA NATURAL)

Как правильно выбрать не пустые строки используя только индексные чтения ?
Я заранее прошу прощения - может чего с просонья не разобрал. Но почему нельзя использованть

Код: Выделить всё

SELECT DOSTAVKA.RETURN_DOCS
FROM DOSTAVKA
WHERE 
    DOSTAVKA.RETURN_DOCS > ''
?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 15 фев 2006, 11:38

Попробовал... да, таки индейская избушка фигвам...
Предлагаю выделить это поле в отдельную табличку, соответственно связь по ключу, как обычно. Если запись пустая, то в этой вспомогательной табличке вообще не должно быть записи. Дальше отбор иннер джойном, соответсвенно сделать внешний ключ, индекс по нему создастся автоматом, ну думаю мысль ясна.

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 15 фев 2006, 12:10

Ivan_Pisarevsky писал(а):Попробовал... да, таки индейская избушка фигвам...
Предлагаю выделить это поле в отдельную табличку, соответственно связь по ключу, как обычно. Если запись пустая, то в этой вспомогательной табличке вообще не должно быть записи. Дальше отбор иннер джойном, соответсвенно сделать внешний ключ, индекс по нему создастся автоматом, ну думаю мысль ясна.
Ну не дайте же умереть дураком! Ну обясните чего вы тут огород городите, если индекс чеплятся, когда вместо неравно используется больше и при этом ни null, ни пустые строки не отображаются?

Ivan_Pisarevsky
Заслуженный разработчик
Сообщения: 644
Зарегистрирован: 15 фев 2005, 11:34

Сообщение Ivan_Pisarevsky » 15 фев 2006, 15:28

Да, если "больше", то отбор идет по индексу...
просто в моей голове слехка не вяжется логически "что это за сущность", которая больше пустой строки... Может гуру просвятят?

v6y
Сообщения: 78
Зарегистрирован: 12 мар 2005, 17:45

Сообщение v6y » 15 фев 2006, 21:26

Ivan_Pisarevsky писал(а): в моей голове слехка не вяжется логически "что это за сущность", которая больше пустой строки...
Смотрите на вещи проще ;-) Это строки с одним и более непробельных символов :)

Merlin
Динозавр IB/FB
Сообщения: 1502
Зарегистрирован: 27 окт 2004, 11:44

Сообщение Merlin » 16 фев 2006, 12:22

Это всё лирика. Самое-то интересное - для нафига надо стараться выбрать непустые строки именно по индексу... Видать там 90% пустых. Или нужно обязательно добиться замедления запроса...

Ответить