Разделение длинного SQL-запроса на несколько небольших запросов - PullRequest
4 голосов
/ 09 мая 2011

Я использую SQL Server 2008 и Java 6 / Spring jdbc.

У нас есть таблица с количеством записей ~ 60 млн.

Нам нужно загрузить всю эту таблицу в память, но выполнение выбора * в этой таблице занимает часы.

Итак, я делю запрос, как показано ниже

String query = "  select * from TABLE where "  ;
        for(int i =0;i<10;i++){
            StringBuilder builder = new StringBuilder(query).append(" (sk_table_id % 10) =").append(i);
            service.submit(new ParallelCacheBuilder(builder.toString(),namedParameters,jdbcTemplate));
        }

В основном я делю запрос, добавляя условие where в столбец первичного ключа,

приведенный выше фрагмент кода разбивает запрос на 10 параллельных запросов. При этом используется Java ExecutorCompletionService .

.

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

Это хорошо / плохо / лучше / хуже? Есть ли другой способ, пожалуйста, напишите.

Заранее спасибо !!!

1 Ответ

1 голос
/ 09 мая 2011

Если вам нужны все 60M записи в памяти, select * from ... - самый быстрый подход.Да, это полное сканирование;нет пути назадОн привязан к диску, поэтому многопоточность вам не поможет.Недостаточно доступной памяти (подкачка) мгновенно снижает производительность.Структуры данных, которые требуют значительного времени для расширения, также снижают производительность.

Откройте диспетчер задач и посмотрите, сколько ЦП расходуется;наверное мало;если нет, профилируйте свой код или просто закомментируйте все, кроме цикла чтения.Или, возможно, это узкое место в сети между сервером SQL и вашим компьютером.

Возможно, SQL Server может быстрее выгружать данные во внешний файл дампа известного формата, используя некоторые внутренние пути (например, Oracle может).Я бы изучил возможность выгрузки таблицы в файл и последующего анализа этого файла с помощью C #;это может быть быстрее, например, потому что он не будет мешать другим запросам, которые одновременно обслуживает сервер SQL.

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