|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Скорость обработки FB/IB select по boolean и varchar ?
Здравствуйте!
Имеет ли какой-либо смысл в плане скорости исполнения или уменьшения размера выделяемой памяти итп в случаях когда в одной таблице записаны разные группы признаков создавать отдельный признак указывающий на группу1 и группу2? Пример - таблица Поставщики в ней могут быть Юрлица и Физлица, но в программе их нужно показывать раздельно, разделить выборку можно следующими способами: where (ИНН is not null) where (ФИО is null) или добавить в таблицу отдельный boolean признак ЮрЛИЦО и записывать в него да/нет, соответственно при выборке: where (ЮрЛИЦО=True) Вопрос к тем, кто хорошо знает как работает FB/IB - есть ли какая-то существенная разница в этих 3х выборках по скорости, объёму выделяемой памяти, какая-то ещё разница? |
#2
|
||||
|
||||
А на каком основании вы два разных объекта учета зафигачили в одну таблицу? То, что у них общее слово "лица" их не объединяет. Это совершенно разные по структуре объекты и их хранить в одной таблице просто нельзя.
Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#3
|
|||
|
|||
Уважаемый гуру, спасибо за столь большую заботу, с тем что как хранить я уж сам разберусь. К тому же описанный случай лишь пример.
Вопрос остаётся - какой же вариант выборки быстрее? Последний раз редактировалось delphicoding, 02.10.2011 в 18:22. |
#4
|
|||
|
|||
во-первых, такого рода объекты хранить нужно в 3 таблицах (основываясь на приведенном примере).
Код:
CREATE TABLE SUPPLIER ( ID INTEGER PRIMARY KEY, SUP_TYPE INTEGER NOT NULL DEFAULT 0 CHECK SUP_TYPE IN (0,1), ... ); CREATE TABLE PERSON ( ID INTEGER PRIMARY KEY, -- если будут еще персоны, пользователи -- или клиенты SUP_ID INTEGER REFERENCE SUPPLIER(ID). ... ); CREATE TABLE ORG ( ID INTEGER PRIMARY KEY, -- если будут еще организации, SUP_ID INTEGER REFERENCE SUPPLIER(ID). ... ); Ну и, если поддерживается, то по полю SUP_TYPE создается BITMAP индекс (если не поддерживается BITMAP, то любой). |
#5
|
|||
|
|||
Спасибо за развёрнутый ответ!
Но в данном случае вопрос задан так, как задан. Поэтому основной вопрос всё же остаётся - какой метод внутри СУБД обработает одинаковое кол-во записей быстрее? Сравнение по скорости: varchar/integer/smallint is not null varchar/integer/smallint is null boolean=false boolean=true boolean is null тк в разных СУБД бывают разные оптимизации и что быстро в одной СУБД может быть в разы медленнее в другой СУБД... |
#6
|
||||
|
||||
Цитата:
Тесты-же вам мало что дадут по тем-же причинам ибо сурогат он и в Африке сурогат. Жизнь такова какова она есть и больше никакова. Помогаю за спасибо. |
#7
|
|||
|
|||
Жалко, думал может кто подскажет точно...
|
#8
|
|||
|
|||
Разницу между этими двумя вариантами вы вряд ли заметите. В данном случае оба подхода равноправны. Операция фильтрации по полю займет несоизмеримо меньше времени чем сопутствующие процессы (компиляция запроса, чтение таблиц с диска, пересылка результата и т.д.)
Ощутимая разница может возникнуть только если таблица большая, а фильтр сильно прореживает результат (в этом случае очень эффективными будут индексы). А у вас и таблица маленькая (ну вряд ли вы работаете с тысячами поставщиков) и фильтрация по ИНН или ФИО выберет 30-50% строк из таблицы. |