У нас есть база данных под названием AVL в SQL Server 2008 R2 SE.В этой базе данных есть много таблиц, но есть одна, в частности, под названием ASSETLOCATION, которая в настоящее время имеет 46 миллионов строк и составляет 99,9% от общего размера базы данных.
Эта таблица содержит информацию с 2008 года по настоящее время и фактическуюскорость роста составляет около 120 тысяч записей в день.Теперь есть две ситуации, к которым мы хотели бы обратиться:
- Производительность начинает медленно снижаться, и все оптимизируется, так что делать особо нечего
- Время резервного копирования увеличивается и становится все более быстрым.проблема (мы делаем 1 полную резервную копию каждый день).Размер файла BAK составляет 11 ГБ, после того, как winrar делает свое дело, его размер составляет 2 ГБ, а затем скрипт отправляет файл вне сайта.У нас есть T1, и на протяжение 2 ГБ через провод уходит около 5 часов.
Все это нормально, но вот ловушка, на которой я хочу извлечь выгоду: + 90% операторов SQL используют информацию только за 3 месяцастарые или менее, другими словами, данные за 2008, 2009 и 2010 гг. не часто доступны.
Я думал о создании одной новой базы данных на каждый год.Допустим: - база данных AVL2008, только таблица будет ASSETLOCATION с записями за 2008 год - база данных AVL2009, только таблица будет ASSETLOCATION с записями за 2009 год - база данных AVL2010, только таблица будет ASSETLOCATION с записями с 2010 года
Как вы уже догадались, данные из прошлого не меняются, поэтому это будет здорово с точки зрения резервного копирования, поскольку база данных AVL будет иметь записи только за текущий год.Этот подход также сильно повысит производительность.
Теперь к проблеме.Предположим, что таблица ASSETLOCATION имеет следующие столбцы: - IDASSETLOCATION (int, идентификатор PK) - IDASSET (int, таблица FK to ASSET) - WHEN (datetime) - LATLONG (varchar (22), пространственная информация)
IМне нужно создать представление в базе данных AVL под названием "vASSETLOCATION", ведь это довольно просто, , но я не хочу, чтобы представление получало доступ ко всем базам данных и присоединялось к таблицам ASSETLOCATION через UNION , точнее, единственные необходимыена основе поля КОГДА.Например:
select * from vASSETLOCATION where [WHEN] between '2008-01-01' and '2008-01-02'
В этом случае представление должно иметь доступ ТОЛЬКО к таблице AVL2008.ASSETLOCATION
select * from vASSETLOCATION where [WHEN] between '2008-12-29' and '2009-01-05'
В этом случае представление должно иметь доступ к AVL2008.ASSETLOCATION и AVL2009.ASSETLOCATION
select * from vASSETLOCATION where
([WHEN] between '2008-01-01' and '2008-01-01')
or
([WHEN] = getdate())
В этом случае представление должно получить доступ к AVL2008.ASSETLOCATION и AVL.ASSETLOCATION
Я знаю, что скалярный UDF таблицы вместо представления решит проблему, нов нем более 4 полей, и [WHEN] - не единственное поле, которое мы можем включить в часть where.Прежде чем кто-либо предложит это, функция разбиения таблиц, возможно, поможет в производительности, но НЕ в проблеме с резервным копированием.
Если есть способ сделать это в представлении?Спасибо .-