|
Программирование >> Руководство по sql
Имена таблицы и столбца определяют столбец, который вы собираетесь индексировать, и таблицу, которой он принадлежит. Чтобы проиндексировать таблицу authors по столбцу auid, нужно выполнить следующую команду: SQL: create index auidind on authors(au id) Лучще всего выполнять индексирование при создании таблицы, однако SQL также позволяет создавать индексы и после заполнения таблиц данными. Во многих системах поддерживаются составные индексы (composite indexes) - индексы, использующие несколько столбцов, и уникальные индексы (unique indexes) - предотвращающие дублирование данных. В некоторых системах реализованы групповые индексы (clustered index) с возможностью не только логической, но и физической сортировки. Уточните в справочном руководстве по своей системе, какими типами индексов вы располагаете. Составные индексы. Составные индексы используются, когда одновременно лучще осуществлять поиск по двум или нескольким столбцам, что объясняется их логической взаимосвязью. Например, таблица authors имеет составной индекс на основе столбцов аиJname и aujname. При создании составного индекса нужно указать все соответствующие столбцы. Команда, создающая составной индекс по таблице authors, может иметь следующий вид: SQL: create index aunameind on authors (au lname, au fname) В больщинстве диалектов SQL порядок столбцов при создании составного индекса не обязательно должен повторять их порядок в операторе CREATE TABLE. Например, столбцы aujname и аи Jname могут быть перечислены в операторе создания индекса в обратном порядке. Однако, с точки зрения производительности, лучще первым указывать столбец, по которому чаще всего выполняется поиск. Уникальные индексы. Уникальность означает, что никакие две строки не могут иметь индексы с одинаковыми значениями. В этом случае при создании индекса и при каждом добавлении информации система будет следить за тем, чтобы значения индексов не повторялись. Уникальные индексы обычно создаются на ключевых столбцах, чтобы усилить их возможности как уникальных идентификаторов строк. Создавать уникальные индексы имеет смысл только тогда, когда это диктуется самими данными. Например, не нужно создавать уникальный индекс по столбцу last name, так как даже в таблице всего из нескольких сотен строк наверняка найдется несколько человек с фамилиями Smith или Wong. С другой стороны, целесообразно создать уникальный индекс по столбцу с номерами карточек социального страхования. В этом случае уникальность является характеристикой данных: эти номера обязательно различаются у разных людей. Кроме того, уникальные индексы служат в качестве гаранта целостности. Одинаковые номера карточек социального страхования свидетельствуют об ошибке ввода данных или просчете государственной службы. Реализации SQL, поддерживающие уникальные индексы, должны иметь для этого специальные механизмы. Обычно система гарантирует уникальность, отбрасывая команды, которые пытаются выполнить следующее. Создать уникальный индекс на существующих данных, которые содержат одинаковые значения. Изменить данные, на основе которых построен уникальный индекс, таким образом, чтобы в них появились одинаковые значения. Для создания составных и простых (одностолбцовых) индексов применяется ключевое слово UNIQUE. Групповые индексы. Некоторые системы управления реляционными базами данных предоставляют пользователям выбор между групповыми и нефупповыми индексами. При создании группового индекса строки таблиц сортируются таким образом, что их физический порядок на устройстве базы данных совпадает с их логическим (индексным) порядком. Поскольку групповой индекс управляет физическим положением данных, таблица может иметь только один такой индекс. Групповые индексы обычно создаются на первичных ключах, но целесообразнее использовать для их построения столбцы с наиболее часто запрашиваемой информацией. При использовании негруппового индекса физический порядок строк не совпадает с их индексным порядком. Все нефупповые индексы таблицы могут обеспечивать доступ к данным в разном порядке. Поиск данных с использованием фупповых индексов почти всегда выполняется быстрее поиска с нефупповыми индексами. Это преимущество особенно ощутимо, когда из базы данных извлекается целый набор строк с последовательными ключевыми значениями (key values). Как только будет найдена сфока с первым ключевым значением, дальнейший поиск прекращается, так как сфоки с последовательными индексными значениями физически располагаются друг за другом. Однако наличие группового индекса может замедлять выполнение операторов модификации данных, так как системе требуется время на пересфойку индекса при изменении ключевых значений. Как, что и зачем нужно индексировать Индексирование ускоряет процесс выборки данных. После создания индекса по столбцу, запрос, который до этого требовал для своего выполнения достаточно много времени, может офаботать почти мгновенно. Так почему же не проиндексировать все столбцы? Одна из основных причин не делать этого состоит в том, что посфоение и поддержка индексов требует времени и места на устройстве базы данных. Другая причина связана с тем, что вставка, удаление или изменение данных в индексированных столбцах требует несколько большего времени, чем в неиндек-сированных, так как при изменении ключевых значений системе необходимо дополнительное время на пересфОйку индекса. Однако это обычно компенсируется за счет увеличения производительности при выборке данных. в общем случае имеет смысл индексировать только часто используемые в запросах столбцы, в первую очередь ключевые столбцы и столбцы, используемые для объединения и сортировки. Вот несколько более точных рекомендаций. Обычно должны индексироваться: столбцы с первичными ключами, особенно если они часто используются в операциях объединения с другими таблицами. Уникальные индексы на первичных ключах предотвращают появление в них одинаковых значений и гарантируют, что каждое значение в столбце первичного ключа будет однозначно идентифицировать сфоку; столбцы, по которым часто выполняется сортировка; столбцы, постоянно используемые в операциях объединения, так как в этом случае объединение будет выполняться бысфее; столбцы, по фуппам значений которых часто выполняется поиск, особенно если система поддерживает групповые индексы. Как только будет найдена строка с первым искомым значением, дальнейший поиск прекращается, так как сфоки с последовательными значениями физически располагаются друг за другом. При поиске единственного значения фупповые индексы такими преимуществами не обладают. Существует ряд случаев, в которых применение индексов нецелесообразно. Индексирование столбцов, которые редко используются в запросах, не приведет к повыщению производительности, так как их значения очень редко или вообще не используются при поиске и выборке строк из базы данных. Однако и в этом случае индексирование можно применять для обеспечения уникальности значений столбца. Не имеет смысла индексировать столбцы только с двумя-тремя значениями (например, с описанием пола). Индексирование не приводит к ощутимому выифыщу на небольших таблицах с несколькими строками. В этом случае для поиска информации обычно используется простое сканирование таблицы (table scan) - поочередный просмотр строк, а не индекс. Время такого сканирования пропорционально количеству строк в таблице. Индексирование является довольно сложной темой. Чтобы правильно его использовать, необходимо понимать, как работает системный оптимизатор запросов и какие требования с точки зрения производительности выдвигаются к вашему приложению. Вообще говоря, нужно начинать с построения очевидно необходимых индексов, а затем следить за получаемой производительностью на этапах разработки прототипа и тестирования. Когда вы поймете, что вам необходимо, сможете должным образом настроить и индексы. СОЗДАНИЕ ТАБЛИЦ С ПОМОЩЬЮ ОГРАНИЧЕНИЙ SQL-92 Большинство коммерческих систем поддерживают предложения (офаничения) PRIMARY KEY, UNIQUE, DEFAULT, CHECK, REFERENCES и FOREIGN KEY в команде CREATE TABLE в соответствии со стандартом SQL-92. Эти элементы обеспечивают защиту целостности данных. PRIMARY KEY помечает столбец (в котором не могут присутствовать нулевые значения) в качестве первичного ключа таблицы. Каждое вводимое в этот столбец значение должно быть уникальным, ввод одинаковых значений не допускается. Внутренняя реализация этого ограничения различается от системы к системе, но часто она эквивалентна индексу. Если первичный ключ включает несколько столбцов, PRIMARY KEY определяется на уровне таблицы. UNIQUE также гарантирует отличие между всеми значениями в столбце, но допускает в нем одно нулевое значение. DEFAULT определяет значение, которое автоматически вставляется системой, если пользователь не введет требуемые данные. Например, можно определить значение по умолчанию для столбца type в таблице titles. Если книга еще не классифицирована, то система могла бы автоматически вставлять в этот столбец любое назначенное вами значение, например слово unclassified (не классифицирована). Если значение по умолчанию не определено, но столбец type допускает нулевые значения, система автоматически вставит вместо неизвестных данных значение NULL. CHECK определяет, какие данные могут вводиться в определенный столбец, т.е. позволяет определить область значений столбца. Например, вы можете захотеть, чтобы в столбец titlejd всегда вводилось значение, состоящее из двух букв и четырех цифр, а в столбец type - один из шести допустимых терминов. Если пользователь попытается нарушить это ограничение, соответствующая команда модификации данных выполняться не будет. Эти ограничения иногда называются прави.тами (rules), поскольку позволяют проверить принадлежность вводимых данных области значений данного столбца. Правила, использующие несколько столбцов, определяются на уровне таблицы.
|
© 2006 - 2024 pmbk.ru. Генерация страницы: 0
При копировании материалов приветствуются ссылки. |