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

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

Изменить (gbn): связанный с соединением-или-коррелированным подзапросом-с-существует-предложение-что-один-лучше


Почему никто не упоминал о объединениях вложенных циклов?

Использование (NOLOCK) в соединениях может увеличить производительность, если вы хотите / можете читать незафиксированные записи. Когда вы должны использовать «с (nolock)»

Не «альтернативный» способ для JOINs, а подсказка для увеличения производительности JOIN: в SQL Server, о котором многие люди не знают, вы всегда должны помещать некластеризованный индекс в столбец внешнего ключа. Несколько человек считают, что SQL Server делает это автоматически – это не так.

Поэтому, если у вас есть Customer таблицы, у него, вероятно, есть первичный ключ, похожий на CustomerID . SQL Server автоматически добавит этот индекс.

Однако, если у вас есть таблица Order которая имеет отношение внешнего ключа с Customer , по умолчанию нет индекса в столбце Order.CustomerID . Но такой индекс очень полезен и полезен для объединений и поисков, так что это лучшая практика, которую я всегда рекомендую: поместите индекс во все столбцы внешнего ключа в таблице.

Из вашего другого вопроса

 select * from ContactInformation c where exists (select * from Department d where d.Id = c.DepartmentId ) select * from ContactInformation c inner join Department d on c.DepartmentId = d.Id 

Если вы хотите выводить из обеих таблиц, тогда у вас есть опция other then JOIN. Второй запрос здесь.

Если он медленный, то обычно:

  • у вас есть первичный ключ / индексы?
  • согласованные типы данных (столбцы DepartmentId / id)
  • не используйте SELECT *

Стратегии смягчения эффективности объединений:

  • индексирование
  • Денормализация
  • Результаты кэширования
  • Использование базы данных NoSQL (без SQL = нет объединений, qed)

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

Синтаксически альтернативы нет, а всего лишь несколько методов, которые могут помочь вам в отношении производительности запросов с очень большими объемами данных:

  • Если это применимо, и количество столбцов, возвращаемых запросом, не так много, вы можете использовать INTERSECT, EXCEPT ИЛИ UNION
  • Если запрос очень сложный и имеет много шагов на очень больших объемах данных, разделите их и запустите с помощью временных таблиц.
  • Если запрос возвращается к отчету, представляющему некоторую информацию, которая может состоять из вчерашнего изображения данных, вы можете использовать задания агента SQL Server для вычисления и сохранения результата в таблице, которая будет использоваться в качестве обратной ссылки для отчета вместо запроса или как альтернативное использование индексированных представлений для получения результата.
  • Если некоторая информация, такая как подсчет строк в таблице, занимает слишком много времени, вы можете использовать таблицы метаданных в таблице для получения такой информации. Это не только количество строк в таблице. Вы можете получить много информацию из метаданных без необходимости ее расчета. (Обратитесь к этому сайту )

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

Если ваши запросы медленные, вам нужно их оптимизировать – возможно, вам не хватает индекса или двух, возможно, вы можете переписать предложения where, чтобы уменьшить количество возвращенных строк.

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

В любом нетривиальном приложении, управляемом БД, нет способа … чтобы вы избегали объединений.

Совпадения … сами по себе не являются основной причиной проблемы, но плохая производительность может быть результатом чего-либо из плохо написанных запросов в плохо разработанную базу данных.

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

Корреляционные подзапросы – еще одна альтернатива.

В общем, если вы хотите улучшить свое мастерство … вопрос, который вы должны задать, – это: Как написать эффективные запросы?

Interesting Posts

Понимание синтаксиса определения SQL

Дополнительные параметры, план поиска индекса

Ошибка SQL Server: «%» не является ограничением. Не удалось отказаться от ограничения. См. Предыдущие ошибки

Создание пакета SSIS через MVS 2015 ODBC IDENTITY_INSERT

Хорошая практика удаленной базы данных

Используйте SqlDataReader и строковый массив

Предполагаемая десятичная точка в преобразовании строки в SSIS

Создание пустой копии базы данных SQL Server 2012 на том же экземпляре

Нормализация с 0 / NULL значениями или может быть спроектирована лучше?

Как мы можем сделать внешний ключ среди таблиц после вставки данных в эти таблицы?

Эффективная транзакция, блокировка записи

Внутреннее соединение на основе поля, разделенного запятыми

Каков самый быстрый способ преобразования всех столбцов и отношений PK и FK GUID в int?

Экземпляр SQL Server возвратил недопустимую или неподдерживаемую версию протокола во время логического перехода

SQL Server – выборочная вставка полей в временную таблицу

Давайте будем гением компьютера.