Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 16.07.2012, 19:32   #1
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
Вопрос Уточнения по работе с полями Delphi-FB

Здравствуйте!
(создал одну тему, чтобы не создавать мусор.)
1. При обращении к полям как лучше писать Dataset.FieldByName().Value или точно указывать типа данных Dataset.FieldByName().AsInteger/AsString/итд? Что это даёт? Какая разница? Как быстрее?
2. FB2.5 как можно сразу переименовать название индекса? IBexpert не позволяет этого сделать (нужно снимать все PK/FK). Можно как-то переименовать индекс без снятия PK/FK?
3. FB2.5 если поле BLOB =null много ли места в БД оно занимает? Что хуже (менее экономно) хранить поле типа varchar или blob? Varchar поле всегда даже если пустое занимает указанное пространство? (например 100символов)
DeveloPerchik вне форума Ответить с цитированием
Старый 16.07.2012, 20:23   #2
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

1. Value типа Variant - неизбежные потери по скорости
3. Varchar занимает по факту + память для хранения длины этого факта. По blob-у поиска не сделаешь, да и выборка-запись помедленнее varchar. Смотреть нужно что предполагается хранить
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.07.2012, 20:48   #3
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

Цитата:
Что это даёт? Какая разница? Как быстрее?
Думаю что на это могут ответить только исходники сего компонента. Посмтори как устроен TField, и какие функции вызываются при вызове Value и AsString
Цитата:
если поле BLOB =null много ли места в БД оно занимает?
По-моему у всех BLOB есть определенный минимальный размер. Я точно не знаю но кажись 80 байт сегмент. Хотя должно конфигурироваться в файле настроек огнептички.
Цитата:
Что хуже (менее экономно) хранить поле типа varchar или blob?
http://www.firebirdsql.su/doku.php?id=tipy_dannyx
Тут все скажут.
Цитата:
По blob-у поиска не сделаешь
Чего так?
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2012, 21:05   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Цитата:
Сообщение от Stilet Посмотреть сообщение
Чего так?
Ну не совсем нельзя, udf использовать прийдется и только символьный поиск. Но медленно - индекс не построишь
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 16.07.2012, 21:13   #5
Stilet
Белик Виталий :)
Старожил
 
Аватар для Stilet
 
Регистрация: 23.07.2007
Сообщений: 57,097
По умолчанию

А в Огнептичке нет полнотекстового поиска? В Оракле и Информиксе и даже Сиквеле такие индекса построить можно.
I'm learning to live...
Stilet вне форума Ответить с цитированием
Старый 16.07.2012, 21:26   #6
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Sphinx есть, но это наружка. Возможно и другие примочки
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 17.07.2012, 12:17   #7
DeveloPerchik
Пользователь
 
Регистрация: 06.04.2012
Сообщений: 78
По умолчанию

1. Уточнение - то самый быстрый способ это [Dataset1.FieldByName().AsInteger:=D ataset2.FieldByName().AsInteger] ? Интересовало если например поле Integer, то быстрее будет если использовать .Value или .AsInteger ??? Иными словами если тип данных известен, то как быстрее передавать данные - универсальным Value или точным указанием типа данных ? При передаче с указанием типа данных не будет ли происходить каждый раз лишнее преобразование [.AsInteger - > ValueToInteger] ??
2.
3. То есть поле Varchar 1000 при кол-ве текста в 10 будет занимать всего 10 ?? Неужели стали сжимать текстовые строки ? Или всё же в самой БД под поле так и выделяется 100, просто вместо пробелов пусто ?
Нужно хранить некий текст который может быть от 0 до 1000 символом - как это более экономично делать? Тестовым полем varchar или текстовым blob ?
DeveloPerchik вне форума Ответить с цитированием
Старый 17.07.2012, 13:05   #8
Прик
Форумчанин
 
Регистрация: 08.09.2010
Сообщений: 880
По умолчанию

3.
При названных условиях Varchar, конечно. По текстовым полям, длина значений которых не превышает (насколько помниться) 4 Кб, можно создавать индексы.
Доступ ускоряется в разы. Важно для больших объемов. Если записей немного (5-10 тыс.) - это не так и актуально - лишние индексы не уменьшают энтропии.

К слову о хранении данных в FB (кому то это еще важно). Страничная организация файлов в FB делает достаточно быстрым доступ к любому типу данных.
Тип varchar не хранит все установленный для поля байты, только переданную строку и сжатие здесь ни причем. Разумеется, лишние символы обрезаются, если их больше чем зарезервировано для этого поля.

ИМХО. Для современных процессоров с их памятью ловить микросекунды на одиночных операциях сравнения или присвоения (Dataset1.FieldByName().AsInteger:= Dataset2.FieldByName().AsInteger), по крайней мере, не ценить свое время.
Прик вне форума Ответить с цитированием
Старый 17.07.2012, 13:50   #9
_SERGEYX_
Участник клуба
 
Аватар для _SERGEYX_
 
Регистрация: 07.07.2007
Сообщений: 1,518
По умолчанию

Цитата:
Dataset1.FieldByName().AsInteger:= Dataset2.FieldByName().AsInteger
Если не ошибаюсь, обращение к полю по его индексу всегда быстрее, чем обращение по имени, т.е.
Код:
Dataset1.Fields[0].AsInteger:= x;
сработает быстрее, чем
Код:
Dataset1.FieldByName('summa').AsInteger:= x;
А создавать blob-поля без особой необходимости, имхо, вообще нет смысла. Разве что для хранения файлов, картинок или больших текстов.
_SERGEYX_ вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

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

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Уточнения по ассемблеру. max-tasm Assembler - Ассемблер (FASM, MASM, WASM, NASM, GoASM, Gas, RosAsm, HLA) и не рекомендуем TASM 2 17.05.2010 17:43
Программа для уточнения корней уравнения (на DELPHI) mast2xx Помощь студентам 2 21.03.2010 16:43
программа для уточнения корней уравнения (Delphi) mast2xx Помощь студентам 0 20.03.2010 20:21
delphi 9 или delphi 2005 вопрос о работе Doget Компоненты Delphi 0 07.07.2008 08:50
Помогите с подстановачными полями в Delphi Ol'ga Общие вопросы Delphi 1 29.06.2008 13:58