Как я могу оптимизировать этот SQL-запрос (используя индексы)?

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

Я не DBA, и я уже не знаю, как выбрать хороший индекс, чтобы сделать мой запрос быстрее. Я могу изменить структуры таблиц; для базы данных нет администратора баз данных, и у меня есть разрешения на сервере базы данных.

Как оптимизировать свой SQL-запрос?

1 ответ

Введение. Об этом много говорить, и из-за сложности SQL, для кого-либо будет невозможно помочь с вашим запросом полностью - это важно, каков ваш запрос, насколько велики таблицы и какая база данных используемая система. Если вы не знаете, какие индексы или как их использовать, см. Здесь: Как работает индексация базы данных? ,

Меры предосторожности: Опять же, если у вас есть администратор базы данных для вашей системы, проконсультируйтесь с ними, прежде чем индексировать что-либо, особенно в живой системе. Они могут даже помочь, если вы с ними милы. Если система используется многими другими, будьте осторожны, прежде чем менять что-либо вроде индексов. Если данные используются для нескольких типов запросов, убедитесь, что вы не создаете множество индексов для них, которые конфликтуют или перекрываются.

Синтаксис. В стандарте (SQL92) используется: CREATE INDEX [index name] ON [table name] ( [column name] ). Этот синтаксис должен работать практически на любой системе. Если вам нужен только один индекс в таблице, а кластерный индекс еще не существует, вы можете использовать: CREATE [Unique] Clustered INDEX [index name] ON [table name] ( [column name] ) - он должен быть уникальным, если не может быть нескольких элементов с одинаковыми значениями. Если вы не можете заставить это работать, см. Это сообщение для получения дополнительной информации. Как индексировать столбец базы данных.

Какие таблицы следует индексировать? Любая таблица, которая используется для запросов, особенно если данные статичны или только получает новые значения, является отличным кандидатом. Если таблица находится в вашем запросе и имеет оператор объединения, вы, вероятно, хотите иметь индекс для столбца (ов), который будет соединен.

Какие столбцы следует индексировать? Есть полные книги, написанные по выбору лучших индексов и правильному индексированию базы данных. Основное правило для индексации, если вы не хотите глубоко погрузиться в проблему, заключается в следующем: в следующем порядке:

  1. Присоединить предикаты (on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ)
  2. Отфильтрованные столбцы (where Table1.columnN=Bob and Table1.columnS<20)
  3. Заказ по/группе По/и т.д. (Любой столбец, который используется для заказа/группировки, должен быть в индексе, если это возможно).

Также:

  • Используйте типы данных, которые имеют смысл - не хранить ничего, как varchar, если это целое число или дата. (Ширина столбца имеет значение. Используйте наименьший тип данных, если это возможно.)
  • Убедитесь, что ваши соединения - это один и тот же тип данных - int to int, varchar и varchar и т.д.
  • Если возможно, используйте уникальные, не нулевые индексы для каждого предиката соединения в каждой таблице.
  • Убедитесь, что все возможные столбцы не равны нулю. (Если они не могут содержать нулевые значения, вы можете использовать следующий синтаксис.

    Alter table Table1 
     alter column columnN int not null

Сделайте все это, и вам будет хорошо на вашем пути. Но если вам это нужно регулярно, узнайте об этом! Купите книгу, прочитайте онлайн, найдите информацию. Там много информации, и это глубокая тема, но вы можете делать запросы БОЛЬШЕ, если вы знаете, что делаете.

licensed under cc by-sa 3.0 with attribution.