Еще один трюк, который вы можете использовать, - иметь дельта-таблицу для обновлений.У вас будет 2 таблицы с видом на них, чтобы объединить их.Одна таблица, TableBig, будет содержать старые данные, а вторая таблица, TableDelta, будет содержать дельты, которые вы добавляете в строки в tableBig.
Вы создаете представление над ними, которое их складывает.Простой пример:
Например, ваши старые данные в TableBig (20M строк, много индексов и т. Д.)
ID Col1 Col2
123 5 10
124 6 20
И вы хотите обновить 1 строку и добавить новую, чтобыпосле этого таблица выглядит следующим образом:
ID Col1 Col2
123 5 10 -- unchanged
124 8 30 -- this row is updated
125 9 60 -- this one added
Затем в TableDelta вы вставляете эти две строки:
ID Col1 Col2
124 2 10 -- these will be added to give the right number
125 9 60 -- this row is new
, и вид равен
select ID,
sum(col1) col1, -- the old value and delta added to give the correct value
sum(col2) col2
from (
select id, col1, col2 from TableBig
union all
select id, col1, col2 from TableDelta
)
group by ID
Ночью.вы можете объединить TableDelta с TableBig и индексировать и т. д.
Таким образом, вы можете полностью оставить большую таблицу в одиночестве в течение дня, и TableDelta не будет иметь много строк, так что общий запрос будет очень хорошим.Получение данных из BigTable выгодно благодаря отсутствию, получение строк из DeltaTable не представляет никакой проблемы, поскольку оно мало, их суммирование обходится дешевле по сравнению с поиском данных на диске.Загрузка данных в TableDelta очень дешева, потому что вы можете просто вставить в конце.
С уважением, Герт-Ян
Обновление для текстовых столбцов:
Вы можете попробовать что-то подобное с двумя таблицами, но вместо добавления вы быаналог:
Select isnull(b.ID, o.ID) Id,
isnull(b.Col1, o.Col1) Col1
isnull(b.Col2, o.Col2) col2
From TableBig b
full join TableOverWrite o on b.ID = o.ID
Основная идея та же: большая таблица с индексами и маленькая таблица для обновлений, которые в них не нуждаются.