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

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

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

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

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

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

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
13.03.2002, 16:12
    #32025133
BootMaker
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вариации на тему "Identity"
2 Glory
Речь идет об OLTP. Тяжелая такая бухгалтерия с множеством записей в таблицах. Соответственно, Insert & Update работают постоянно. Что для нее посоветуете?
...
Рейтинг: 0 / 0
14.03.2002, 08:04
    #32025175
Genady
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вариации на тему "Identity"
2 Bootmaker

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

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

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

>зависит эффективность некластерного индекса от наличия кластерного индекса по колонке identity.
Ну вот, то identity, то pk, то снова identity... Ранее вы, уважаемый, говорили, что "где ключ натуральный, и, как вы говорили, "громоздкий"". Подозреваю, что это все-таки не identity, а pk. Так вот, если ключ действительно громоздкий, то лучше его кластерным не делать. И вообще первичным ключом лучше не делать. Ибо в этом случае на ваш вопрос можно ответить - да, зависит - чем он кластернее, тем хужее... Если он легкий (identity, например), то ответ на вопрос прямо противоположный. Опять же не во всех случаях. Могут быть ситуации, когда pk (и identity иже с ним) вообще не нужен. Ну просто некому него него ссылаться. В этом случае его наличие приводит к совершенно никчемному увеличению размера записи. А если он кластерный, то к замедлению операции добавления/модификации записей. Одним словом, все неоднозначно...
...
Рейтинг: 0 / 0
15.03.2002, 10:31
    #32025376
Michael+Hopgarden
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вариации на тему "Identity"
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
18.03.2002, 18:33
    #32025598
Garya
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вариации на тему "Identity"
Приношу извинения. Видимо, я не совсем правильно понял смысл сказанного и не совсем в ту степь высказался. Я имел в виду работу по созданию таблиц в EM 7.0. При установки в свойствах поля флажка индексирования clustered становится доступным, но по умолчанию сброшен. Такая же история, если щелкныть в панели инструментов на значке ключего поля и посмотреть, какой индекс у него образовался. Выясняется, что некластерный. Кластерность приходилось ручками прикручивать. В 2000 в EM кластерность по полю PK проставляется автоматом по умолчанию.
...
Рейтинг: 0 / 0
19.03.2002, 06:05
    #32025619
Алексей
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вариации на тему "Identity"
Зато знаю проблемы, которые возникали у слишком "умных" разработчиков, которые не по делу использоватил кластерные индексы и получали из-за снижение производителности при операциях INSERT и UPDATE. Создавая некластерный индекс, разработчик в отдельных случаях рискует дисковым пространством в БД и незначительным замедлением поиска (по сравнению с кластерным) при извлечении строк из таблицы по этому некластерному индексу.

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

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

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

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

Ну да, в индексе остались только данные по полю критерия ( КодСлучая ), остальные данные для выборки - приходится считывать по ссылке из страниц данных, потому и замедлилась выборка, т.к. в некластерном составном индексе - все нужные поля уже лежали рядом с полем критерия... ИМХО, потеря 10%-ов производительности для такого случая - вполне нормальная "цена" за 2 Гига экономии места.
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Вариации на тему "Identity" / 25 сообщений из 30, страница 1 из 2
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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