Модераторы: skyboy

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Про выбор СУБД подходящих индексов БД 
V
    Опции темы
maxipub
Дата 4.6.2013, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Добрый день, уважаемые!

Там подправляю один проект, идут запросы типа:

Код
SELECT * FROM t1 INNER JOIN t2 ON t2.id=t1.id WHERE t1.balance>100 AND t2.status='ok';


Привожу в виду:
Код
SELECT * FROM t1 INNER JOIN t2 ON (t2.id=t1.id AND t2.status='ok') WHERE t1.balance>100;


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

По t2.id есть индекс, я сделал еще один, составной индекс (t2.id, t2.status). Но когда смотрю через EXPLAIN, в колонке key идет все равно только t2.id! Почему так? Составной индекс в possible_keys есть, но оптимизатор его не выбирает. Собственно, основной вопрос вот в чем: я слышал что у СУБД есть какие-то хитрые анализаторы, которые ведут статистику по реальным запросам к реальным данным, и уже на основе ее (а не просто анализируя структуру самой БД), принимают решение какой индекс выгодней использовать. Это правда? Если да, то можно как-то посмотреть, какой индекс СУБД предпочтет на "голой" системе?
PM MAIL   Вверх
Akina
Дата 4.6.2013, 13:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
Так зачем на собирать огромную таблицу, если

Сперва ответьте на вопрос - зачем какой-то [censored] залепил в текст запроса звёздочку вместо того, чтобы перечислить реально необходимые поля?

Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
Привожу в виду

Поскольку связывание внутреннее - то НИЧЕГО не изменилось, кроме внешнего вида запроса. После обработки препарсером оба запроса поступят к оптимизатору в абсолютно одинаковом виде.
Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
Я не эксперт в MySQL, но догадываюсь что в любом случае вначале будет клепаться JOIN-таблица

Нет.

Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
слышал что у СУБД есть какие-то хитрые анализаторы, которые ведут статистику по реальным запросам к реальным данным, и уже на основе ее (а не просто анализируя структуру самой БД), принимают решение какой индекс выгодней использовать. Это правда?

Изучайте:
http://dev.mysql.com/doc/refman/5.5/en/whe...imizations.html
http://dev.mysql.com/doc/refman/5.5/en/mysql-indexes.html

Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
можно как-то посмотреть, какой индекс СУБД предпочтет на "голой" системе? 

 smile а что есть "голая система"?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 4.6.2013, 13:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  4.6.2013,  13:49 Найти цитируемый пост)
а что есть "голая система"?

На которой не крутилась конечная БД.

Для теста сдампил базу на другой сервер. Там выбирается составной ключ. Версии 5.1.61 и 5.1.40 соответственно, не думаю что в этом делом. Пока что пошел читать ссылки, благодарю!
PM MAIL   Вверх
Akina
Дата 4.6.2013, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  4.6.2013,  14:56 Найти цитируемый пост)
На которой не крутилась конечная БД.

Не понял... на пустой структуре без данных, что ли? так это же бессмысленно! план запроса радикальнейшим образом зависит от наполнения и статистики таблиц... более того - со временем он из-за изменения статистики может и поменяться.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
maxipub
Дата 4.6.2013, 14:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  4.6.2013,  14:07 Найти цитируемый пост)
Не понял... на пустой структуре без данных, что ли?

Ну я имею в виду что есть сервер, где крутится БД. Добавляю туда составной индекс, но СУБД не желает его использовать (по крайней мере в EXPLAIN после добавления этого индекса). Скидываю дамп этой БД на сервер, где ее никогда не было. И на новом месте EXPLAIN показывает что выбирается составной индекс.

Цитата(maxipub @  4.6.2013,  13:20 Найти цитируемый пост)
Собственно, основной вопрос вот в чем: я слышал что у СУБД есть какие-то хитрые анализаторы, которые ведут статистику по реальным запросам к реальным данным, и уже на основе ее (а не просто анализируя структуру самой БД), принимают решение какой индекс выгодней использовать. Это правда?

Т.е. ответ на этот вопрос, я так понял, положительный?
PM MAIL   Вверх
Zloxa
Дата 4.6.2013, 14:17 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  4.6.2013,  15:07 Найти цитируемый пост)
Не понял... на пустой структуре без данных, что ли?

Я так понял человек начитался про CBO (cost based optimization) и влияние на планы запроса качества статистики, которая может собираться не на автомате.

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


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 4.6.2013, 14:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  4.6.2013,  15:14 Найти цитируемый пост)
Добавляю туда составной индекс, но СУБД не желает его использовать (по крайней мере в EXPLAIN после добавления этого индекса). 

