|
|
|
Вопрос о текстовых типах данных
|
|||
|---|---|---|---|
|
#18+
Здравствуй уважаемый All! Задавал этот вопрос на форуме sybase.ru, но что-то там уже неделю тишина гробовая. Сидел тут на досуге размышлял и вот такая мысль меня посетила: (Сразу оговорюсь, что речь идёт о ASA 9) Насколько я правильно вычитал в документации для ASA без разницы какой тип использовать CHAR, VARCHAR или LONG VARCHAR. Точнее есть подозрение, что с третим не всё так гладко, но речь сейчас не об этом. То есть ведёт себя ASA при использовании этих типов примерно одинаково: если строка<=254 байт, то используется паскалевский тип представления с длиной строки в первом байте, если больше, то... чего-то там ещё, посложнее. Причём ASA не добавляет пробелы в конце строки, если её длина меньше указанной максимальной при создании таблицы, то есть хранятся только данные (вот здесь кстати вопрос по ходу: в тех СУБД, где пробелы добавляются, они реально хранятся в базе, или приклеиваются динамически при работе со строками?). Но опять-таки, AFAIR ASA отводит по умолчанию для каждой строки место, которое заявлено в максимальных длинах строк для того, чтобы избежать фрагментации при изменении данных. Вот теперь собственно вопрос: С одной стороны есть желание снизить кол-во места необходимое для хранения данных в базе, максимально рационально его использовать, с другой стороны не хочется слишком жёстко ограничивать максимальный размер хранимой строки, чтобы потом было меньше геморроя, если вдруг кто-нибудь решит забить в поле мега-строку. Кто как поступает? Поделитесь опытом... И ещё вопрос вдогонку: генерируются ли какие-либо исключения/ошибки при попытке пользователя забить в поле строку с длиной больше максимальной или она просто втихую обрезается до нужной длины? Т.е. если я хочу в клиентском приложении пользователю сказать: "нехорошо, дорогой, такие мега-строки забивать" надо ещё constraint'ы создавать, чтобы это отловить или ограничения на длину достаточно? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 26.01.2004, 23:54 |
|
||
|
Вопрос о текстовых типах данных
|
|||
|---|---|---|---|
|
#18+
Мое сугубо ИМХО . тип CHAR от VARCHAR отличается тем , что в первый концевые пробелы добавляются , а вот ко второму нет . А вот если у тебя задана длина VarChar меньше чем ты хочешь воткнуть .. произойдет просто усечение строки .. Вообщето это легко проверяется .. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2004, 09:51 |
|
||
|
Вопрос о текстовых типах данных
|
|||
|---|---|---|---|
|
#18+
Ну немного о текстовых типах написано здесь . Чтобы включить проверку в INSERT и UPDATE на превышение значений максимальной длины текстовых полей, нужно включить опцию STRING_RTRUNCATION. В других СУБД тип CHAR хранится с завершающими пробелами, в ASA вообще тип CHAR работает как VARCHAR. Насчет хранения полей Вы ошибаетесь - ASA не резервирует всю длину для varchar полей и хранит ровно столько, сколько есть. Проверить просто - сделайте на БД с страницей 2кб табличку с полем VARCHAR(3000), повставляйте в нее значения и посмотрите, сколько страниц занимает эта таблица. Кол-во страниц будет расти не с каждой вставляемой записью, а только при реальном заполнении текущей страницы и соотвественно организации новой. Такой способ хранения позволяет ASA во первых не раздувать размер таблицы, что критично при выполнении запросов (кстати поля, имеющие NULL вообще в записи не храняться). С другой стороны нужно себе отдавать отчет, что любое увеличение длины строк множества записей через UPDATE приведет к медленной работе этого оператора и дефрагментации таблицы. Вывод из всего этого прост: в char полях лучше всего хранить текстовую описательную информацию, которая никогда не изменяется или изменяется одновременно малыми обьемами (ну например юзером изменяется наименование фирмы). Для хранения чего то еще, что может иметь переменную длину и изменяться (например, специальный синтетический ключ, путь веток дерева, и т.д.) лучше всего самостоятельно приводить длину поля к максимальному, добивая его пробелами. P.S. Ну а проблема мега-строк лежит полностью на совести разработчика БД. Лично для меня если известная максимальная длина фамилии человека 40 знаков, то значит в базе можно на всякий пожарный поставить 50. Но уж никак не 500 - не будет таких мега-фамилий по любому :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2004, 10:56 |
|
||
|
Вопрос о текстовых типах данных
|
|||
|---|---|---|---|
|
#18+
Спасибо за ответ! 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 знаков это не мега-фамилия? :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2004, 22:19 |
|
||
|
Вопрос о текстовых типах данных
|
|||
|---|---|---|---|
|
#18+
Ну 200 байт это резерв. Если и менять их, то желательно смотреть на: 1. Размер страницы БД 2. Максимальную ширину записи таблицы (каков ее процент от размера страницы) 3. Есть ли кластерный индекс 4. Как часто будут идти вставки записей, которые будут идти разбросано по всей таблице в соотвествие с кластерным индексом 5. Как часто и насколько возможно изменение полей с переменной длиной или вставка значений в поля, содержащие NULL. Как и всегда получается палка на 2-х концах: а. Чем больше резервируемый размер, тем меньше фрагментации таблицы (пункты 3-5) б. Чем меньше резервируемый размер, тем быстрее работают запросы с нефрагментированными таблицами (информация умещается на меньшем кол-ве страниц). Из вышесказанного можно сделать вывод - при проектировке таблицы изначально неплохо бы задуматься о ее возможной фрагментированности. Если ее нет (данные вставляются последовательно) или ее процент мал, то на резервирование тоже особо тратиться не стоит. Если же таблица постоянно в изменениях, то возможно увеличение резервирования положительно скажется не только на операциях вставки и изменения, но и времени выполнения запросов. P.S. 40 знаков это не мега-фамилия :) Мало того, что бывают двойные фамилии, так еще бывают фамилии и экзотических народов. На моей памяти самая длинная фамилия по моему где то 38 знаков, привести ее сейчас уже не смогу, давно это было :) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 27.01.2004, 23:04 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=32389875&tid=2014686]: |
0ms |
get settings: |
8ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
159ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
38ms |
get tp. blocked users: |
1ms |
| others: | 230ms |
| total: | 472ms |

| 0 / 0 |

Извините, этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
... ля, ля, ля ...