powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вариации на тему "Identity"
30 сообщений из 30, показаны все 2 страниц
Вариации на тему "Identity"
    #32025056
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Слышал от умных людей, что существует два принципиально разных подхода к определению идентити: синтетический идентити и натуральный. Первый - предлагаемые средствами Microsoft-a, второй - уникальный код типа Name+ID+...
Кто-нибудь знает, о чем идет речь?
Просветите чайника, пожалуйста.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025060
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вы путаете identity с первичным ключом.
Проектировщики баз данных до сих пор спорят какой подход выбора PK лучше, использовать ли только естественный ключ или можно использовать суррогатный. Противники суррогатного ключа считают, что проектировщики которые его используют таким образом прячут свои ошибки в выборе РК. Я бы посоветовал Вам почитать кого нибудь из классиков по этой теме. Если я ничего не путаю то Дэйт за использование суррогатных ключей.
Лично я использую суррогатный ключ, но при этом выделяю естественный и объявляю его АК.

P.S. Суррогатный ключ не обязательно является identity.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025080
Oleg F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добавлю к предыдущему, что естественный ключ обычно определяется на этапе логического проектирования и затем отображается в физическую модель данных.
Суррогатный ключ создаётся в двух случаях
1) Невозможно определить уникальный естественный ключ
2) Уникальный естественный ключ существует, но для целей ускорения доступа к данным удобнее использовать суррогатный ключ. Обычно это бывает в тех случаях, когда размер естественного ключа слишком велик и(или) он включает в себя множество элементов данных.

Например, типичными суррогатными ключами являются "серия и номер паспорта", "ИНН" и т.п. Разумеется, МВД могло бы идентифицировать человека можно идентифицировать с помощью его естественный признаков, например "Фамилия, Имя, Отчество, Дата рождения, Место рождения". Но очевидно, что естественный ключ слишком громоздкий и удобнее использовать более короткий искусственно созданный идентификатор.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025082
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В догонку хотел бы добавить, что естественный ключ имеет тенденцию изменятся (например человек сменил фамилию), что с точки зрения проектирования БД не есть хорошо. Во многих случаях приходится еще хранить историю изменения, так что наверное искусственный ключ лучше во всех отношениях, кроме одного момента - если требуется собирать общую БД с удаденных БД. Тут уже без естественных ключей не обойтись, хотя для таких целей лучше задействовать искусственные ключи как PK и естественные как AK.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025106
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое спасибо за ответы и за поправку - конечно, не Identity, а Primary Key. Sorry, это все от избытка холестерина в голове
Дело было заведено вот по какому поводу. Я все время использовал суррогатный ключ с помощью идентити. Тут все понятно.
Но недавно пришлось столкнуться с чужой базой, где ключ натуральный, и, как вы говорили, "громоздкий". Только вот почему-то этот громоздкий ключ не был кластерным. По-моему, это должно жутко все тормозить. Но забава в том, что база от професииональной software-ной конторы, и сомневаюсь, что это просто просчет. Может, здесь где-то особый прикол?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025110
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
По-моему, это должно жутко все тормозить

При SELECT - да, при INSERT - возможно и нет. Представьте себе добавление/обновлении записи, которое из-за кластерного индекса по натуральному ключу(скажем на основе той же фамилии) должно попасть в середину таблицы. Представили сколько будет "стоить" такое добавление(и обновление тоже)? А вот с суррогатным ключом на основе того же identity картина будет совершенно другая.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025116
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Но забава в том, что база от професииональной software-ной конторы

Абсолютно ни о чем не говорит
конторы они разные бывают
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025118
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Меня удивляет то, что все таблицы(и довольно немалые таблицы) в этой попавшейся мне базе были построены на большом количестве некластерных индексов. Насколько я знаю SQL, при наличии основного кластерного индекса, все остальные строятся как бы поверх его, что достаточно струтуризирует дерево. Если такого первичного кластерного индекса нет, то и остальные работают менее эффективно.
Насколько выгодно использовать в больших таблицах естественные некластерные индексы, или лучше завести один кластерный с помощью неприхотливого identity и больше никогда его не трогать? Бог с ним - с обобщением данных из разных таблиц.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025121
Glory
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IMHO слово "выгодно" всегда нужно употреблять с "для чего". Поскольку "выгодно для всего" - это из области мечты.
А сначала можно определиться, что за истема будет OLTP или OLAP.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025125
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>Насколько я знаю SQL, при наличии основного кластерного индекса, все остальные строятся как бы поверх его, что достаточно струтуризирует дерево.

Неправильно знаете
кластерный индекс может быть, а может и не быть и он никак не связан с некластерным, а вот когда какой удобно использовать почитайте в BOL, а то описывать много придется.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025132
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я имел в виду вот это отличие:

Nonclustered indexes can be defined on either a table with a clustered index or a heap. In Microsoft® SQL Server™ version 7.0, the row locators in nonclustered index rows have two forms:

If the table is a heap (does not have a clustered index), the row locator is a pointer to the row. The pointer is built from the file ID, page number, and number of the row on the page. The entire pointer is known as a Row ID.