И правильно - нафига он ей? для запроса он ничего не даёт, а по размеру больше.

Цитата(maxipub @  4.6.2013,  15:14 Найти цитируемый пост)
Скидываю дамп этой БД на сервер, где ее никогда не было. И на новом месте EXPLAIN показывает что выбирается составной индекс.

Поработает - тоже перестанет использоваться. А на старом сервере - сделай ANALYZE TABLE...

Добавлено через 1 минуту и 52 секунды
Цитата(maxipub @  4.6.2013,  15:14 Найти цитируемый пост)
Т.е. ответ на этот вопрос, я так понял, положительный? 

http://dev.mysql.com/doc/refman/5.5/en/exe...nformation.html


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 4.6.2013, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  4.6.2013,  15:18 Найти цитируемый пост)
А на старом сервере - сделай ANALYZE TABLE... 

О... Услышал  smile 
Больше так умничать не буду  smile 


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 4.6.2013, 14:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  4.6.2013,  15:20 Найти цитируемый пост)
О... Услышал   
Больше так умничать не буду    

А напрасно... его статистика - вовсе не то же самое, что статистика у Оракла или там постгресса... Некое CBO там, конечно, имеется - но навылет ненастраиваемое. Не нравится план - force/ignore index в руки, а все грабли - за свой счёт.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 4.6.2013, 14:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(maxipub @  4.6.2013,  14:20 Найти цитируемый пост)
Почему так? Составной индекс в possible_keys есть, но оптимизатор его не выбирает.

Есть понятие селективность предиката. Если 99% записей у нас имеют значение 'ok', то уточнение предиката доступа по индексу этим значением статуса практически не повлияет на стоимость доступа, возможно даже негативно скажется.

В случае, же если у нас лишь 1% записей имеет значение 'ok', то, наверное, было бы предпочтительнее иметь обособленный индекс по статусу  и в качестве лидирующей таблицы для соединения выбирать t2

Это сообщение отредактировал(а) Zloxa - 4.6.2013, 14:33


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
maxipub
Дата 4.6.2013, 14:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  4.6.2013,  13:49 Найти цитируемый пост)
Поскольку связывание внутреннее - то НИЧЕГО не изменилось, кроме внешнего вида запроса.

Т.е. прасер сам в любом случае приведет запрос к единому виду, по возможности максимально ограничив JOIN? Ведь JOIN, насколько я понимаю, в любом случае будет приводить с созданию временной таблицы? А выгодней сделать таблицу меньше - это и быстрей, и поиск по ней проще. Т.е. на такие вещи можно не заморачиваться, парсер сам позаботится?

Цитата(Akina @  4.6.2013,  14:18 Найти цитируемый пост)
для запроса он ничего не даёт, а по размеру больше.

По размеру больше. Но как это ничего не дает? Если идет

Код
ON t2.id=t1.id AND t2.status='ok'


Это ж не OR. В случае, когда для t2 используется индекс только по id, для status придется пройтись по таблице из всех удовлетворяющих нас id. Разве (id, status) тут не дает выгоды? Ничего не понимаю... smile Если это имеет значение, stats - ENUM, т.е. фактически целочисленный тип.

Ссылочки читаю потихоньку, давно в англ не практиковался. smile

Добавлено через 8 минут и 17 секунд
Просто эта каша вообще из-за чего заварилась.

Я всегда стараюсь использовать максимально простые запросы. Но недавно дорабатывалась одна функция, вышел запрос на 4 таблицы. Жутко тормозил - 25 секунд выполнялся. Начал его ковырять... И совершенно неожиданно для себя обнаружил, что запретив использование одного из индексов по таблице (это был одиночный индекс INT поля), type сменился с eq_ref на ALL. НО! Скорость выросла В 5 РАЗ! smile До сих пор в шоке. Как использование простого индекса может к такому привести? Пока еще пиляю запрос, уже удалось добиться скорости порядка 0,45 сек, но все равно еще крайне плохо, нужно не выше 0,1. Но пока уперся, и дальше никак. Вот и решил разобраться в этом всем деле чуть основательней. smile
PM MAIL   Вверх
Zloxa
Дата 4.6.2013, 14:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



maxipub, 
Я вам посоветую вот что
1) Определиться, какой из предикатов отсекает бОльшую часть набора "t1.balance>100" или же "t2.status='ok'"
2a) Если первый предикат более селективен, индекс по t1.balance и паре (t2.id,t2.status)
2б) Если второй предикат более селективен, индекс по t2.status и паре (t1.id,t1.balance)

