Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Glory
SandalTree
Там какой-то потаённый смысл в 2-х одинаковых индексах или это просто баг?

Я вам про это уже говорил
Primary KEY, Unique Constraint - это только _декларация_
Грубо говоря, только запись в списке объектов, которая ссылается на другой _физический_ объект.
Физическим же объектом для этих ограничений всегда является индекс.

Ваши два вопроса с собеседования на мой взгляд были заданы для того, чтобы выяснить, понимате ли вы разницу между физическим и логическим уровнями.
В таблице но одном и том же поле построено абсолютно два одинаковых индекса, один из которых создан как Unique Constraint, а другой как Unique Index.

В чём смысл наличия обоих индексов - вот мой вопрос.
Даже SSMS не рассматривает Unique Constraint как собственно Constraint.

И кстати, не надо меня макать. Эти "Вопросы на собеседовании" я сам придумал. Если вы знаете и хотите помочь, помогите.

К сообщению приложен файл. Размер - 28Kb
19 ноя 13, 13:10    [15154130]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Александр52
Member

Откуда: Кокосовые острова ส็็็็็
Сообщений: 5136
SandalTree, зачем вы задаете на собеседовании вопросы, на которые сами не можете ответить?
19 ноя 13, 13:21    [15154216]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
SandalTree
В таблице но одном и том же поле построено абсолютно два одинаковых индекса, один из которых создан как Unique Constraint, а другой как Unique Index.

И в третий раз - Primary/Unique Constraint автоматически выполнятет create index. Всегда.
Сам по себе Constraint выполняет только декларативную роль.
Т.е. нет никаких двух индексов. Если только вы не создали явно еще индексы. Которые вы можете создавать всегда и которые не будут иметь к Constraint никакого отношения.
19 ноя 13, 13:25    [15154245]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
любитель вопросов на собеседован
Guest
Glory
SandalTree
Там какой-то потаённый смысл в 2-х одинаковых индексах или это просто баг?

Я вам про это уже говорил
Primary KEY, Unique Constraint - это только _декларация_
Грубо говоря, только запись в списке объектов, которая ссылается на другой _физический_ объект.
Физическим же объектом для этих ограничений всегда является индекс.

Ваши два вопроса с собеседования на мой взгляд были заданы для того, чтобы выяснить, понимате ли вы разницу между физическим и логическим уровнями.
Вячеслав, по-моему вы не совсем правы. Unique Constraint срабатывает раньше уникального индекса. На этом основании, как мне кажется, физическая реализация тоже несколько отличается. Доказывать прямо сейчас не готов, сам не проверял. Если будет час-другой - попробую посмотреть.
19 ноя 13, 13:26    [15154255]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
капец
Guest
SandalTree,

вы не сандальное, а скандальное дерево.
3 раза уже Глори ответил: консрейнт это ДЕКЛАРАЦИЯ, индекс -- его реализация.
вот код выполните и насладитесь:
create table t(id int);
alter table t add constraint t_id_uq unique(id);

создаете КОНСТРЕЙНТ, а "за сценой" создается индекс для его поддержания.
и имена у них поэтому одинаковые
19 ноя 13, 13:29    [15154276]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
любитель вопросов на собеседован
Вячеслав, по-моему вы не совсем правы. Unique Constraint срабатывает раньше уникального индекса. На этом основании, как мне кажется, физическая реализация тоже несколько отличается.

Фейспалм какой то.
19 ноя 13, 13:30    [15154284]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Александр52
SandalTree, зачем вы задаете на собеседовании вопросы, на которые сами не можете ответить?
Беседую с вами. Тут тоже не все могут на эти вопросы ответить.
19 ноя 13, 13:35    [15154314]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
SandalTree
Тут тоже не все могут на эти вопросы ответить.

Ага, найдите различия между красным и соленым...
19 ноя 13, 13:37    [15154329]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Гость333
Member

Откуда:
Сообщений: 3683
SandalTree
В таблице но одном и том же поле построено абсолютно два одинаковых индекса, один из которых создан как Unique Constraint, а другой как Unique Index.

Unique Constraint был создан без указания имени, наверняка в DDL таблицы после имени столбца просто приписали UNIQUE.
Для создания индекса написали отдельную DDL-инструкцию, не посмотрев, что уже есть Unique Constraint.
Мелкий баг, не более.
create table MyTable (id int unique);

create unique index ui_MyTable_id on MyTable(id)
19 ноя 13, 13:44    [15154389]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Glory
SandalTree
В таблице но одном и том же поле построено абсолютно два одинаковых индекса, один из которых создан как Unique Constraint, а другой как Unique Index.

И в третий раз - Primary/Unique Constraint автоматически выполнятет create index. Всегда.
Сам по себе Constraint выполняет только декларативную роль.
Т.е. нет никаких двух индексов. Если только вы не создали явно еще индексы. Которые вы можете создавать всегда и которые не будут иметь к Constraint никакого отношения.


