Вопрос по sql, indexing – Как я могу оптимизировать этот SQL-запрос (используя индексы)? [закрыто]

1

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

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

Какие шаги я должен предпринять для оптимизации моего SQL-запроса?

Я думал, что важно иметь общий вопрос, на который можно было бы отсылать людей, так как мы получаем этот вопрос ДЕСЯТОЙ. David Manheim
на какой запрос вы ссылаетесь? swasheck
Хорошее редактирование, возражение снято, голосование возобновлено. David
Обратная связь или правки / предлагаемые правки, а также дополнительные ответы приветствуются. David Manheim
Я думаю, что это слишком общий вопрос - он может иметь место в виде поста в блоге (в сочетании с ответом), но все равно необходимо иметь более конкретные примеры, показывающие планы выполнения для различных стратегий. Cade Roux

Ваш Ответ

1   ответ
7

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

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

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

Which tables should be indexed? Любая таблица, которая используется для запросов, особенно если данные статические или получают только новые значения, является хорошим кандидатом. Если таблица находится в вашем запросе и содержит оператор соединения, вы, вероятно, захотите иметь индекс для соединяемых столбцов.

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

Join predicates (on Table1.columnA=Table2.ColumnA and Table1.columnB=Table2.ColumnQ) Filtered columns (where Table1.columnN=’Bob’ and Table1.columnS<20) Order by / Group By / etc. (any column which is used for the order/grouping should be in the index, if possible.)

Также:

Use data types that make sense - store nothing as varchar if it's an integer or date. (Column width matters. Use the smallest data type you can, if possible.) Make sure your joins are the same data type - int to int, varchar to varchar, and so on. If possible, use unique, non-null indexes on each join predicate in each tables.

Make sure whatever columns possible are non-null. (If they cannot contain null values, you can use the following syntax.

 Alter table Table1 
    alter column columnN int not null

Сделайте все это, и вы будете в пути.But if you need this stuff regularly, learn it! Купить книгу, читать онлайн, найти информацию. Существует много информации, и это глубокая тема, но вы можете сделать запросы НАМНОГО лучше, если знаете, что делаете.

Похожие вопросы