Наверно больше по алгоритмам, но..

EvAlex
Дата: 28.01.2009 12:47:11
Правда всем наскучили тривиальные задачки? У меня елементарный запрос... но ->
Итак есть 18! серверов.
На каждом есть одинаковая таблица user_interaction
object_id int,
owner_id int,
count int
На поля object_id и owner_id есть индексы.
Сочетание object_id и owner_id уникально, составной индекс не добавлен, так как все запросы обычно только по одному из полей...
В каждой из таблиц есть около 20 млн. записей

То, что мне надо это
SELECT TOP 200 * FROM user_interaction WHERE owner_id = @p1 ORDER BY count, object_id DESC

Варианты решения:
1) Linked servers + view
я пробовал тормозит жутко.
2) Запустить запрос на всех серверах, затем отсортировать заного в аппликации.
работает, но хотелось бы оптимизировать
Т.е. запускаю запрос на первом сервере, беру минимальное значение count и на втором запускаю уже
SELECT TOP 200 * FROM user_interaction WHERE owner_id = @p1 AND count > @min_count ORDER BY count, object_id DESC
и так дальше на все сервера.

ORDER BY count, object_id добавлен чтобы решить проблему когда на одном из серверов больше 200 одинаковых значений count

Очень нужен опыт, если кто сталкивался с unlimited scalability архитектурой.

P.S. Скорость выборки из одной таблицы приемлема от 3 до 6 секунд.
но 6*18 = уже дофига...
aleks2
Дата: 28.01.2009 13:18:33
Не парься. Создай репликацию этой таблички и выбирай всегда локально.
GreenSunrise
Дата: 28.01.2009 13:33:32
EvAlex
2) Запустить запрос на всех серверах, затем отсортировать заного в аппликации.
работает, но хотелось бы оптимизировать

Именно это решение первым пришло мне в голову. Свести результаты 200*18 записей - это смехотворно малое время для приложения.

Так что ИМХО надо сосредоточиться на ускорении отработки запроса для каждого отдельного сервера. Вы такой запрос уже затюнили по самое не хочу или есть еще поле для деятельности?
EvAlex
Дата: 28.01.2009 14:48:03
GreenSunrise
EvAlex
2) Запустить запрос на всех серверах, затем отсортировать заного в аппликации.
работает, но хотелось бы оптимизировать

Именно это решение первым пришло мне в голову. Свести результаты 200*18 записей - это смехотворно малое время для приложения.

Так что ИМХО надо сосредоточиться на ускорении отработки запроса для каждого отдельного сервера. Вы такой запрос уже затюнили по самое не хочу или есть еще поле для деятельности?


По самое не хочу. Это я ещё просто объясняю проблему - на самом деле мне надо всего 10 результатов по странично до 20 страниц. Отсюда и TOP 200
В теории я могу и TOP 10 писать и для каждой страницу аппликация пусть лезет в базу, но 10 и 200 результатов, то же время.
Рассматривается мысль поставить дополнительный сервер на него вливать раз в день результаты (после того как данные собраны с всех серверов и отсортированы аппликацией) - потом уже брать оттуда. Но мне не особо верится, что это реальное решение.

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