|
|
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
(VFP8, база на SQL Server 2000) Для уникального поля таблиц у нас исторически использовался тип CHAR(36) (not null default newid()). И все было ОК. Буквально недавно узнал, что правильнее (со стороны сервера) использовать тип UNIQUEIDENTIFIER (default newid()). А как фокс работает с этим полем, нормально? Я ни каких недостатков не нашел (и через CAD и pass-through). Но прежде, чем перейти на тотальное использование, хочется услышать мнение тех, кто работает с UNIQUEIDENTIFIER - не ожидают ли меня в будущем какие-нибудь грабли с стороны фокса? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.03.2006, 11:51 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Лично я его не использовал. Разбирался только в самом начале. Однако работа с ним должна быть даже проще чем с полями типа Identity поскольку значение этого поля можно получить ДО физического создания записи. Это существенно упрощает весь процесс программирования. Собственно, с точки зрения FoxPro - это обычное символьное поле C(36). Какие проблемы при работе с символьными полями? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 00:05 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
А проще всего загялунть в BOL. Да ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 01:37 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
У меня проблемы с этим типом значений. Фокс отказывался работать с ним. Вроде символная строка, но когда я делал проверку типа значений через TYPE то фокс выдал команду U! ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 10:47 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Недоходящийно когда я делал проверку типа значений через TYPE то фокс выдал команду U! Не может быть! У меня "С" выдает. (VFP 8). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 11:08 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
P.S. Только не через TYPE, а VARTYPE конечно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 11:10 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Sergej_SP.S. Только не через TYPE, а VARTYPE конечно. А какая разница?! Только в ковычках (для TYPE) или без ковычек (для VARTYPE) переменная. С уважением, Алексей. А если серьезно, то использование типа данных UNIQUEIDENTIFIER в качестве Primary Key для таблицы имеет не только положительные моменты (о них уже ВладимирМ сказал), но и отрицательные: 1. Длина. Integer - 4 - байта, а UNIQUEIDENTIFIER - 16 байт. В 4 !!! раза больше. На больших таблицах вы получите огромный проигрыш в размерах таблицы (и тем более в размере ВСЕХ некластерных индексов, если по UNIQUEIDENTIFIER построен кластерный индекс) и в конечном итоге, в скорости запросов. Если при этом вам не требуется уникальность "в пределах вселенной", а достаточно обеспечить уникальность в пределах таблицы, то тип данных UNIQUEIDENTIFIER явно избыточен. 2. При построении суррогатного PK (Primary Key - первичный ключ) на основание свойства поля IDENTITY вы получаете монотонно возврастающую (или убывающую) последовательность. Если при этом вы строите по этому полю кластерный индекс (это не всегда верно, но для некоторых таблиц - хорошее решение), то вы получаете минимум физических перестроений таблицы при ее изменений. Для индекса по UNIQUEIDENTIFIER это не верно. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 11:44 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Aleksey-K2. При построении суррогатного PK (Primary Key - первичный ключ) на основание свойства поля IDENTITY вы получаете монотонно возврастающую (или убывающую) последовательность. Если при этом вы строите по этому полю кластерный индекс (это не всегда верно, но для некоторых таблиц - хорошее решение), то вы получаете минимум физических перестроений таблицы при ее изменений По подробнее пожалуйста, почему кластерный PK на IDENTITY в основном решение не правильное. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:02 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
PaulWist По подробнее пожалуйста, почему кластерный PK на IDENTITY в основном решение не правильное. А я не сказал, что "в основном решение не правильное"! Я сказал "это не всегда верно, но для некоторых таблиц - хорошее решение". Если есть сомнения и в этом утверждении, то могу изложить свои соображение, подкрепленные примерами. Хотя, это скорее вопрос другой конференции (SQL Server), а там по выбору кластерного индекса (он один только, бедняга на всю таблицу) столько копий в свое время было поломано... С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:16 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Aleksey-KА я не сказал, что "в основном решение не правильное"! Я сказал "это не всегда верно, но для некоторых таблиц - хорошее решение". Если есть сомнения и в этом утверждении, то могу изложить свои соображение, подкрепленные примерами. Хотя, это скорее вопрос другой конференции (SQL Server), а там по выбору кластерного индекса (он один только, бедняга на всю таблицу) столько копий в свое время было поломано... Алексей. Готов выслушать Ваши соображения, не потому что есть сомнения, а потому что хотелось бы "углУбить" (М.С. Горбачев) свои представления. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:21 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
To Aleksey-K: А так понял, Вы с SQL Server через pass-throuhg работаете? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:23 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Sergej_STo Aleksey-K: А так понял, Вы с SQL Server через pass-throuhg работаете? ТОЛЬКО через pass-throuhg. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:28 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Aleksey-K 1. Длина. Integer - 4 - байта, а UNIQUEIDENTIFIER - 16 байт. В 4 !!! раза больше. На больших таблицах вы получите огромный проигрыш в размерах таблицы (и тем более в размере ВСЕХ некластерных индексов, если по UNIQUEIDENTIFIER построен кластерный индекс) . В наше то время считать 12 байт на запись? Ерунда... Aleksey-K и в конечном итоге, в скорости запросов. Сомнительное утверждение. [quot Aleksey-K] 2. При построении суррогатного PK (Primary Key - первичный ключ) на основание свойства поля IDENTITY вы получаете монотонно возврастающую (или убывающую) последовательность. Если при этом вы строите по этому полю кластерный индекс (это не всегда верно, но для некоторых таблиц - хорошее решение), то вы получаете минимум физических перестроений таблицы при ее изменений. Для индекса по UNIQUEIDENTIFIER это не верно. Это вообще в корне неверно. Почитайт внимательно форум по сиквелу. Приемущества GUID: 1. Никаких проблем при репликации слиянием. 2. Возможность генерить на клиенте и отсутствие необходимости мапить вновь добавленные записи на результат возвращаемый сервером. Проблем при работе из фокса нет. С появлением в VFP9 типа varbinary мапиться на varbinary(16) как родной. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:34 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Что-то слишком категоричное получился пост, да еще и скомканным. Короче говоря на скорости запросов это отражается не сильно, хотя сетевой траффик незначительно возрастает. А вот скорость построения кластерного индекса по GUID практически не уступает identity. Это связано с тем что для последовательного ключа возникает конкуренция за выделение новых страниц под индекс, что не имеет место в случае GUID. Вообщем результат скорость добавления записей приблизительно одинакова. Может с небольшим приемущество у identity за счет меньшего размера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:48 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Aleksey-KТОЛЬКО через pass-throuhg Ясно. А с через CAD. Поэтому GUID нужен, чтобы перед инсертом его иметь на клиенте. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 12:52 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Crip Это связано с тем что для последовательного ключа возникает конкуренция за выделение новых страниц под индекс, что не имеет место в случае GUID. Надо ли это понимать, что всегда для GUID не возникает конкуренции или это среднестатистическая оценка. Насколько я понимаю при генерации GUID вероятность получения "рядом" лежащих значений не равна нулю, поэтому какая-то конкуренция всё равно возникает, правда она меньше чем у IDENTITY именно при последовательном получении ключа. С другой стороны при реализации B-дерева возникновение нового значения GUID может быть в любом листе и соответственно просто конкуренция за страницу размазывается по всему индексу. Да, похоже, что получение блокировок для GUID меньше чем для IDENTITY. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 13:12 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
2PaulWist Поищите в форуме по сиквелу. Там народ это подробно разбирал и тесты проводил. Получите более квалифицированный ответ. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 13:25 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
По поводу выбора в качестве кластерного индекса.... 1. Все таблицы в любой моей базе данных (кроме случаев использование Merge Replication, который ТРЕБУЕТ наличие поля UNIQUEIDENTIFIER во всех реплицируемых таблицах) имеют суррогатный (т.е. искусственный и не связанный с атрибутами сущности, представленной данной таблицей) первичные ключ (PK) по полю Integer со свойством IDENTITY(1,1). Для Constraint PK SQL Server ВСЕГДА создает сам индекс и по умолчанию делает его кластерным. Я раньше так все и оставлял, но теперь пересмотрел свое решение и, в зависимости от вида таблицы, поле для кластерного индекса выбираю след. образом. 1. Таблица - справочник, т.е. на ее PK есть ссылки в других таблицах через FK. Кластерный индекс создаю на поле справочника по которому выполняется наиболее часто поиск - обычно это поле "видимого" (в отличии от "невидимого" для пользователя суррогатного поля) числового кода. По PK справочника создается некластерный индекс, т.к. при поиске ОДНОГО элемента справочника разница в скорости поиска по кластерному или по некластерному индексу правтически равна нулю. 2. Таблица фактов (документы, отчеты и пр.). Такие таблицы имеют ряд полей по которым очень часто необходимо произволить поиск на сервере (дата и № документа,..) и ряд ссылок на PK справочников на которые создаются FOREIGN KEY (FK - внешний ключ) . В этом случае по всем FK я обязательно создаю некластерный индекс. Кластервнй индекс создается по тому полю, по которому выполянется наиболее часто поиск имеено в диапазоне значений (WHERE ...BETWEEN ... AND ...). Для документов эти полем является дата документа. Вот по полю даты документа я и создаю кластерный ключ. По PK таких таблиц (также суррогатный INTEGER с IDENTITY (1,1)) создается некластерный индекс, т.е. как правило, его PK используется в командах удаления (DELETE ...) и обновления (UPDATE...) или JOIN-нах, т.е. при поиске ОДНОГО значения (PK однако). А в таком поиске кластерный индекс не дает существенного приемущества перед некластерным. 3. Часто меняющиеся таблицы, на которые имеются многичисленные ссылки из других таблиц. Хорошим примером такой таблицы явлется таблица складских остатков. В этом случае кластерный индекс создается по PK (INTEGER поле с IDENTITY (1,1)). Это связано с тем, что данная таблица (и подобные ей) интенсивно обновляется (добавляется, удаляется), а поиск в ней выполняется только по ее PK, который будет присутствовать во всех таблицах фактов, связанных с ней. А минимальные задержки и блокировки при удаление и обновлении этих таблиц с учетом большо кол-ва транзакций, обращающикся к ним, как раз и обеспечиваются свойством IDENTITY и невозможностью ОБНОВЛЕНИЯ PK. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 13:41 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Для Crip. 12 байц на запись - это по вашему ерунда!? Мда... А вот давайте подсчитаем внимательно.. 1. 12 байт на 2-3 миллиона записей (это я еще скромно указал для баз на основе SQL Server, уж поверьте моему опыту) ~ 36 миллионов байт на ОДНОМ тролько PK. 2. Считаем дальше. Пусть в таблице есть еще 10 (для ровного счета) некластерных индексов. Тогда получаем еще 360 миллионов дополнительных байт. (почему так могу объяснить или сами почитайте BOL). 3. Учтем, что данные храняться в страница по 8060 байт данных в каждой и строка таблицы НЕ МОЖЕТ БЫТЬ расщепленна на две РАЗНЫЕ страницы - думаю, что процентов 30 надо еще добавить к тем 400 миллионам байт. 4. Пусть таких таблиц у вас будет 10 штук - тоже не очень большая цифра. Получается сколько ~ 5000 миллионов байт дополнитеоьно! А теперь не забудьте, что для хорошей скорости работы SQL Server-а данные должны лежать в кэше, т.е. в оперативной памяти. Т.е. вы должны добавить 5Гбайт памяти серверу при переходи от INTEGER к UNIQUEIDENTIFIER для сохранения прижней скорости работы. Вот так. Так что я бы на вашем месте так легко не относился бы к 12 байт на одну строку или забыл бы о разработке VLDB. С уважением, Алексей ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 14:01 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Crip Это вообще в корне неверно. Почитайт внимательно форум по сиквелу. Я эти форумы не читаю, я в них сам участвую.. :) Обясните почему это в КОРНЕ НЕ ВЕРНО. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 14:06 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
2Aleksey-K Да не в корне. Я же говорю что слишком категорично получилось. Читайте пост выше. Ну а касательно размеров. Все равно когда-нибудь БД превысит размеры оперативки. Лучше больше уделить внимания оптимизации запросов. Вообще выбор guid в качестве PK не одназначен, я лично не вижу серьезных ограничений по его использованию. Кроме того вы считаете что размер PK является одним из узкий мест влияющих на производительность системы в целом? В этом я абсолютно не уверен. Я уже достаточно видел разных систем. Но еще не видел не одной где одно из главных узких мест было бы использование uniqueidentifier вместо identity. А вот проблемы с IDENTITY периодически возникают. Еще раз недостатки IDENTITY 1) Массовое добавление записей с возвратом ID 2) Работа с оторванными данными типа Web Services. Надо как-то возвращать кучу данных с новыми айдюками, что очень неприятно. 3) Merge Replication. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 14:32 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Crip Да не в корне. Я же говорю что слишком категорично получилось. Читайте пост выше. Виноват, долго писал ответ и не увидел ваш пост... Исправлюсь и не буду отвечать сразу :) Crip Ну а касательно размеров. Все равно когда-нибудь БД превысит размеры оперативки. Лучше больше уделить внимания оптимизации запросов. Двумя руками за, но...У меня оптимизация начинается с выбора структуры базы данных и, в том числе, выборе подходящих типов данных для столбцов. Скажу больше, в моей практике, эта фаза проектирования оказывала РЕШАЮЩЕЕ значение на производительность системы в целом. Crip Вообще выбор guid в качестве PK не одназначен, я лично не вижу серьезных ограничений по его использованию. Я тоже, ... кроме большой избыточности (как я показал, не бесплатной) в случае НЕ распределенной базы данных. Crip Кроме того вы считаете что размер PK является одним из узкий мест влияющих на производительность системы в целом? В этом я абсолютно не уверен. А разве мои прикидочные расчеты вас в этом не убедили!? Если таблицы при хранении одного и того же объема ПОЛЕЗНОЙ информации имеет размер на ... мбайт меньше, это не аргумент? Crip А вот проблемы с IDENTITY периодически возникают. Еще раз недостатки IDENTITY 1) Массовое добавление записей с возвратом ID А в чем тут проблемма при использовании IDENTITY? Crip 2) Работа с оторванными данными типа Web Services. Надо как-то возвращать кучу данных с новыми айдюками, что очень неприятно. А при UNIQUEIDENTIFIER их возвращать не надо ? Или вы их на клиенте генерите? Crip 3) Merge Replication. Это тоже не аргумент. Если вы внимательно изучали Merge Replacation в SQL Server 2000, то, должны знать, что UNIQUEIDENTIFIER (если не находит) Wizard добавляет в таблицы сам и использует эти поля НЕ ДЛЯ ИДЕНТИФИКАЦИИ строки, а для отслеживания ВО ВРЕМЕНИ изменений в строках реплицированных таблицах всех участников репликации. А IDENTITY вы при этом можете использовать, как использовали раньше. При чем Agent репликации может сам меняет ДИНАМИЧЕСКИ SCOPE IDENTITY (Seed и Increment) с целью получения на всех серверах - участниках репликации непересекающиеся множества значений полей IDENTITY. С уважением, Алексей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 15:03 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
Здравствуйте, Все! Извините, что вмешиваюсь, но очень уж атуальная тема для меня лично. Мне кажется, что обсуждение действительно затронуло вопросы использования GUID в SQL Server'e (кластерные индексы, размер таблиц и т. д.). Это ,конечно тоже интересно, но хотелось бы услышать мнение коллег по вопросам, возникающим при испоьзовании его в VFP-клиенте. С уважением, Сергей. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 16:03 |
|
||
|
Работа с полем UNIQUEIDENTIFIER (sql server)
|
|||
|---|---|---|---|
|
#18+
2Aleksey-K GUID генерим на клиенте с помощью WinAPI. Касательно размеров все понятно. Только вот какой процент составляет размер PK от общей величины строки. Обычно это не более 3-5%. Существенно? Отчасти да. И вслучае VLDB это может даже существенно увеличить размер БД. Но только в этом случае! Если предполагается наличие миллиардов записей, то тут уже нужно выбирать, потому как каждый лишний байт превращается в лишние несколько Гб данных. А то что вы говорили про оптимизацию структуры, то это к выбору между guid и identity не относится. Как правило в структуре практической любой БД находятся места переделка которых ускорит работу намного быстрее чем замена guid на identity. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.03.2006, 16:20 |
|
||
|
|

start [/forum/topic.php?fid=41&msg=33622711&tid=1592018]: |
0ms |
get settings: |
9ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
177ms |
get topic data: |
11ms |
get forum data: |
2ms |
get page messages: |
82ms |
get tp. blocked users: |
1ms |
| others: | 211ms |
| total: | 515ms |

| 0 / 0 |