если индекс не используется - форсить.

Если по каждому из предикатов отсекается < 80% данных, возможно затея с индексами вобще тухла и фулсканы будут предпочтительнее.


Это сообщение отредактировал(а) Zloxa - 4.6.2013, 14:52


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 4.6.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  4.6.2013,  15:36 Найти цитируемый пост)
Т.е. прасер сам в любом случае приведет запрос к единому виду, по возможности максимально ограничив JOIN? 

Первое, что делает парсер - преобразует JOIN во WHERE.

Цитата(maxipub @  4.6.2013,  15:36 Найти цитируемый пост)
JOIN, насколько я понимаю, в любом случае будет приводить с созданию временной таблицы?

Где ты это вычитал?



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 4.6.2013, 14:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(maxipub @  4.6.2013,  15:36 Найти цитируемый пост)
. Как использование простого индекса может к такому привести? 

Доступ по индексу = сканирование индекса + сканирование таблицы. Если селективность предиката слишком низка, фуллсканить может оказаться выгднее.

Но чтобы в пять раз... думаю просто план стал совсем другой, другой индекс стал испольоваться.

Это сообщение отредактировал(а) Zloxa - 4.6.2013, 14:55


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
maxipub
Дата 4.6.2013, 15:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(Akina @  4.6.2013,  14:54 Найти цитируемый пост)
Где ты это вычитал?

Ну это как-то логически выходит. Хотя, если...

Цитата(Akina @  4.6.2013,  14:54 Найти цитируемый пост)
Первое, что делает парсер - преобразует JOIN во WHERE.

То мой мир вообще перевернулся. Я всегда считал что JOIN создает временную таблицу, в которой всё перечисленное из таблиц склеивается, и к этой таблице уже применяется WHERE.

Только что пересмотрел профилирование простого запроса с JOIN, действительно, не создается. Черт.

Zloxa, t1.balance>100 отсекает почти все, t2.status='ok' почти ничего. Т.е. берем индекс по t1.balance и паре (t2.id,t2.status) - как я и делаю. Но почему тогда Akina пишет:
Цитата(Akina @  4.6.2013,  14:18 Найти цитируемый пост)
И правильно - нафига он ей? для запроса он ничего не даёт, а по размеру больше.

?

- поспешил, потерто - smile

Это сообщение отредактировал(а) maxipub - 4.6.2013, 15:28
PM MAIL   Вверх
Akina
Дата 4.6.2013, 15:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(maxipub @  4.6.2013,  16:18 Найти цитируемый пост)
мой мир вообще перевернулся. Я всегда считал что JOIN создает временную таблицу

Посмотрите http://dev.mysql.com/doc/refman/5.5/en/ind...timization.html


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 4.6.2013, 16:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(maxipub @  4.6.2013,  16:18 Найти цитируемый пост)
Но почему тогда Akina пишет:

потому что если статус у вас не отекает почти ничего (селективность предиката высока) - преимущества использования этого индекса против индекса по id - не очевидны. Два индекса вам точно не нужны. Нужен ли индекс по паре - сомнительно. Вполне есть смысл задуматься окупятся ли расходы на его содержание профитом от его использования. И если  врезультате этих раздумий таки решите что - да, имеет смысл дропнуть индекс по id, ибо индекс по паре (id,status) может быть использван для тех же целей, для каких может быть использован индекс по id

Добавлено @ 16:10
Цитата(Zloxa @  4.6.2013,  17:06 Найти цитируемый пост)
ибо индекс по паре (id,status) может быть использван для тех же целей, для каких может быть использован индекс по id

хотя....

Akina, мася умеет такую хрень:
Код

create index mytable$idx on mytable(id,status);
alter table mytable add constraint mytable$pk primary key (id) using index mytable$idx;

?

Добавлено @ 16:15
Цитата(Akina @  4.6.2013,  16:44 Найти цитируемый пост)
index-merge-optimization.html

Это же совсем не о том... здесь нет индекс мержа.  smile 
Здесь реньжскан индекса по balanse>100 + нестед луп, с уник/реньжскану  по индексу t2.id

Это сообщение отредактировал(а) Zloxa - 5.6.2013, 10:33


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
maxipub
Дата 5.6.2013, 10:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Парни, очень признателен за помощь! За эти сутки узнал много нового, по-другому начал смотреть на это дело. Утро вечера мудренее, тот мутный запрос уже удалось ускорить с 25 до <0.05сек smile ну еще раза в два ускорить, и я буду совсем доволен. smile 

