Теоретически, является ли этот запрос SQL слишком большим, чтобы быстро обслуживать его под нагрузкой? - PullRequest
2 голосов
/ 16 марта 2011

У меня есть SQL-запрос, который может легко вернуть 70000 строк таблицы реляционной базы данных (с несколькими объединениями). Общий размер этого набора составляет около 20 МБ. Общий размер самой таблицы составляет около 10 миллионов строк.

Мне не хватает перспективы здесь, поэтому мне интересно, может ли запрос такого размера практически обслуживаться быстро даже при нескольких сотнях запросов в секунду на веб-странице? Кроме того, это НЕ таблица только для чтения: имеется довольно значительное количество обновлений / удалений (где-то между 3: 1 и 10: 1 соотношение чтения / записи в зависимости от времени года)

Я знаю, что мне нужны индексы и т. Д. Меня интересует, может ли один сервер баз данных (скажем, 4 ГБ ОЗУ и современный четырехъядерный процессор) даже теоретически обслужить это, не выбивая из строя процессор или дисковый ввод-вывод и получить ужасную производительность?

Ответы [ 4 ]

7 голосов
/ 17 марта 2011

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

Подготовка фиктивной таблицы с 10M строками и 80 байтами данных заполнителя на строку:

create table foo as select
    generate_series(1,10000000) as foo_id,
    repeat('a', 80) as filler;
create unique index foo_foo_id on foo (foo_id);
vacuum analyze foo;

Эта таблица занимает 1400 МБ, включая индекс, поэтому она полностью помещается в кэш моей ОС, но не в общие буферы PostgreSQL.

Создание собственного сценария pgbench для выборки 70000 строк, упорядоченных по индексу:

\setrandom key 1 9000000
SELECT * FROM foo WHERE foo_id > :key ORDER BY foo_id LIMIT 70000;

Вот результаты запуска теста производительности моего 4-ядерного настольного компьютера (AMD Phenom II X4 955) в течение 1 минуты:

% pgbench -j 4 -c 4 -T 60 -n -f script.pgb
transaction type: Custom query
scaling factor: 1
query mode: simple
number of clients: 4
number of threads: 4
duration: 60 s
number of transactions actually processed: 3922
tps = 65.309954 (including connections establishing)
tps = 65.316916 (excluding connections establishing)

Обратите внимание, что здесь клиент (pgbench) и сервер находятся на одной физической машине. В действительности они были бы другими, поэтому в игру вступают такие вещи, как нагрузка на сеть и пропускная способность.

Эта наивная конфигурация может обрабатывать ~ 65 таких запросов в секунду. Намного ниже, чем «несколько сотен запросов в секунду», поэтому вам понадобится намного более мощный сервер для обработки такого рода рабочей нагрузки. Возможна репликация с несколькими ведомыми устройствами.

Чтобы получить более реалистичный результат, вам нужно настроить скрипт pgbench и проверить данные, чтобы они соответствовали вашей рабочей нагрузке.

4 голосов
/ 16 марта 2011

Ну нет. Но если вы можете ограничить свой набор результатов (чтобы отобразить его с разбивкой по страницам), кэшировать результаты и, возможно, предварительно обработать / преобразовать ваши данные (по сути, создав собственный, оптимизированный индекс), это может быть возможным.

РЕДАКТИРОВАТЬ: Что я имел в виду под предварительной обработкой, так это периодически запускать, например, cronjob, который массирует ваши данные в форму, где ваш потребитель может очень легко запросить их, например, временная или промежуточная таблица (без соединений). Таким образом, вы выполняете сложные запросы только каждые несколько секунд / минут. Если вы зависите от точных запросов в реальном времени, оптимизация cronjob может оказаться невозможной.

Чтобы иметь возможность отвечать на все запросы, не перегружая слой БД, вы можете кэшировать результаты многократного использования предыдущих поисков в кэш-памяти, например, Memcached).

2 голосов
/ 16 марта 2011

С аппаратным обеспечением, которое вы описываете, вы упускаете большую часть импорта: хранилище.Типичная база данных является узким местом диска и затем памяти.Современные процессоры настолько быстры, что обычно не являются проблемой.Если вы получаете серьезный рейд или SSD, вы можете заставить его делать что-то серьезное.И в любом случае таблица строк 10M будет в памяти для большинства описанных вами инструментов.

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

Это классическая проблема в спорте, называемом хранилищем данных, где вы хотите выполнять большие аналитические запросы к онлайновой системе.Вы хотите создать вторую копию этой таблицы, используя, например, доставку журналов.Большинство баз данных, которые вы пометили, могут сделать это.Доставка журналов создаст буфер между быстро меняющейся таблицей и аналитической таблицей.Когда вы блокируете эту аналитическую таблицу, обновления собираются, пока вы не закончитеи есть несколько человек, читающих из этой таблицы, так что у вас есть все это для себя.Как правило, это будет стоить всего пару процентов от максимальной пропускной способности баз данных.Если вы уже близко к этому, у вас есть проблемы с масштабированием.Если вам действительно нужно увидеть последние данные, посмотрите в режиме реального времени BI.

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

С уважением GJ

2 голосов
/ 16 марта 2011

Это во многом зависит от того, насколько избирательны индексы и что вы делаете с данными.Я бы сказал, что 70К строк и 20МБ не являются пробой для показа, если вы передаете набор результатов в файл для автоматической обработки.Но это может быть остановкой шоу, если вы пытаетесь загрузить его на веб-страницу.

В любом случае, я бы посоветовал вам подумать о реальной причине, по которой кому-то нужно видеть 70000 строк и 20 мегабайт на веб-странице.Чего они пытаются достичь с помощью такого большого количества данных за один раз?

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