If the table does have a clustered index, the row locator is the clustered index key for the row. If the clustered index is not a unique index, SQL Server 7.0 adds an internal value to duplicate keys to make them unique. This value is not visible to users; it is used to make the key unique for use in nonclustered indexes. SQL Server retrieves the data row by searching the clustered index using the clustered index key stored in the leaf row of the nonclustered index.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025133
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Glory
Речь идет об OLTP. Тяжелая такая бухгалтерия с множеством записей в таблицах. Соответственно, Insert & Update работают постоянно. Что для нее посоветуете?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025175
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Bootmaker

Не думаю что это существенное отличие, всего лишь по разному строятся указатели, сути это не меняет. Кластерный индекс - листьями являются записи, некластерный - листьями являются указатели. Кластерный выгоднее когда нужно по критерию получить запись, некластерный будет очень быстрым, когда нужно выбирать значения только тех полей, которые указаны в where.
И как здесь уже замучались советовать, сомневаешься - собери типовые запросы и скорми их ITW.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025208
Oleg F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Это программный продукт какой-то, как он полностью называется и от какой фирмы ?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025215
Oleg F
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не берите в голову. Я знаю людей, которые не первый год работают с SQL Server-ом и вообще не знают, что такое кластерный индекс. И всегда создают некластерные. Всё нормально работает.
Зато знаю проблемы, которые возникали у слишком "умных" разработчиков, которые не по делу использоватил кластерные индексы и получали из-за снижение производителности при операциях INSERT и UPDATE. Создавая некластерный индекс, разработчик в отдельных случаях рискует дисковым пространством в БД и незначительным замедлением поиска (по сравнению с кластерным) при извлечении строк из таблицы по этому некластерному индексу. Создавая кластерный индекс, разработчик рискует потерять производительность при модификации значений в столбцах, относящихся к кластерному индексу. Так что для каждой конкретной таблицы нужно выбирать наименьшее зло.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025228
Genady
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>И всегда создают некластерные.

Скорее всего это они так думали, на РК кластерный индекс создается по умолчанию если не указать обратное
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025253
Dankov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Господа, эта тема неисчерпаема. Здесь нету четкого и однозначного ответа. Если бы он был, то споры не возникали бы вновь и вновь на протяжении лет.
Ссылка по теме, достаточно информативная: http://www.akzhan.midi.ru/devcorner/articles/NaturalKeysVersusAtrificialKeysByTentser.html
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025254
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо за вашу помощь.
Так что же, все-таки такое - ITW?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025276
BootMaker
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Скажите все-таки, умные люди, зависит ли эффективность некластерного индекса от наличия кластерного индекса по колонке identity?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025287
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
>...на РК кластерный индекс создается по умолчанию если не указать обратное
В SQL2000 - да. В 7.0 по умолчанию именно некластерный. Как я пониаю, продукт наклепан именно на версии 7.0 (на 2000 просто еще мало кто чего успел).

>Так что же, все-таки такое - ITW?
Index tuning wizard

>зависит эффективность некластерного индекса от наличия кластерного индекса по колонке identity.
Ну вот, то identity, то pk, то снова identity... Ранее вы, уважаемый, говорили, что "где ключ натуральный, и, как вы говорили, "громоздкий"". Подозреваю, что это все-таки не identity, а pk. Так вот, если ключ действительно громоздкий, то лучше его кластерным не делать. И вообще первичным ключом лучше не делать. Ибо в этом случае на ваш вопрос можно ответить - да, зависит - чем он кластернее, тем хужее... Если он легкий (identity, например), то ответ на вопрос прямо противоположный. Опять же не во всех случаях. Могут быть ситуации, когда pk (и identity иже с ним) вообще не нужен. Ну просто некому него него ссылаться. В этом случае его наличие приводит к совершенно никчемному увеличению размера записи. А если он кластерный, то к замедлению операции добавления/модификации записей. Одним словом, все неоднозначно...
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025376
Michael+Hopgarden
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
2 Garya
> В 7.0 по умолчанию именно некластерный

А как же тогда понимать BOL 7.0
Creating and Modifying PRIMARY KEY Constraints
...
SQL Server automatically creates a unique index to enforce the uniqueness requirement of the PRIMARY KEY constraint. If a clustered index does not already exist on the table, or a nonclustered index is not explicitly specified, a unique, clustered index is created to enforce the PRIMARY KEY constraint.
...
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025598
Фотография Garya
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Приношу извинения. Видимо, я не совсем правильно понял смысл сказанного и не совсем в ту степь высказался. Я имел в виду работу по созданию таблиц в EM 7.0. При установки в свойствах поля флажка индексирования clustered становится доступным, но по умолчанию сброшен. Такая же история, если щелкныть в панели инструментов на значке ключего поля и посмотреть, какой индекс у него образовался. Выясняется, что некластерный. Кластерность приходилось ручками прикручивать. В 2000 в EM кластерность по полю PK проставляется автоматом по умолчанию.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025619
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Зато знаю проблемы, которые возникали у слишком "умных" разработчиков, которые не по делу использоватил кластерные индексы и получали из-за снижение производителности при операциях INSERT и UPDATE. Создавая некластерный индекс, разработчик в отдельных случаях рискует дисковым пространством в БД и незначительным замедлением поиска (по сравнению с кластерным) при извлечении строк из таблицы по этому некластерному индексу.