Такой еще вопрос по теме: а можно при JOIN как-то явно указать лидирующую таблицу? Просто я уверен что сейчас она не оптимальная, хотя бы попробовать что будет. Запихнул все индексы нового лидера в IGNORE, выполняет полное сканирование, но все равно выбирает эту таблицу! Можно как-то явно указать приоритетную?

И если у кого есть что интересного по теме, желательно на русском, буду рад ссылочкам. И инглыш тоже. МАН хорош, но местами суховат, описание, пример-другой, а особенностей применения не особо.
PM MAIL   Вверх
maxipub
Дата 5.6.2013, 10:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 517
Регистрация: 22.10.2009

Репутация: 1
Всего: 1



Цитата(maxipub @  5.6.2013,  10:28 Найти цитируемый пост)
а можно при JOIN как-то явно указать лидирующую таблицу?

узнал про STRAIGHT_JOIN smile
PM MAIL   Вверх
Akina
Дата 5.6.2013, 12:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  4.6.2013,  17:06 Найти цитируемый пост)
мася умеет такую хрень:

Не понял, что имеется в виду... если про то, что раньше первичным был один индекс, а теперь он стал обычный, а первичным стал другой - запросто.

Цитата(Zloxa @  4.6.2013,  17:06 Найти цитируемый пост)
Здесь реньжскан индекса по balanse>100 + нестед луп, с уник/реньжскану  по индексу t2.id

А вот хрен его знает, что мускуль выберет - на нестед луп свет клином не сошёлся... может же быть, что он использует два составных индекса и мерже джойн по ним? ну так, чисто в теории... или хэш джойн... 




--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.6.2013, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  5.6.2013,  13:30 Найти цитируемый пост)
Не понял, что имеется в виду... если про то, что раньше первичным был один индекс, а теперь он стал обычный, а первичным стал другой - запросто.

использовать для контроля ограничения первичного/уникального ключа составной, не уникальный индекс, содержащий в себе перечисление большего количество полей нежели нужны для контроля ограничения.

Т.е. не уникальный индекс по (id,status), а ограничение ПК по (id) использует этот индекс

Добавлено через 4 минуты и 21 секунду
Цитата(Akina @  5.6.2013,  13:30 Найти цитируемый пост)
 может же быть, что он использует два составных индекса и мерже джойн по ним? ну так, чисто в теории... или хэш джойн... 

Может... но и в этих сценариях нет индексмержинга ))

Добавлено через 6 минут и 52 секунды
Цитата(Akina @  5.6.2013,  13:30 Найти цитируемый пост)
мерже джойн 

В оракле, кстате, очень не популярный метод жойна.


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.6.2013, 12:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  5.6.2013,  13:35 Найти цитируемый пост)
использовать для контроля ограничения первичного/уникального ключа составной, не уникальный индекс, содержащий в себе перечисление большего количество полей нежели нужны для контроля ограничения.

Составной первичный индекс? Да пжалста. Причём по текстовым полям можно не всё поле в индекс, а только необходимый префикс. 

Цитата(Zloxa @  5.6.2013,  13:35 Найти цитируемый пост)
Т.е. не уникальный индекс по (id,status), а ограничение ПК по (id) использует этот индекс

ааа... не, вот чего нет того нет.



--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.6.2013, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  5.6.2013,  13:46 Найти цитируемый пост)
чего нет того нет

оракля в этом отношении вобще умняшка... может даже сам определить, что для поддержания ограничения нового индекса не надо
Код

SQL> create table idx_test(id number,val number);
Table created
SQL> create index idx_test$idx on idx_test (id,val);
Index created
SQL> alter table idx_test add constraint idx_test$pk primary key (id);
Table altered
SQL> select index_name,uniqueness from user_indexes where table_name = 'IDX_TEST';
INDEX_NAME                     UNIQUENESS
------------------------------ ----------
IDX_TEST$IDX                   NONUNIQUE
SQL> select constraint_name,index_name from user_constraints where table_name = 'IDX_TEST';
CONSTRAINT_NAME                INDEX_NAME
------------------------------ ------------------------------
IDX_TEST$PK                    IDX_TEST$IDX



--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.6.2013, 14:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Цитата(Zloxa @  5.6.2013,  14:29 Найти цитируемый пост)
оракля в этом отношении вобще умняшка... может даже сам определить, что для поддержания ограничения нового индекса не надо

Угу... вот только у него так получается, что часть индекса - первична и уникальна, а сам индекс - NONUNIQUE. Не сообразил, аднака... косячок-с...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.6.2013, 14:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  5.6.2013,  15:04 Найти цитируемый пост)
 косячок-с..

да нет косячка, нормуль все.

Структура уникального индекса ничем не отличается от структуры не уникального индекса. Если уж на то пошло, уникальный индекс сам по себе - пережиток старины. Для контроля целостности должны использоваться ограничения, а не индексы. Для своей работы ограничения могут требовать наличия индекса(и даже строить его самостоятельно, при создании). В общем-то индекс это просто некая вспомогательная структура данных, к логической организации данных отношения никоим местом иметь не должная. Но т.к. у нас есть богатое историческое наследие использования индексов для контроля целостности...

Это сообщение отредактировал(а) Zloxa - 5.6.2013, 14:36


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.6.2013, 14:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



Не... я всего лишь о голом факте, что данный индекс (ну или комбинация полей) по факту является уникальной, в то время как согласно выводу числится неуникальной на том основании, что таковое требование не наложено в составе ограничения при создании либо изменении индекса.

Если, к примеру, не сильно опытный разработчик, ориентируясь только на сведения об уникальности, сделает допустимым дублирование, и в результате уткнётся в отражёнку - будет не совсем красиво, правда? а ведь вроде бы как всё честно, индекс неуникален - а даёт отлуп...  smile кстати, при нарушении уникальности при занесении данных в таблицу именно такой структуры - как именно будет выглядеть отражёнка? любопытно...


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Zloxa
Дата 5.6.2013, 15:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Чо?
****


Профиль
Группа: Завсегдатай
Сообщений: 3473
Регистрация: 12.9.2008

Репутация: 33
Всего: 161



Цитата(Akina @  5.6.2013,  15:54 Найти цитируемый пост)
, что данный индекс (ну или комбинация полей) по факту является уникальной

В том то все и дело. Повторюсь. Уникальный и не уникальный индекс имеют одинаковую структуру. Если бы уникальный имел более оптимальную какуюнить струтуру хранения, логику построения, строить его по заведомо уникальным полям имело бы какой-то смысл.

Цитата(Akina @  5.6.2013,  15:54 Найти цитируемый пост)
Если, к примеру, не сильно опытный разработчик, ориентируясь только на сведения об уникальности

Сведения о требовании уникальности сохранены в структуре данных ограничением первичного ключа. Обеспечиватеся это требование уникальным ли индексом - не уникальным ли - какая разница?

Цитата(Akina @  5.6.2013,  15:54 Найти цитируемый пост)
любопытно

Код

SQL> insert into idx_test (id) values (1);
1 row inserted

SQL> insert into idx_test (id) values (1);
insert into idx_test (id) values (1)
ORA-00001: unique constraint (ZLOXA.IDX_TEST$PK) violated


с уникальным индексом - то же самое.
Код

SQL> create table idx_test2(id number);
Table created

SQL> create unique index idx_test2$unc on idx_test2(id);
Index created

SQL> insert into idx_test2 values (1);
1 row inserted

SQL> insert into idx_test2 values (1);
insert into idx_test2 values (1)
ORA-00001: unique constraint (ZLOXA.IDX_TEST2$UNC) violated

Надо заметить, что в ошибке сказано про ограничение, хотя ограничения, как такового не прописано и оно нигде не числится.
Код

SQL> select count(*) from user_constraints where constraint_name = 'IDX_TEST2$UNC';
  COUNT(*)
----------
         0


Однако, надо отдать должное, что исторически исключение ORA-00001 в PL/SQL имеет мнемонику dup_val_on_index

Это сообщение отредактировал(а) Zloxa - 5.6.2013, 15:17


--------------------
Достоверно известно, что 89% людей доверяют статистике взятой с потолка smile
PM   Вверх
Akina
Дата 5.6.2013, 15:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Советчик
****


Профиль
Группа: Модератор
Сообщений: 20581
Регистрация: 8.4.2004
Где: Зеленоград

Репутация: 106
Всего: 454



То есть он правильно именно в констрейнт носом тычет. Гуд. 

Цитата(Zloxa @  5.6.2013,  16:08 Найти цитируемый пост)
Повторюсь. Уникальный и не уникальный индекс имеют одинаковую структуру.

Да понятно это - условие реально отделено от индекса.


--------------------
 О(б)суждение моих действий - в соответствующей теме, пожалуйста. Или в РМ. И высшая инстанция - Администрация форума.

PM MAIL WWW ICQ Jabber   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | MySQL | Следующая тема »


 




[ Время генерации скрипта: 0.0810 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.