2016-02-03 5 views
2

У меня есть две таблицы,Разбивка в двух таблицах в SQL Server

  • Orders - это небольшой, как правило, до 50 тысяч записей
  • OrdersArchive - это один нормальный, около 80 миллионов записей

Эта ситуация может случится:

порядок может иметь на этих значений status:

  1. 'создал'
  2. 'обработка'
  3. 'закончил'

Готовые заказы Orders периодически перемещается в OrdersArchive.

Иными словами, Orders могут содержать заявки со статусом created, processing или finished. OrdersArchive содержит только заказы с статусом finished.

Результат должен быть отсортирован в таком порядке «созданный», «обработка», «закончил»

мне нужен запрос в этих двух таблицах, которые поддерживает нумерацию.

Каков наилучший способ сделать это? (Так быстро, как это возможно)

пагинация может быть любого типа

Я имею в виду люблю:

  • классическая пагинация с PageNumber и CountOfRowsPerPage.
  • «ленивая» разбивка на страницы с подсчетом заказов по конкретному заказу.

ответ

2

Я бы использовал для этого оператор SQL union. Подробности см. На странице w3schools.

С объединением вы можете либо сделать union, либо union all. Первый будет проверять дубликаты, а второй просто объединяет результаты. Похоже, что у вас не должно быть дубликатов в этих двух таблицах, поэтому для производительности вам не нужно выполнять отдельный поиск.

Вам также необходимо убедиться, что оба запроса имеют одинаковое количество столбцов с похожими типами.

например.

select orderno, status from Orders 
union all 
select orderno, status from OrdersArchive 
order by status, orderno 

Pagination
Этот запрос дает комбинированный для результирующего обеих таблиц.Теперь, чтобы добавить нумерацию страниц, я хотел бы использовать КТР с номерами строк, как это:

with x as (
select orderno as num, status as stat from Orders 
union all 
select archiveorderno as num, archivestatus as stat from OrdersArchive 
) select row_number() over(order by stat, num) as rownum, num, stat from x 
    where rownum between 1 and 20 

Alternative
Если вы обнаружили, используя объединение слишком медленно, то вы могли бы смотреть на изменения на пути поиска работы. Если вы всегда сортируете одинаково, и это всегда записи из Orders, за которыми следуют записи из OrdersArchive, вы можете запросить таблицы отдельно. Начните с пейджинга через Orders, а затем, когда у вас закончились записи, продолжайте пейджинг через OrdersArchive. Это будет намного быстрее, чем объединение, но вам нужно будет сохранить запрос простым и всегда сортировать по статусу. Союз допускает гораздо более сложные поиски.

0

Использование СБРОСА и FETCH NEXT в SQL Server может обеспечить решение подкачки. Грубый пример кода:

DECLARE @PageNumber INT = 2 
DECLARE @PageSize INT = 100000; 

SELECT [ID] 
FROM [Table] 
ORDER BY [ID] 
OFFSET @PageSize * (@PageNumber - 1) ROWS 
FETCH NEXT @PageSize ROWS ONLY 

Очевидно место в ваших собственных таблиц, фильтров, заказов и, возможно, поставить это в хранимой процедуре с бытием входом PageNumber и PAGESIZE PARAMS

Смежные вопросы