Я вам и скрипт привёл и картинку показал что в "msdb.dbo.log_shipping_primary_databases" два одинаковых индекса, а вы мне пытаетесь доказать что их нет.

Давайте быть конструктивными.
1. Создание Unique Constraint автоматически выполнятет create index
2. Дополнительный уникальный нефильтрованый индекс по тому-же полю будет попросту игнорироваться и лишь замедлять работу на инсертах.

Поправьте меня если я не прав.
19 ноя 13, 13:51    [15154429]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Гость333
SandalTree
В таблице но одном и том же поле построено абсолютно два одинаковых индекса, один из которых создан как Unique Constraint, а другой как Unique Index.

Unique Constraint был создан без указания имени, наверняка в DDL таблицы после имени столбца просто приписали UNIQUE.
Для создания индекса написали отдельную DDL-инструкцию, не посмотрев, что уже есть Unique Constraint.
Мелкий баг, не более.
create table MyTable (id int unique);

create unique index ui_MyTable_id on MyTable(id)
Спасибо. Я не был уверен, поэтому и поинтересовался.
19 ноя 13, 13:52    [15154440]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
SandalTree
Я вам и скрипт привёл и картинку показал что в "msdb.dbo.log_shipping_primary_databases" два одинаковых индекса, а вы мне пытаетесь доказать что их нет.

Вы привели картинку, где один кострайнт создал два индекса ?
Покажите мне код, где один кострайнт создал два индекса
19 ноя 13, 13:53    [15154445]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ограничения unique constraint описаны в стандарте ANSI SQL. Понятия "индекс" в ANSI SQL нет вообще. Никаких указаний относительно реализации unique constraint тоже нет. Теоретически, при insert/update можно сканировать всю таблицу в поисках дублированных значений — и требования стандарта в части UQ будут выполнены.

Конечно, в любой СУБД unique constraint реализуется при помощи индекса. То, что в MSSQL имя индекса, реализующего UQ, всегда совпадает с именем UQ — это особенности MSSQL. В некоторых других СУБД имена индекса и констрейнта при желании могут отличаться.
19 ноя 13, 13:56    [15154473]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
o-o
Guest
я вообще не понимаю, к кому претензии-то?
вопрос надо задать тому, кто создал повторяющийся индекс.
видно же из имен, что первый создан автоматически при декларации уникальности,
как написал Гость333, а второй кто-то добавил, осознанно дав ему имя.
что сервер позволяет дублировать индексы не есть гуд, дело давно известное и вот тут описанное:
SQL Server lets you create completely redundant and totally duplicate indexes
там же можно скачать код для поиска задублированных индексов.

а у меня вот есть подозрение, кто автор повторного индекса с картинки.
это тот, кто спросил "где констрейнт?", не найдя его в папочке контрейнтов.
наверное потому что не читал, что папка для CHECK CONSTRAINTS.
а юники надо в ключах искать, они же по сути ключи и есть.
просто всего один из них можно выбрать как PRIMARY
19 ноя 13, 14:01    [15154514]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Glory
SandalTree
Я вам и скрипт привёл и картинку показал что в "msdb.dbo.log_shipping_primary_databases" два одинаковых индекса, а вы мне пытаетесь доказать что их нет.

Вы привели картинку, где один кострайнт создал два индекса ?
Покажите мне код, где один кострайнт создал два индекса
Глоря, вы это сами придумали и сами с собой спорите.

Гость333 уже подтвердил что я нашёл баг. И ничего особенного в этом нет.

Если вы считаете что это не баг, то тогда расскажите как система будет использовать индекс "uc1lsprimary_databases".
19 ноя 13, 14:03    [15154525]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
o-o
а у меня вот есть подозрение, кто автор повторного индекса с картинки.
это тот, кто спросил "где констрейнт?", не найдя его в папочке контрейнтов.
наверное потому что не читал, что папка для CHECK CONSTRAINTS.
а юники надо в ключах искать, они же по сути ключи и есть.
просто всего один из них можно выбрать как PRIMARY
Ну это как-бы неожиданно от создателей MSDB.
При том что это никто с версии 2008 его не заметил и не пофиксил.

Поэтому у меня и возник резонный вопрос: "А вдруг это зачем-то нужно?"
19 ноя 13, 14:06    [15154551]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Гость333
Member

Откуда:
Сообщений: 3683
o-o
что сервер позволяет дублировать индексы не есть гуд, дело давно известное и вот тут описанное:
SQL Server lets you create completely redundant and totally duplicate indexes

Вот, кстати, да.
Проверил сейчас на sqlfiddle поведение разных серверов. Oracle единственный возмутился на дубликат индекса: ORA-01408: such column list already indexed. Остальные (MSSQL, MySQL, PostgreSQL) такое пропустили без проблем.
19 ноя 13, 14:11    [15154581]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
o-o
Guest
SandalTree
Гость333
create table MyTable (id int unique);

