2009-08-26 3 views

ответ

28

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

Добавление индексов. Это делается не так часто, так как некоторым таблицам не нужен какой-либо другой индекс, чем тот, который был создан для первичного ключа.

+1

+1 для возврата только нужных столбцов –

+0

+1 для указания очевидных, но очень важных фактов, которые люди обычно забывают – Yottagray

0
  1. индексирует его наиболее распространенной оптимизации
  2. De нормализации таблиц.
  3. Снятие ограничений (только если вы знаете, что вы делаете)
+1

Устранение ограничений является интересным. Это может помочь выполнить изменения, но может повредить выполнение запросов. –

+1

Ограничения используются движком sql для получения наиболее оптимизированного запроса и удаления, а затем могут привести к потере производительности, как указал Роб. –

+0

Я думаю, что удаление ограничений помогает, когда происходит много вложений. –

1

Снижение уровней изоляции транзакций, чтобы обойти блокировки таблицы для пользовательских запросов. Не все время, но для того, чтобы показать общую информацию Ги, она отлично работает.

5

Кэширование выхода db. Избежать давления на базу данных, по-видимому, является разумной оптимизацией.

+1 memcached.

1

Если вы говорите об общем, как в действительно распространенном, то Индексы - это первое, что появляется в моей голове.

Это мощная техника, которую часто неправильно понимают и довольно часто злоупотребляют.

Тогда я бы разместил де-нормализацию, которая может добавить в довольно много производительности для многих баз данных.

Оптимизация запросов является третьей, и это также помогает. Я использую MySQL в эти дни, и ведение журнала запросов помогает много для оптимизации.

Memcached определенно не является обычным явлением, хотя кэширование какого-то рода является частью многих сайтов на конце сценариев (ASP.Net или PHP).

24

Мой любимый список tips (explained in detail here) выглядит следующим образом

  1. Пытаться ограничить запросы результирующего набора с помощью ИНЕКЕ.
  2. Попробуйте ограничить набор результатов запросов, возвращая только те столбцы из таблицы, а не все столбцы таблицы.
  3. Используйте виды и хранимые процедуры вместо тяжелых запросов.
  4. По возможности старайтесь избегать использования курсоров SQL Server.
  5. Если вам нужно вернуть общее количество строк таблицы, вы можете использовать альтернативный способ вместо инструкции SELECT COUNT (*).
  6. Попробуйте использовать ограничения, а не триггеры, когда это возможно.
  7. Используйте табличные переменные вместо временных таблиц.
  8. Старайтесь избегать предложения HAVING, когда это возможно.
  9. По возможности старайтесь избегать использования предложения DISTINCT.
  10. Включите инструкцию SET NOCOUNT ON в свои хранимые процедуры, чтобы остановить сообщение с указанием количества строк, на которые ссылается инструкция T-SQL.
  11. Используйте утверждения select с ключевым словом TOP или оператором SET ROWCOUNT, если вам нужно вернуть только первые n строк.
  12. Используйте подсказку таблицы FAST number_rows, если вам нужно быстро вернуть строки 'number_rows'.
  13. Попробуйте использовать инструкцию UNION ALL вместо UNION, когда это возможно.
  14. Не используйте подсказки оптимизатора в ваших запросах.
+0

Не уверен, что вы подразумеваете под взглядами вместо тяжелых запросов.Поскольку представление представляет собой только сохраненный подзапрос, он не должен иметь никакого значения, кроме простоты чтения. Кроме того, предложение HAVING прекрасное, если ваше решение нуждается в нем. –

+0

Rob использует представление вместо тяжелых запросов, может уменьшить сетевой трафик, так как ваш клиент будет отправлять на сервер только хранимые процедуры или имя представления вместо большого текста тяжелых запросов. Это также можно использовать для упрощения управления разрешениями, поскольку вы можете ограничить доступ пользователей к столбцам таблицы, которые они не должны видеть. – RRUZ

+0

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

1

Убедившись, что столы соединены в правильном порядке.

+0

Не делает ли двигатель базы данных это автоматически? Я всегда думал, что они переупорядочили запросы перед исполнением ... – Jim

+0

Да, вроде. В случае Sybase ASE оптимизатор попытается выбрать оптимальный порядок соединения, основываясь на калькуляции запроса. Обычно (если статистика актуальна), он будет входить в правильный порядок. Но я видел много случаев, когда порядок соединения не срабатывал правильно. Кроме того, порядок таблиц в запросе может иметь значение, если у вас большое количество таблиц, поскольку СУБД обычно учитывает x число перестановок таблицы за раз. Я всегда пытаюсь перечислить свои таблицы в том порядке, в котором я хочу, чтобы они присоединились (также удобно, если вам когда-либо понадобится принудительный порядок соединения). – Allethrin

2

1) Я до сих пор найти ситуацию, когда

SELECT Field1, Field2, (SELECT Count(*) FROM tblLinked WHERE tblLinked.Field3 = tblSource.Field3) AS TheTotal 
FROM tblSource 

не улучшается с помощью LEFT JOIN к производной таблице.

SELECT Field1, Field2, IsNull(Linked.TheTotal,0) AS TheTotal 
FROM tblSource 
LEFT JOIN (SELECT Field3, Count(*) AS TheTotal 
    FROM tblLinked 
    GROUP BY Field3) AS Linked ON tblSource.Field3 = Linked.Field3 

2) Не сортируйте результаты на сервере, если приложение-потребитель не может сделать это самостоятельно. Это относится нередко к веб-приложениям, но для настольных приложений клиентский ПК обычно обладает достаточным количеством мощности и может с удовольствием сделать вид.

3) Используйте EXISTS вместо проверки количества совпадающих записей.

4) Не одержим выполнением запроса только в одном предложении SELECT. Разумное использование переменных таблицы (а иногда и временных таблиц) может значительно уменьшить обрабатываемые строки.

+1

Re 1) ... с ним следует обращаться одинаково. Какие СУБД вы используете? –

+0

SQL Server. Подвыборы выполняются гораздо медленнее, чем запросы с использованием производных таблиц в моем опыте. – MartW

8

Далеко и выше: Создание индексов покрытия

Индекс покрытия включает в себя все столбцы, что запрос будет необходимо, что позволяет избежать необходимости делать Lookups о результатах поиска по индексу. Это позволит избежать ощущения системы, поскольку сканирование может быть более быстрым (что удивительно быстро, учитывая стоимость поиска).

Но также стоит отметить:

Имея индекс, который позволит слиянием. Соединение MERGE может возникать при объединении двух таблиц, упорядоченных по условиям соединения. Но, конечно, говоря «таблица», мы действительно имеем в виду «индекс», правый ...

Также - удаление скалярных функций и использование табличных функций вместо ... в качестве скалярных функций не могут быть упрощены ,

Кроме того - добавление уникального индекса в столбце, который, как вам известно, уникален, позволяет оптимизатору запросов использовать эти знания для выбора оптимальной оптимизации. Также применяется к ограничениям NOT NULL.

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

Конечно, я мог бы пойти на весь день ...

Роб

+0

Стоит отметить, что скалярная функция может быть локальной для SQL Server. Но другие - в большинстве систем баз данных. –

+0

Роба я видел твой блог, у тебя отличные статьи. ;) – RRUZ

+0

:) Спасибо RRUZ. Индексы покрытия запросов, безусловно, стоят того, что позволяет делать запросы в тысячи раз быстрее. –

1

Две самые важные вещи в моем опыте все меньше присоединяется и меньше запросов. Кроме того, что существует множество специфичных для БД данных, COUNT (*) относительно медленный на PgSQL, subselects являются медленными для MySQL на MySQL и т. Д.

0

Пара подсказок: Использование

delete from table where id>=1 and id<=3; 

вместо

delete from table where id=1; 
delete from table where id=2; 
delete from table where id=3; 

использовать также «IN» вместо «ИЛИ» Синтаксис

+0

как насчет: удалить из таблицы, где id от 1 до 3 - кажется все более кратким –

+0

Да, может быть, но идея такова: не используйте циклические запросы. – 2009-09-08 13:08:06

1

Наибольшие оптимизаций я использовал в последнее время, где довольно просто ,

Храните как можно большую часть бизнес-логики на сервере sql. Aka держите свой бизнес-код на той же машине, что и сервер sql. Пусть ваша бизнес-логика возвращает как можно меньше кода обратно конечному клиенту.

Держите ваш SQL-запрос как можно короче, как сказал Фрост, используйте отдельные операторы обновления для нескольких операторов.

использовать только транзакции, когда вам нужно их

Создание временных таблиц для частичного присоединяется ускорить стыки (не забудьте индексировать их)

1

Я прочитал все ответы, и я не нашел LIMIT и Советы по использованию OFFSET. Это очень распространенное использование в разбивке на страницы с ссылками «prev» и «next». Но предоставление такого дисплея может потреблять больше ресурсов, чем весь остальной сайт. При смещении большого количества элементов запрос может стать очень медленным. Поэтому избегайте этих запросов.

  • Не исчисляйте количество предметов.
  • Показывать только первые цифры «n» (например, только 100 лучших).

Такие методы используют Google, Twitter и другие сайты. В поиске Google нет точного количества результатов. Существует только приблизительное число. Twitter не позволяет пользователю просматривать все прошлые твиты. Он показывает только последнее n число (я не могу вспомнить, сколько).

Существует link from MySQL performance blog.

3

Индекс иностранных ключей!

Возможно, это не оптимизация синтаксиса запроса sql, а оптимизация хранилища. Но я вижу, что он снова появляется все время & его домашнее животное.

2

Оптимальная оптимизация, с которой я когда-либо пользовалась, заключалась в том, чтобы действительно понять, что нужно делать с данными и УДАЛИТЬ тонны SQL из запроса.

Самый быстрый запрос - это запрос, который не нужно запускать.

ДЕЙСТВИТЕЛЬНО ДУМАЙТЕ о том, что вы делаете с данными. Вы работаете по очереди? (затем используйте код на основе набора).

  • Вам действительно нужно присоединиться ко всем этим таблицам?

  • Может ли два небольших (простых) запроса выполнять работу лучше и быстрее, чем один большой запрос?

  • Если вы объединяете эти два запроса в один запрос, может ли он работать быстрее?

Наконец, PROFILE ваши запросы (EXPLAIN PLAN или SQL Profiler) и посмотреть на "IO получает". Как правило, вы хотите уменьшить количество GET до коэффициента, равного 10 полученным на выходную строку.

0

Избегайте использования встроенных функций, таких как convertdate, stringreplace и т. Д. В ваших представлениях. Если вы не можете убедиться, что данные находятся в допустимом формате, используйте хранимые процедуры, которые выполняют reguallary для «очистки» данных в соответствующих таблицах.

это противно, но это экономит время вида т.е. держит пользователь счастливым ... ^^

0

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

Смежные вопросы