Форум по Delphi программированию

Delphi Sources



Вернуться   Форум по Delphi программированию > Все о Delphi > Базы данных
Ник
Пароль
Регистрация <<         Правила форума         >> FAQ Пользователи Календарь Поиск Сообщения за сегодня Все разделы прочитаны

Ответ
 
Опции темы Поиск в этой теме Опции просмотра
  #1  
Старый 02.10.2011, 17:34
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
Вопрос Скорость обработки FB/IB select по boolean и varchar ?

Здравствуйте!
Имеет ли какой-либо смысл в плане скорости исполнения или уменьшения размера выделяемой памяти итп в случаях когда в одной таблице записаны разные группы признаков создавать отдельный признак указывающий на группу1 и группу2?
Пример - таблица Поставщики в ней могут быть Юрлица и Физлица, но в программе их нужно показывать раздельно, разделить выборку можно следующими способами:
where (ИНН is not null)
where (ФИО is null)
или добавить в таблицу отдельный boolean признак ЮрЛИЦО и записывать в него да/нет, соответственно при выборке:
where (ЮрЛИЦО=True)
Вопрос к тем, кто хорошо знает как работает FB/IB - есть ли какая-то существенная разница в этих 3х выборках по скорости, объёму выделяемой памяти, какая-то ещё разница?
Ответить с цитированием
  #2  
Старый 02.10.2011, 17:51
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

А на каком основании вы два разных объекта учета зафигачили в одну таблицу? То, что у них общее слово "лица" их не объединяет. Это совершенно разные по структуре объекты и их хранить в одной таблице просто нельзя.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #3  
Старый 02.10.2011, 18:04
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Уважаемый гуру, спасибо за столь большую заботу, с тем что как хранить я уж сам разберусь. К тому же описанный случай лишь пример.
Вопрос остаётся - какой же вариант выборки быстрее?

Последний раз редактировалось delphicoding, 02.10.2011 в 18:22.
Ответить с цитированием
  #4  
Старый 02.10.2011, 18:28
lmikle lmikle вне форума
Модератор
 
Регистрация: 17.04.2008
Сообщения: 8,029
Версия Delphi: 7, XE3, 10.2
Репутация: 49089
По умолчанию

во-первых, такого рода объекты хранить нужно в 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  
Старый 02.10.2011, 18:35
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Спасибо за развёрнутый ответ!

Но в данном случае вопрос задан так, как задан.
Поэтому основной вопрос всё же остаётся - какой метод внутри СУБД обработает одинаковое кол-во записей быстрее? Сравнение по скорости:
varchar/integer/smallint is not null
varchar/integer/smallint is null
boolean=false
boolean=true
boolean is null
тк в разных СУБД бывают разные оптимизации и что быстро в одной СУБД может быть в разы медленнее в другой СУБД...
Ответить с цитированием
  #6  
Старый 02.10.2011, 19:26
Аватар для Страдалецъ
Страдалецъ Страдалецъ вне форума
Гуру
 
Регистрация: 09.03.2009
Адрес: На курорте, из окна вижу теплое Баренцево море. Бррр.
Сообщения: 4,721
Репутация: 52347
По умолчанию

Цитата:
Поэтому основной вопрос всё же остаётся - какой метод внутри СУБД обработает одинаковое кол-во записей быстрее?
А вот тут однозначно вам наверное никто не скажет. Слишком много факторов. Верно, что в разных СУБД может быть разная скорость выполнения, но так-же надо учитывать в каком контексте данное действо будет выполнятся. Тут и индексы и проверки и структура табли и положение данных на носителе и в памяти и еще туча факторов.
Тесты-же вам мало что дадут по тем-же причинам ибо сурогат он и в Африке сурогат.
__________________
Жизнь такова какова она есть и больше никакова.
Помогаю за спасибо.
Ответить с цитированием
  #7  
Старый 02.10.2011, 22:35
delphicoding delphicoding вне форума
Активный
 
Регистрация: 04.07.2011
Сообщения: 206
Репутация: -461
По умолчанию

Жалко, думал может кто подскажет точно...
Ответить с цитированием
  #8  
Старый 12.10.2011, 01:01
Lucky192 Lucky192 вне форума
Прохожий
 
Регистрация: 04.10.2011
Сообщения: 28
Репутация: 1351
По умолчанию

Разницу между этими двумя вариантами вы вряд ли заметите. В данном случае оба подхода равноправны. Операция фильтрации по полю займет несоизмеримо меньше времени чем сопутствующие процессы (компиляция запроса, чтение таблиц с диска, пересылка результата и т.д.)
Ощутимая разница может возникнуть только если таблица большая, а фильтр сильно прореживает результат (в этом случае очень эффективными будут индексы). А у вас и таблица маленькая (ну вряд ли вы работаете с тысячами поставщиков) и фильтрация по ИНН или ФИО выберет 30-50% строк из таблицы.
Ответить с цитированием
Ответ


Delphi Sources

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск
Опции просмотра

Ваши права в разделе
Вы не можете создавать темы
Вы не можете отвечать на сообщения
Вы не можете прикреплять файлы
Вы не можете редактировать сообщения

BB-коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.
Быстрый переход


Часовой пояс GMT +3, время: 10:32.


 

Сайт

Форум

FAQ

RSS лента

Прочее

 

Copyright © Форум "Delphi Sources" by BrokenByte Software, 2004-2023

ВКонтакте   Facebook   Twitter