Зависит ли скорость запроса от количества строк в таблице? - PullRequest
4 голосов
/ 29 марта 2010

Допустим, у меня есть этот запрос:

select * from table1 r where r.x = 5

Зависит ли скорость этого запроса от количества строк, присутствующих в table1?

Ответы [ 6 ]

6 голосов
/ 29 марта 2010

На скорость запроса влияет множество факторов, одним из которых может быть количество строк.

Другие включают в себя:

  • индексная стратегия (если вы индексируете столбец "x", вы увидите лучшую производительность, чем если бы он не индексировался)
  • загрузка сервера
  • кеширование данных - после выполнения запроса данные будут добавлены в кеш данных. Поэтому последующие повторы будут выполняться намного быстрее, поскольку данные поступают из памяти, а не с диска. До такой точки, когда данные удаляются из кеша
  • Кэширование плана выполнения - в меньшей степени. Как только запрос выполняется в первый раз, план выполнения, предлагаемый SQL Server, будет кэшироваться в течение некоторого периода времени для повторного использования в будущем.
  • серверное оборудование
  • так, как вы написали запрос (часто это один из главных факторов плохой работы!). например написание чего-либо с использованием курсора вместо операции на основе множества

Для баз данных с большим количеством строк в таблицах обычно стоит учитывать разбиение (в SQL Server 2005 и более поздних версиях Enterprise Edition имеется встроенная поддержка). Это для разделения данных на более мелкие единицы. Как правило, меньшие единицы = меньшие таблицы = меньшие индексы = лучшая производительность.

3 голосов
/ 29 марта 2010

Да, и это может быть очень значительным.

Если есть 100 миллионов строк, SQL-сервер должен пройти каждую из них и посмотреть, соответствует ли она. Это занимает намного больше времени по сравнению с 10 строками.

Возможно, вам нужен индекс для столбца 'x', и в этом случае сервер SQL может проверить индекс, а не проходить все строки - что может быть значительно быстрее, поскольку серверу SQL даже не нужно проверять значения в индексе.

С другой стороны, если 100 миллионов строк соответствуют x = 5, это медленнее, чем 10 строк.

1 голос
/ 29 марта 2010

Вы должны предположить, что ваш запрос всегда зависит от количества строк. Фактически, вы должны принять наихудший случай (линейный или O(N) для предоставленного вами примера) и экспоненциальный для более сложных запросов. Существуют руководства для конкретных баз данных, заполненные хитростями, которые помогут вам избежать наихудшего случая, но сам SQL является языком и не определяет, как выполнить ваш запрос. Вместо этого реализация базы данных решает, как выполнить любой данный запрос: если вы проиндексировали столбец или набор столбцов в вашей базе данных, то вы получите O(log(N)) производительность для простого поиска; если система имеет эффективное кэширование запросов, вы можете получить ответ O(1). Вот хорошая вводная статья: Высокая масштабируемость: SQL и сложность вычислений

1 голос
/ 29 марта 2010

Ответ - Да. Но не единственный фактор. если вы сделали соответствующие оптимизации и настройки падение производительности будет незначительным Основные показатели эффективности

  • Индексирование кластеризовано или не кластеризовано
  • Кэширование данных
  • Разделение таблицы
  • Кэширование плана выполнения
  • Распределение данных
  • Характеристики оборудования

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

1 голос
/ 29 марта 2010

Не строки (в определенной степени, конечно) сами по себе, а объем данных (столбцы) - это то, что может замедлить запрос. Данные также должны быть переданы из серверной части в интерфейс.

1 голос
/ 29 марта 2010

Почти всегда да. Реальный вопрос заключается в следующем: с какой скоростью замедляется запрос при увеличении размера таблицы? И ответ таков: не сильно, если r.x проиндексирован, и большим количеством, если нет.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...