create unique index ui_MyTable_id on MyTable(id)
Спасибо. Я не был уверен, поэтому и поинтересовался.


о, мне кажется, я правильно улавливаю суть происходящего.
не было никакого собеседования (что, в общем-то, потом было автором заявлено)
увидал "задвоение индекса", но почему-то не провел простейший эксперимент
(то, что сделал Гость333), а придумал "вопрос для собеседования".
чтоб "оправдать" себе наличие задвоенного индекса, либо убедиться, что все же второй индекс можно удалить
этакий "непрямой" подход спросить себе интересное, не компрометируя себя
19 ноя 13, 14:11    [15154584]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
SandalTree
Глоря, вы это сами придумали и сами с собой спорите.

Гость333 уже подтвердил что я нашёл баг. И ничего особенного в этом нет.

Баг - это когда что-то работает не так, как задумано/описано/декларировано.
Что в вашем примере работает неправильно ?
Где-то написано, что нельзя создавать совпадающие индексы ?
19 ноя 13, 14:11    [15154595]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
SandalTree
Глоря, вы это сами придумали и сами с собой спорите.

Гость333 уже подтвердил что я нашёл баг. И ничего особенного в этом нет.

Баг - это когда что-то работает не так, как задумано/описано/декларировано.
Что в вашем примере работает неправильно ?
Где-то написано, что нельзя создавать совпадающие индексы ?

Думаю, это можно назвать performance bug. Из-за дублирующего уникального индекса имеем ничем не оправданное замедление DML-операций. Другое дело, что таблица крошечная, и для измерения этого замедления мощный микроскоп нужен.
19 ноя 13, 14:20    [15154647]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гость333
Думаю, это можно назвать performance bug. Из-за дублирующего уникального индекса имеем ничем не оправданное замедление DML-операций.

Проанализируйте sys.dm_db_index_usage_stats своей базы. Наверное там тоже найдутся кандидаты на "performance bug". Даже недблированные.

Сообщение было отредактировано: 19 ноя 13, 14:24
19 ноя 13, 14:23    [15154677]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
o-o
SandalTree
пропущено...
Спасибо. Я не был уверен, поэтому и поинтересовался.


о, мне кажется, я правильно улавливаю суть происходящего.
не было никакого собеседования (что, в общем-то, потом было автором заявлено)
увидал "задвоение индекса", но почему-то не провел простейший эксперимент
(то, что сделал Гость333), а придумал "вопрос для собеседования".
чтоб "оправдать" себе наличие задвоенного индекса, либо убедиться, что все же второй индекс можно удалить
этакий "непрямой" подход спросить себе интересное, не компрометируя себя
Ну не совсем так. Я просто писал процедурку по документированию вот мне и стало интересно различие, а когда взялся шерстить другие базы то наткнулся на этот дубликат.

В AdventureWorks такое меня не смутило, а вот в MSDB совсем другое дело.

У меня-то и записей в той таблице нет

К сообщению приложен файл. Размер - 9Kb
19 ноя 13, 14:27    [15154697]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
SandalTree
Member

Откуда: Перехлёсток восьми батог
Сообщений: 28146
Glory
Гость333
Думаю, это можно назвать performance bug. Из-за дублирующего уникального индекса имеем ничем не оправданное замедление DML-операций.

Проанализируйте sys.dm_db_index_usage_stats своей базы. Наверное там тоже найдутся кандидаты на "performance bug". Даже недблированные.
Глоря, но мы тебя всё равно уважаем.
19 ноя 13, 14:29    [15154709]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Glory
Гость333
Думаю, это можно назвать performance bug. Из-за дублирующего уникального индекса имеем ничем не оправданное замедление DML-операций.

Проанализируйте sys.dm_db_index_usage_stats своей базы. Наверное там тоже найдутся кандидаты на "performance bug". Даже недблированные.

Несомненно. Но если недублированные — это только кандидаты, то дублированные — это уже точно "performance bug", или "performance issue", не знаю как правильно :-)
19 ноя 13, 14:32    [15154738]     Ответить | Цитировать Сообщить модератору
 Re: Вопрос на собеседовании  [new]
Glory
Member

Откуда:
Сообщений: 104751
Гость333
Несомненно. Но если недублированные — это только кандидаты, то дублированные — это уже точно "performance bug", или "performance issue", не знаю как правильно :-)

Только какое отношение все это имеет к констрайнтам и индексам ?
И если я создам недублированный индекс, который не используется ни в одном запросе, то это никак не отразится на performance ?
А вот если создан дублированный, то сразу отразится ?

Сообщение было отредактировано: 19 ноя 13, 14:38
19 ноя 13, 14:36    [15154771]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: Ctrl  назад   1 2 [3] 4 5   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить