powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с полем UNIQUEIDENTIFIER (sql server)
25 сообщений из 32, страница 1 из 2
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33619631
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
(VFP8, база на SQL Server 2000)
Для уникального поля таблиц у нас исторически использовался тип CHAR(36) (not null default newid()). И все было ОК.
Буквально недавно узнал, что правильнее (со стороны сервера) использовать тип UNIQUEIDENTIFIER (default newid()). А как фокс работает с этим полем, нормально? Я ни каких недостатков не нашел (и через CAD и pass-through).
Но прежде, чем перейти на тотальное использование, хочется услышать мнение тех, кто работает с UNIQUEIDENTIFIER - не ожидают ли меня в будущем какие-нибудь грабли с стороны фокса?
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622005
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Лично я его не использовал. Разбирался только в самом начале.

Однако работа с ним должна быть даже проще чем с полями типа Identity поскольку значение этого поля можно получить ДО физического создания записи. Это существенно упрощает весь процесс программирования.

Собственно, с точки зрения FoxPro - это обычное символьное поле C(36). Какие проблемы при работе с символьными полями?
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622067
Пиффон
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А проще всего загялунть в BOL. Да ?
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622617
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У меня проблемы с этим типом значений. Фокс отказывался работать с ним. Вроде символная строка, но когда я делал проверку типа значений через TYPE то фокс выдал команду U!
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622711
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Недоходящийно когда я делал проверку типа значений через TYPE то фокс выдал команду U!
Не может быть! У меня "С" выдает. (VFP 8).
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622722
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
P.S. Только не через TYPE, а VARTYPE конечно.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622871
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_SP.S. Только не через TYPE, а VARTYPE конечно.
А какая разница?! Только в ковычках (для TYPE) или без ковычек (для VARTYPE) переменная.
С уважением, Алексей.
А если серьезно, то использование типа данных UNIQUEIDENTIFIER в качестве Primary Key для таблицы имеет не только положительные моменты (о них уже ВладимирМ сказал), но и отрицательные:
1. Длина. Integer - 4 - байта, а UNIQUEIDENTIFIER - 16 байт. В 4 !!! раза больше. На больших таблицах вы получите огромный проигрыш в размерах таблицы (и тем более в размере ВСЕХ некластерных индексов, если по UNIQUEIDENTIFIER построен кластерный индекс) и в конечном итоге, в скорости запросов. Если при этом вам не требуется уникальность "в пределах вселенной", а достаточно обеспечить уникальность в пределах таблицы, то тип данных UNIQUEIDENTIFIER явно избыточен.
2. При построении суррогатного PK (Primary Key - первичный ключ) на основание свойства поля IDENTITY вы получаете монотонно возврастающую (или убывающую) последовательность. Если при этом вы строите по этому полю кластерный индекс (это не всегда верно, но для некоторых таблиц - хорошее решение), то вы получаете минимум физических перестроений таблицы при ее изменений. Для индекса по UNIQUEIDENTIFIER это не верно.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33622957
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-K2. При построении суррогатного PK (Primary Key - первичный ключ) на основание свойства поля IDENTITY вы получаете монотонно возврастающую (или убывающую) последовательность. Если при этом вы строите по этому полю кластерный индекс (это не всегда верно, но для некоторых таблиц - хорошее решение), то вы получаете минимум физических перестроений таблицы при ее изменений

По подробнее пожалуйста, почему кластерный PK на IDENTITY в основном решение не правильное.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623020
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
PaulWist
По подробнее пожалуйста, почему кластерный PK на IDENTITY в основном решение не правильное.
А я не сказал, что "в основном решение не правильное"!
Я сказал "это не всегда верно, но для некоторых таблиц - хорошее решение".
Если есть сомнения и в этом утверждении, то могу изложить свои соображение, подкрепленные примерами. Хотя, это скорее вопрос другой конференции (SQL Server), а там по выбору кластерного индекса (он один только, бедняга на всю таблицу) столько копий в свое время было поломано...

С уважением, Алексей
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623044
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KА я не сказал, что "в основном решение не правильное"!
Я сказал "это не всегда верно, но для некоторых таблиц - хорошее решение".
Если есть сомнения и в этом утверждении, то могу изложить свои соображение, подкрепленные примерами. Хотя, это скорее вопрос другой конференции (SQL Server), а там по выбору кластерного индекса (он один только, бедняга на всю таблицу) столько копий в свое время было поломано...


Алексей.

Готов выслушать Ваши соображения, не потому что есть сомнения, а потому что хотелось бы "углУбить" (М.С. Горбачев) свои представления.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623054
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Aleksey-K:
А так понял, Вы с SQL Server через pass-throuhg работаете?
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623082
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Sergej_STo Aleksey-K:
А так понял, Вы с SQL Server через pass-throuhg работаете?
ТОЛЬКО через pass-throuhg.
С уважением, Алексей
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623106
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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) как родной.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623165
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Что-то слишком категоричное получился пост, да еще и скомканным.
Короче говоря на скорости запросов это отражается не сильно, хотя сетевой траффик незначительно возрастает.
А вот скорость построения кластерного индекса по GUID практически не уступает identity. Это связано с тем что для последовательного ключа возникает конкуренция за выделение новых страниц под индекс, что не имеет место в случае GUID. Вообщем результат скорость добавления записей приблизительно одинакова. Может с небольшим приемущество у identity за счет меньшего размера.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623192
Sergej_S
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Aleksey-KТОЛЬКО через pass-throuhg
Ясно. А с через CAD. Поэтому GUID нужен, чтобы перед инсертом его иметь на клиенте.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623289
PaulWist
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crip Это связано с тем что для последовательного ключа возникает конкуренция за выделение новых страниц под индекс, что не имеет место в случае GUID.

Надо ли это понимать, что всегда для GUID не возникает конкуренции или это среднестатистическая оценка.

Насколько я понимаю при генерации GUID вероятность получения "рядом" лежащих значений не равна нулю, поэтому какая-то конкуренция всё равно возникает, правда она меньше чем у IDENTITY именно при последовательном получении ключа.

С другой стороны при реализации B-дерева возникновение нового значения GUID может быть в любом листе и соответственно просто конкуренция за страницу размазывается по всему индексу.

Да, похоже, что получение блокировок для GUID меньше чем для IDENTITY.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623354
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2PaulWist
Поищите в форуме по сиквелу. Там народ это подробно разбирал и тесты проводил. Получите более квалифицированный ответ.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623429
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По поводу выбора в качестве кластерного индекса....
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.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623509
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для 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.
С уважением, Алексей
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623528
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Crip
Это вообще в корне неверно. Почитайт внимательно форум по сиквелу.

Я эти форумы не читаю, я в них сам участвую.. :)
Обясните почему это в КОРНЕ НЕ ВЕРНО.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623657
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Aleksey-K
Да не в корне. Я же говорю что слишком категорично получилось. Читайте пост выше.

Ну а касательно размеров. Все равно когда-нибудь БД превысит размеры оперативки. Лучше больше уделить внимания оптимизации запросов.
Вообще выбор guid в качестве PK не одназначен, я лично не вижу серьезных ограничений по его использованию.
Кроме того вы считаете что размер PK является одним из узкий мест влияющих на производительность системы в целом? В этом я абсолютно не уверен.
Я уже достаточно видел разных систем. Но еще не видел не одной где одно из главных узких мест было бы использование uniqueidentifier вместо identity.
А вот проблемы с IDENTITY периодически возникают.
Еще раз недостатки IDENTITY
1) Массовое добавление записей с возвратом ID
2) Работа с оторванными данными типа Web Services. Надо как-то возвращать кучу данных с новыми айдюками, что очень неприятно.
3) Merge Replication.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623797
Фотография Aleksey-K
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
С уважением, Алексей.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33623989
Sergey-D
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте, Все!
Извините, что вмешиваюсь, но очень уж атуальная тема для меня лично.
Мне кажется, что обсуждение действительно затронуло вопросы использования GUID в SQL Server'e (кластерные индексы, размер таблиц и т. д.). Это ,конечно тоже интересно, но хотелось бы услышать мнение коллег по
вопросам, возникающим при испоьзовании его в VFP-клиенте.
С уважением, Сергей.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33624055
Crip
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2Aleksey-K
GUID генерим на клиенте с помощью WinAPI.

Касательно размеров все понятно. Только вот какой процент составляет размер PK от общей величины строки. Обычно это не более 3-5%. Существенно? Отчасти да. И вслучае VLDB это может даже существенно увеличить размер БД.
Но только в этом случае! Если предполагается наличие миллиардов записей, то тут уже нужно выбирать, потому как каждый лишний байт превращается в лишние несколько Гб данных.
А то что вы говорили про оптимизацию структуры, то это к выбору между guid и identity не относится. Как правило в структуре практической любой БД находятся места переделка которых ускорит работу намного быстрее чем замена guid на identity.
...
Рейтинг: 0 / 0
Работа с полем UNIQUEIDENTIFIER (sql server)
    #33624110
Недоходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В дополнений меня волует то что я писал ранее. что тип UNIQUEIDENTIFIER не понимает. как заставить фокс понимать эту значения как символьные?
...
Рейтинг: 0 / 0
25 сообщений из 32, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Работа с полем UNIQUEIDENTIFIER (sql server)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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