1 миллиард строк таблицы фильтрации и объединения - PullRequest
0 голосов
/ 28 марта 2020

Итак, вот в чем дело, у меня есть две таблицы, каждая из которых имеет ~ 1B строк. Я пытаюсь запросить таблицы, чтобы я мог обработать данные и вставить их в другие таблицы. Но мне не нужно обрабатывать все ~ 1B. Мне нужно только 10 или 100 строк для работы с каждым разом.

Однако объединение и фильтрация требуют много времени для возврата данных.

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

Пример запроса:

select Col1, Col2, Col3 
from 1b_table_1 t1
inner join (
  select * 
  from 1b_table_2 
  where expression=condition
) t2
on t1.join_col = t2.join_col
where CAST(t2.timestamp as date) >= date_var1
and CAST(t2.timestamp as date) <= date_var2

ОБНОВЛЕНИЕ Я попытался добавить некластеризованный индекс на 1b_table_1, но проблема, с которой я столкнулся сейчас, заключается в том, что в другом месте выполняется скрипт, который непрерывно вставляет данные в эти две таблицы, и я не могу создать новый индекс или он заблокирует таблицу при построении индекса, и запись данных начнет сбоить и приведет к потере данных.

ДРУГОЙ ОДИН

SELECT count(*) from 1b_table_1

~ 1.2B

SELECT count(*) from 1b_table_2

~ 22M

SELECT count(*) from 1_table_2 where col like condition_string

БЫЛ РАБОТАЕТ НАД БОЛЕЕ 5 минут и безрезультатно. Здесь столбец nvarchar (max) !!

Кроме того, я не могу изменить структуру таблицы или индексы в таблице.

1 Ответ

1 голос
/ 28 марта 2020

Во-первых, подзапрос не нужен. Вы можете написать запрос как:

select Col1, Col2, Col3 
from 1b_table_1 t1 join
     1b_table_2 t2
     on t1.join_col = t2.join_col
where t2.expression = t2.condition and
      t2.where_col1 = where_exp1 and
      t2.where_col2 = where_exp2;

Затем для этого запроса вы хотите индексы:

  • 1b_table_2(where_col1, where_col2, + columns in the "expression", join_col)
  • 1b_table_1(join_col).
...