2 Oleg F
Я не согласен с тем, что некластерный индекс всегда медленне кластерного, в некоторых случаях он работает быстрее когда в запросе перечислены поля (имею ввиду то что перечисленно в Select,Where,group by), которые имеются в некластерном индексе. То в этом случае серверу не приходится читать страницы с данными а использует информацию последних страниц индекса. В результате получается аналог кластерного. Вот на примере у меня была громоздкая таблица, в которой было 50 млн. записей.
(КодСлучая,КодМедуслуги,Стоимость,Количество) медуслуги оказанные пациенту в случае определямом КодСлучая. Когда я собрался оптимизировать запрос у меня был всего один некластерный индекс по полю КодСлучая, ну я решил проверить что же посоветует Index Tuning Wizard и он мне посоветовал создать некластерный по 4 полям, я сперва не понял, но сделал и производидельность резко возросла. Затем когда прочел статью о том как устроены кластреные индексы и некластерные и что в некоторых случаях некластерный индекс работает аналогично кластерному я решил создать кластерный по полю КодСлучая дабы сэкономить 1,5-2 Гига. Место действительно сэкономил, но производительность на выборках упала на 10% . В результате я отказался от кластерного, лучше потратить лишних 2 Гига, и выиграть как в Select так и при Insert.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025621
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
To Алексей.
Я не совсем понял Ваш пример. Последнее описываемое создание - кластерный индекс по полю КодСлучая. Это в дополнение к уже имеющемуся некластерному по 4 полям? И после этого этот некластерный стал меньше? А выборка по 4 полям этого некластерного индекса замедлилась?
Если это так, то мне непонятно, как так может быть - поиск и выборка значений из индекса, физический размер индекса меньше, а выполнение медленнее.
Вам не кажется, что это нонсенс какой-то?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025630
qu-qu
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Смирнов

>> Я не совсем понял Ваш пример... И после этого этот некластерный стал меньше?

Судя по контексту примера (хоть явно это и не указано) - составной индекс был дропнут, а вместо него - создан кластерный по полю 1-нственного критерия выборки. Из-за того и экономия в 1.5-2 Гига .

>> как так может быть - поиск и выборка значений из индекса, физический размер индекса меньше, а выполнение медленнее...

Ну да, в индексе остались только данные по полю критерия ( КодСлучая ), остальные данные для выборки - приходится считывать по ссылке из страниц данных, потому и замедлилась выборка, т.к. в некластерном составном индексе - все нужные поля уже лежали рядом с полем критерия... ИМХО, потеря 10%-ов производительности для такого случая - вполне нормальная "цена" за 2 Гига экономии места.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025641
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
qu-qu правильно меня понял. Прошу прощения за то что не написал, что некластерный по 4 полям был удален и взамен был создан кластерный по одному полю КодСлучая. Поэтому и вышла экономия места, но производительность упала на 10%.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025657
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну в этом случае падение производительности вполне закономерно и объяснимо.
Но тогда некорректно сравнение этих двух вариантов: некластерный по 4 полям и кластерный по одному полю, если выборка по 4 полям первого индекса. А Вы не пробовали вариант с обоими индексами одновременно.
Как в отношении объёмов, так и в отношении производительности?
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025695
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Не я непробовал. Просто долго создавать такие индексы на таблице в 50 млн. записей. Да и на такой машине с 192 метрами оперативки и с одним IDEшным винтом. Но как мне кажется, может я и ошибаюсь, но процессор запросов даже при наличии двух индексов кластерного по одному полю и некластерного по 4 полям будет использовать в запросе некластерный индекс.
Ведь не просто так Index Tuning Wizard посоветовал для оптимизации сделать именно некластерный по 4 полям, а не кластерный по одному полю.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025700
Фотография Алексей
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Владимир Смирнов.
Я боюсь что первый раз неправильно вас понял по поводу

Вы не пробовали вариант с обоими индексами одновременно.
Как в отношении объёмов, так и в отношении производительности?

Что вы хотели этим сказать? создать индекс кластерный по 4 полям проверить запрос, а затем некластерный по 4 полям и сравнить оба результата в Как в отношении объёмов, так и в отношении производительности?
Так я не пробовал.
...
Рейтинг: 0 / 0
Вариации на тему "Identity"
    #32025709
Владимир Смирнов
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
То Алексей
Я имел в виду следующее: создать кластерный индекс для одного поля "КодСлучая" - точнее кластерный PK.
Плюс к этому создать некластерный индекс для 4 полей, по которым делается выборка.
Так как тип поля "КодСлучая" видимо int, то некластерный индекс станет меньше, а производительность на этих выборках - та-же.
Ну а кластерный PK для поля типа int вообще практически не увеличит размер таблицы.
...
Рейтинг: 0 / 0
30 сообщений из 30, показаны все 2 страниц
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вариации на тему "Identity"
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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