powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA: foreign key or index - what's better?
4 сообщений из 4, страница 1 из 1
ASA: foreign key or index - what's better?
    #32444521
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В продолжение темы оптимизации хочу спросить: что лучше использовать - внешний ключ или индекс?

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

Может, есть смысл налепить индексов вообще на все поля всех таблиц - и будет счастье? Но шестое чуйство подсказывает мне, что это не так. А как?
...
Рейтинг: 0 / 0
ASA: foreign key or index - what's better?
    #32444533
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
эта... а что общего у ключей и индексов извините? :)
У них разные области применения. foreign key - это обеспечение целостности связей между данными в разных таблицах. Не больше и не меньше.
А индексы - вспомогательная таблица для более быстрого поиска нужных записей. Опять таки - не больше и не меньше.

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

Смысл налепить индексы на все поля всех таблиц есть только в одном случае - если база используется исключительно для просмотра данных. При дополненни и изменении данных индексы будут постоянно перестраиваться и вся система начнет тормозить.
Вот у меня например есть консолидированная база с множеством индексов и много локальных баз в филиалах в которых вносятся данные, но те базы вообще без индексов (исключая автоматические индексы по первичным ключам :) Все очень даже прилично живет...
...
Рейтинг: 0 / 0
ASA: foreign key or index - what's better?
    #32444550
mustlive
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
автор
Вторичный ключ оптимизатором конечно может наверное учитываться, но он по определению не предназначен для поиска данных


Я тоже так думал. Вот только когда заменил в одной таблице индекс на вторичный ключ, запросы с этой таблицей стали шуршать быстрей процентов на 30. Что бы это значило???

авторВот у меня например есть консолидированная база с множеством индексов и много локальных баз в филиалах в которых вносятся данные, но те базы вообще без индексов (исключая автоматические индексы по первичным ключам :) Все очень даже прилично живет...

А у меня 50/50, поэтому вопрос индексации и поднимаю. Как бы сделать так, чтобы индексами не навредить? Пробовал лепить их "от балды" на все основные таблицы - выигрыша в скорости не получил. Поэтому и задаю вопрос
...
Рейтинг: 0 / 0
ASA: foreign key or index - what's better?
    #32444594
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В ASA на FOREIGN KEY автоматически неявно создается индекс. Так что явно индексируя поле внешнего ключа, Вы будете просто дублировать уже существующий индекс, он нигде не будет использоваться, зато будет тормозить и занимать лишнее место. В ASA 9.0 кстати внешний ключ даже можно указывать в кач-ве кластерного индекса.

Вообще в ASA как я заметил правила полезности индексации полей своеобразные и отличаются например от правил, которыми я руководствовался в MSSQL. У меня для себя как бы есть небольшой свод правил по поводу индексов, попытаюсь его озвучить:
1. Во многих общих случаях оптимизатору запросов выше крыши хватает PRIMARY KEY, FOREIGN KEY и UNIQUE CONSTRAINT (ну или UNIQUE INDEX). Строить еще какие дополнительные индексы нужно только имея веские доводы - например тормозит запрос и по плану запросов видно что ASA не может эффективно получить данные с таблицы, используя существующие индексы или же вообще производит TABLE SCAN.

2. Наличие TABLE SCAN в плане запроса не является поводом избавиться от него, пытаясь подогнать индекс. Это больше является поводом посмотреть, а какова селективность запроса. Если очень низкая (т.е. выбирается большинство записей из таблицы), то TABLE SCAN является вполне обоснованным - нет никакого смысла СУБД сначала читать весь индекс, чтобы потом все равно прочитать всю таблицу.

