Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос о текстовых типах данных / 5 сообщений из 5, страница 1 из 1
26.01.2004, 23:54
    #32388452
banshee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о текстовых типах данных
Здравствуй уважаемый All!

Задавал этот вопрос на форуме sybase.ru, но что-то там уже неделю тишина гробовая.

Сидел тут на досуге размышлял и вот такая мысль меня посетила:
(Сразу оговорюсь, что речь идёт о ASA 9)
Насколько я правильно вычитал в документации для ASA без разницы какой тип
использовать CHAR, VARCHAR или LONG VARCHAR. Точнее есть подозрение, что с
третим не всё так гладко, но речь сейчас не об этом. То есть ведёт себя ASA
при использовании этих типов примерно одинаково: если строка<=254 байт, то
используется паскалевский тип представления с длиной строки в первом байте,
если больше, то... чего-то там ещё, посложнее. Причём ASA не добавляет
пробелы в конце строки, если её длина меньше указанной максимальной при
создании таблицы, то есть хранятся только данные (вот здесь кстати вопрос по
ходу: в тех СУБД, где пробелы добавляются, они реально хранятся в базе, или
приклеиваются динамически при работе со строками?). Но опять-таки, AFAIR ASA
отводит по умолчанию для каждой строки место, которое заявлено в
максимальных длинах строк для того, чтобы избежать фрагментации при
изменении данных. Вот теперь собственно вопрос: С одной стороны есть желание
снизить кол-во места необходимое для хранения данных в базе, максимально
рационально его использовать, с другой стороны не хочется слишком жёстко
ограничивать максимальный размер хранимой строки, чтобы потом было меньше
геморроя, если вдруг кто-нибудь решит забить в поле мега-строку. Кто как
поступает? Поделитесь опытом...

И ещё вопрос вдогонку: генерируются ли какие-либо исключения/ошибки при
попытке пользователя забить в поле строку с длиной больше максимальной или
она просто втихую обрезается до нужной длины? Т.е. если я хочу в клиентском
приложении пользователю сказать: "нехорошо, дорогой, такие мега-строки
забивать" надо ещё constraint'ы создавать, чтобы это отловить или
ограничения на длину достаточно?
...
Рейтинг: 0 / 0
27.01.2004, 09:51
    #32388608
Геша
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о текстовых типах данных
Мое сугубо ИМХО .
тип CHAR от VARCHAR отличается тем , что в первый концевые пробелы добавляются , а вот ко второму нет .
А вот если у тебя задана длина VarChar меньше чем ты хочешь воткнуть .. произойдет просто усечение строки ..
Вообщето это легко проверяется ..
...
Рейтинг: 0 / 0
27.01.2004, 10:56
    #32388716
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о текстовых типах данных
Ну немного о текстовых типах написано здесь .

Чтобы включить проверку в INSERT и UPDATE на превышение значений максимальной длины текстовых полей, нужно включить опцию STRING_RTRUNCATION.

В других СУБД тип CHAR хранится с завершающими пробелами, в ASA вообще тип CHAR работает как VARCHAR.

Насчет хранения полей Вы ошибаетесь - ASA не резервирует всю длину для varchar полей и хранит ровно столько, сколько есть. Проверить просто - сделайте на БД с страницей 2кб табличку с полем VARCHAR(3000), повставляйте в нее значения и посмотрите, сколько страниц занимает эта таблица. Кол-во страниц будет расти не с каждой вставляемой записью, а только при реальном заполнении текущей страницы и соотвественно организации новой. Такой способ хранения позволяет ASA во первых не раздувать размер таблицы, что критично при выполнении запросов (кстати поля, имеющие NULL вообще в записи не храняться). С другой стороны нужно себе отдавать отчет, что любое увеличение длины строк множества записей через UPDATE приведет к медленной работе этого оператора и дефрагментации таблицы.

Вывод из всего этого прост: в char полях лучше всего хранить текстовую описательную информацию, которая никогда не изменяется или изменяется одновременно малыми обьемами (ну например юзером изменяется наименование фирмы). Для хранения чего то еще, что может иметь переменную длину и изменяться (например, специальный синтетический ключ, путь веток дерева, и т.д.) лучше всего самостоятельно приводить длину поля к максимальному, добивая его пробелами.

P.S. Ну а проблема мега-строк лежит полностью на совести разработчика БД. Лично для меня если известная максимальная длина фамилии человека 40 знаков, то значит в базе можно на всякий пожарный поставить 50. Но уж никак не 500 - не будет таких мега-фамилий по любому :)
...
Рейтинг: 0 / 0
27.01.2004, 22:19
    #32389864
banshee
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о текстовых типах данных
Спасибо за ответ!

ASCRUSНасчет хранения полей Вы ошибаетесь - ASA не резервирует всю длину для varchar полей и хранит ровно столько, сколько есть.

Теперь понятно. Я собственно вот из-за чего неправильно себе всё это представил: Если в Цетрале открыть свойства таблицы и выбрать закладку Miscellaneous, то там будет находиться такая опция "Free space" и вот что про неё написано в хелпе:

Free space. Specifies the amount of free space you want to reserve for each table page. The free space is used if rows increase in size when the data is updated. If there is no free space in a table page, every increase in the size of a row on that page requires the row to be split across multiple table pages, causing row fragmentation and possible performance degradation.

То есть, я это понял, как место для роста размера поля, а надо понимать как место для роста всей строки. Когда ещё раз перечитал, всё вроде на свои место встало. Только вот теперь другой вопрос появился: нужно ли менять 200 байт стоящие у меня по умолчанию и, если да, то на что? Скажем, в строках хранится информация, длина которой может меняться от средней где-то +-50% (ФИО, например).

ASCRUSЛично для меня если известная максимальная длина фамилии человека 40 знаков, то значит в базе можно на всякий пожарный поставить 50. Но уж никак не 500 - не будет таких мега-фамилий по любому :)

А 40 знаков это не мега-фамилия? :)
...
Рейтинг: 0 / 0
27.01.2004, 23:04
    #32389875
ASCRUS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вопрос о текстовых типах данных
Ну 200 байт это резерв. Если и менять их, то желательно смотреть на:
1. Размер страницы БД
2. Максимальную ширину записи таблицы (каков ее процент от размера страницы)
3. Есть ли кластерный индекс
4. Как часто будут идти вставки записей, которые будут идти разбросано по всей таблице в соотвествие с кластерным индексом
5. Как часто и насколько возможно изменение полей с переменной длиной или вставка значений в поля, содержащие NULL.

Как и всегда получается палка на 2-х концах:
а. Чем больше резервируемый размер, тем меньше фрагментации таблицы (пункты 3-5)
б. Чем меньше резервируемый размер, тем быстрее работают запросы с нефрагментированными таблицами (информация умещается на меньшем кол-ве страниц).

Из вышесказанного можно сделать вывод - при проектировке таблицы изначально неплохо бы задуматься о ее возможной фрагментированности. Если ее нет (данные вставляются последовательно) или ее процент мал, то на резервирование тоже особо тратиться не стоит. Если же таблица постоянно в изменениях, то возможно увеличение резервирования положительно скажется не только на операциях вставки и изменения, но и времени выполнения запросов.

P.S. 40 знаков это не мега-фамилия :) Мало того, что бывают двойные фамилии, так еще бывают фамилии и экзотических народов. На моей памяти самая длинная фамилия по моему где то 38 знаков, привести ее сейчас уже не смогу, давно это было :)
...
Рейтинг: 0 / 0
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос о текстовых типах данных / 5 сообщений из 5, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]