Лучшая стратегия для быстрого возврата больших наборов результатов - PullRequest
2 голосов
/ 25 января 2012

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

Я кеширую итоги и перезапускаю эту часть запроса только тогда, когда пользователь изменяет параметры поиска, чтобы ускорить пейджинг, и это прекрасно работает. Проблема, с которой мы сталкиваемся сейчас, заключается в том, что нагрузка на ЦП сервера SQL резко возрастает, и поэтому производительность подкачки резко колеблется (от 100 миллисекунд до 2 секунд).

Мне просто интересно, не лучше ли было бы кэшировать всю таблицу результатов на веб-сервере и использовать либо DataTable.Select, либо оператор Linq для запроса таблицы / списка памяти? Я понимаю, что это добавит большую нагрузку на память веб-серверу, но мы пытаемся повысить скорость, и поэтому может быть целесообразно обновить веб-серверы, поскольку они также сбалансированы по нагрузке, в то время как блок SQL - нет.

Ответы [ 3 ]

4 голосов
/ 02 марта 2012

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

DECLARE @startRow INT ; SET @startrow = 50
;WITH cols
AS
(
    SELECT table_name, column_name, 
        ROW_NUMBER() OVER(ORDER BY table_name, column_name) AS seq, 
        ROW_NUMBER() OVER(ORDER BY table_name DESC, column_name desc) AS totrows
    FROM [INFORMATION_SCHEMA].columns
)
SELECT table_name, column_name, totrows + seq -1 as TotRows
FROM cols
WHERE seq BETWEEN @startRow AND @startRow + 49
ORDER BY seq

Получено отсюда: Пейджинг SQL Server - Святой Грааль

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

Одна модификация, которую я должен был сделатьчтобы решение в статье заключалось в том, чтобы уникальный столбец был включен в списки столбцов OVER (ORDER BY).

0 голосов
/ 27 января 2012

Я бы порекомендовал использовать систему текстового поиска, например Lucene .

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

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

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

Большинство крупных сайтов используют его или что-то подобное.

0 голосов
/ 26 января 2012

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

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