3. Для ASA 9.0 очень важно продумать политику кластерных индексов. При построении плана запроса кластерный индекс имеет некий приоритет, так как гарантирует упорядоченное чтение данных с таблицы. Честно говоря угадать сложно, какой индекс лучше сделать кластерным, так как впервую очередь, делая кластерный индекс стоит помнить о дефрагментации таблицы и стараться делать кластерным тот индекс, который наименее дефрагментировал бы таблицу при вставке новых записей, т.е. записи вставлялись бы по нарастающей сортировке, более менее соответствующей этому индексу. Конечно самый показательный пример такого индекса - это PRIMARY KEY на поле IDENTITY. Однако делать кластерным индексом PRIMARY KEY не панацея от бед, наоборот бывает иногда полезней сделать кластерным индексом FOREIGN KEY или UNIQUE INDEX (CONSTRAINT). Простой пример: есть 3 таблицы со связью один ко многим - Типы документов (10 записей), Шапка документов (1 000 000 записей) и Обьекты документов (10 000 000 записей). На Типы документов вообще кластерный индекс не нужен. На Шапку документов мы например, постоянно в запросах фильтруем и аггрегируем по типу документов и дате выписке. По умолчанию ASA будет использовать индекс внешнего ключа на тип документов. Однако если в среднем на один тип документа приходиться 100 000 шапок документов, то ASA при выполнении такого запроса должна просмотреть 100 000 записей в таблице и наложить фильтр на дату выписки документа. С другой стороны в день выписывается до 100 документов. Значит выгоднее сделать индекс по дате выписки и СУБД используя этот индекс найдет и просмотрит 100 записей в таблице, отфильтровав по типу документа. В шапку документов сами документы добавляются последовательно каждый день, значит индекс по дате является идеальным кандидатом на кластерный индекс, так как он исключает дефрагментирование таблицы. Далее смотрим на таблицу Обьекты Документов. Они зависят от Шапки документов и связанны с ними во всех запросах. В среднем на одну запись в шапке документов присутствует 10 записей в Обьектах документов. Значит наиболее эффективно для ASA будет использование при выполнении запросов индекса FOREIGN KEY. Так как обычно при занесении записи в шапку документа сразу заносятся подробности в обьекты документа, то индекс FOREIGN KEY является лучшим кандидатом на кластерный индекс.

4. Не стоит сильно увлекаться составными индексами. Они хороши для фильтрации, сортировке и группировке по таблице в запросах, но только при условии, что задействованны все поля индекса. Правда если продумать порядок вхождения полей в индекс, то при невхождении в фильтр запроса последних полей индекса ASA сможет им воспользоваться. Вообще про индексы стоит думать как про деревья - чем разветвленней и больше получается дерево, тем сложнее по нему лазить и искать. Соотвествующе во многих запросах частенько видно, как оптимизатор ASA, используя составные индексы, использует поиск только по первым полям этого индекса, отбрасывая остальные поля, которые с нашей точки здравого рассуждения могли и пригодиться. Однако оптимизатор делает более правильно, считая что вместо того, чтобы углубляться в дерево, легче по его верхнему уровню получить предварительный список указателей на записи в таблице и читая их по таблице просто отфильтровать. В качестве примера снова вернемся к примеру из пункта 3: в таблице Шапка документов я сделал кластерным индекс по дате выписки, хотя при выборке оптимизатору приходиться накладывать фильтр по типу документов. Казалось бы можно сделать составной индекс из полей Дата выписки + Тип документа, однако на самом деле это было бы менее эффективно, так как дерево индексов стало более глубоким и искать в нем было бы уже более накладно, чем просто отфильтровав нужные записи таблицы, плюс кластерный индекс уже стал бы частично дефрагментированым, так как нет гарантий, что при вводе записей в шапку документов будет по нарастающей вводиться не только по дате выписки, но и по типу документов.

Ну и на последок хочу заметить, что любая работа оптимизатора, принятие решения им насчет рациональности использования того или иного индекса, а то и TABLE SCAN напрямую зависит от статистики по полям таблиц, поэтому повторюсь - после массовых изменениях данных лучше всего ручками ее пересоздавать.
...
Рейтинг: 0 / 0
4 сообщений из 4, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / ASA: foreign key or index - what's better?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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