Самый быстрый способ извлечь подмножество (200M) из очень большой таблицы (600M) в SQL Server - PullRequest
1 голос
/ 22 октября 2010

мы сталкиваемся со следующей проблемой и пытаемся найти наилучшее из возможных решений.

Мы используем SQL Server 2008. У нас есть таблица, которая содержит более 600 миллионов записей и имеет около 25 столбцов. Один из столбцов является идентификатором и индексируется. Нам нужно получить подмножество записей из этой таблицы. В основном это 2 случая:

а) подмножество содержит от 1000 до 200 миллионов строк; идентификаторы строк, которые нужно получить, хранятся в индексированной таблице в SQL Server;

б) подмножество содержит менее 1 миллиона строк; идентификаторы строк, которые нужно получить, хранятся в памяти сервера приложения (веб-приложение .NET).

Наша задача - как можно быстрее получить это подмножество. Нам нужно, чтобы это произошло через несколько секунд.

Наши решения на данный момент:

а) мы делаем соединение между двумя таблицами. Это работает, но это не достаточно быстро. Запрос выглядит примерно так: SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID.

б) у нас на самом деле нет решения. Мы попытались выполнить запрос WHERE IN, но это просто занимает вечно, если подмножество приближается к миллиону строк (SELECT * FROM Big_Table WHERE ID IN (ID1, ID2, ID3...)). Решением может быть сохранение индексов во временной таблице, но тогда это возвращается к случаю a.

Мы стараемся максимально оптимизировать SQL Server, особенно с помощью хороших индексов и секционирования. Сегодня я больше спрашиваю о том, что, по вашему мнению, наилучший подход заключается в извлечении подмножества в обоих случаях (a и b).

Любая идея или предложение приветствуется.

Спасибо

Ответы [ 2 ]

3 голосов
/ 10 марта 2011

Поскольку вы делаете нумерацию страниц, не могли бы вы сначала выбрать диапазон строк из IndexTable, а затем присоединить его к большой таблице?

Что-то вроде:

select * from big_table where id in (select top 100 id from indextable)
1 голос
/ 22 октября 2010

Наиболее очевидный вопрос для вашей проблемы a) (запрос SELECT * FROM Big_Table JOIN IndexTable ON Big_Table.ID = IndexTable.ID): есть ли у вас индексы в столбце ID в обеих таблицах?

...