2015-03-16 2 views
0

У меня возникла ситуация, когда я получаю много строк транзакционных данных с аппаратного устройства. Я анализирую эти данные и превращаю данные предыдущего дня в отчет. В результате мое приложение часто расчесывает всю таблицу для создания отчетов, но на самом деле ей действительно нужно иметь дело с предыдущими 72-часовыми данными. Я ежедневно запускаю индексный скрипт (перестраивает и реорганизует), и запуск этого на таблицах в одной базе данных заставляет базу данных сильно зависать для моего приложения-отчета. Итак, я думаю, чтобы получить архивированные данные в новую базу данных, которая может управляться отдельно в этой базе данных, тем самым уменьшая время зависания этой базы данных за счет реорганизации и повторной индексации нескольких индексов базы данных, состоящей из миллионов строк.Архивирование сценариев для ежедневного запуска SQL Server 2012 Express для поддержания хорошей производительности

В настоящее время у меня есть сценарий (ниже), который перемещает данные в отдельную таблицу старше 7 дней. Я планирую изменить это на 3 дня, но я хочу поместить это в отдельную базу данных по соображениям производительности. Сценарий работает только с наборами 1000000 (чуть больше числа строк, поступающих в каждый день)

Как видите, он связан с одной базой данных. Как сделать скрипт ниже, используя несколько баз данных? Я взломал, но не повезло. Первый скрипт является оригиналом, а второй - моей попыткой изменить и использовать вторую базу данных. Именами являются activetrackdb (оригинал) и activetrackarchivedb (новая база данных архива). Архив db имеет идентичные coloumns, и это собственный первичный ключ.

USE activetrackdb; 
DECLARE @3daysago datetime 
SELECT @3daysago = DATEADD(d, -7, GetDate()); 
SET IDENTITY_INSERT [dbo].[Archived Data Import] ON; 
WITH CTE as (
    SELECT TOP 1000000 * 
    FROM [dbo].[Data Import] 
    WHERE [Data Import].[Receive Date] < @7daysago) 
DELETE CTE 
    OUTPUT DELETED.id, 
    DELETED.[Company id], 
    DELETED.[Site id], 
    DELETED.[Site name], 
    DELETED.[Receive date], 
    DELETED.[Detect date], 
    DELETED.[Type], 
    DELETED.[eventType], 
    DELETED.[Tag name], 
    DELETED.[Tag RFID], 
    DELETED.[Route id], 
    DELETED.[Route name], 
    DELETED.[Patrol id], 
    DELETED.[Device s/n], 
    DELETED.[Guard id], 
    DELETED.[Guard name], 
    DELETED.[Employee id], 
    DELETED.[Employee name], 
    DELETED.[Alarm group id], 
    DELETED.[Comment], 
    DELETED.[GPS latitude], 
    DELETED.[GPS longitude], 
    DELETED.[GPS accuracy], 
    DELETED.[GPS vertical accuracy], 
    DELETED.[GPS height], 
    DELETED.[GPS speed], 
    DELETED.[GPS heading], 
    DELETED.[Additional data], 
    DELETED.[Device id], 
    DELETED.[Device name], 
    DELETED.[Company name], 
    DELETED.[Occurrence date], 
    DELETED.[GPS date] 
    INTO [dbo].[Archived Data Import] 
    (id, 
    [Company id], 
    [Site id], 
    [Site name], 
    [Receive date], 
    [Detect date], 
    [Type], 
    [eventType], 
    [Tag name], 
    [Tag RFID], 
    [Route id], 
    [Route name], 
    [Patrol id], 
    [Device s/n], 
    [Guard id], 
    [Guard name], 
    [Employee id], 
    [Employee name], 
    [Alarm group id], 
    [Comment], 
    [GPS latitude], 
    [GPS longitude], 
    [GPS accuracy], 
    [GPS vertical accuracy], 
    [GPS height], 
    [GPS speed], 
    [GPS heading], 
    [Additional data], 
    [Device id], 
    [Device name], 
    [Company name], 
    [Occurrence date], 
    [GPS date]); 

Моя попытка:

DECLARE @7daysago datetime 
SELECT @7daysago = DATEADD(d, -7, GetDate()); 
SET IDENTITY_INSERT [activetrackarchivedb].[Data Import] ON; 
WITH CTE as (
    SELECT TOP 1000000 * 
    FROM [activetrackdb].[Data Import] 
    WHERE [Data Import].[Receive Date] < @7daysago) 
DELETE CTE 
    OUTPUT DELETED.id, 
    DELETED.[Company id], 
    DELETED.[Site id], 
    DELETED.[Site name], 
    DELETED.[Receive date], 
    DELETED.[Detect date], 
    DELETED.[Type], 
    DELETED.[eventType], 
    DELETED.[Tag name], 
    DELETED.[Tag RFID], 
    DELETED.[Route id], 
    DELETED.[Route name], 
    DELETED.[Patrol id], 
    DELETED.[Device s/n], 
    DELETED.[Guard id], 
    DELETED.[Guard name], 
    DELETED.[Employee id], 
    DELETED.[Employee name], 
    DELETED.[Alarm group id], 
    DELETED.[Comment], 
    DELETED.[GPS latitude], 
    DELETED.[GPS longitude], 
    DELETED.[GPS accuracy], 
    DELETED.[GPS vertical accuracy], 
    DELETED.[GPS height], 
    DELETED.[GPS speed], 
    DELETED.[GPS heading], 
    DELETED.[Additional data], 
    DELETED.[Device id], 
    DELETED.[Device name], 
    DELETED.[Company name], 
    DELETED.[Occurrence date], 
    DELETED.[GPS date] 
    INTO [activetrackarchivedb].[Data Import] 
    (id, 
    [Company id], 
    [Site id], 
    [Site name], 
    [Receive date], 
    [Detect date], 
    [Type], 
    [eventType], 
    [Tag name], 
    [Tag RFID], 
    [Route id], 
    [Route name], 
    [Patrol id], 
    [Device s/n], 
    [Guard id], 
    [Guard name], 
    [Employee id], 
    [Employee name], 
    [Alarm group id], 
    [Comment], 
    [GPS latitude], 
    [GPS longitude], 
    [GPS accuracy], 
    [GPS vertical accuracy], 
    [GPS height], 
    [GPS speed], 
    [GPS heading], 
    [Additional data], 
    [Device id], 
    [Device name], 
    [Company name], 
    [Occurrence date], 
    [GPS date]); 

Любая помощь будет оценена. Я бы предположил, что разделение будет решать это обычно, но я на SQL Server Express по причинам $$$.

+1

Забавный факт: с помощью 'TOP 1000000 *' 'без того by' даст вам (до) миллиона строк в в неопределенном порядке. Возможно, это не проблема, если вы всегда получаете меньше строк, но вы должны включать порядок, когда используете верх. – jpw

+0

Считаете ли вы (учитывая тот факт, что дата получения coloumn индексируется) это замедлит запрос? IE будет выполнять заказы медленнее, чем неупорядоченное исполнение? –

+0

Не должно быть, если индекс охватывает все необходимые данные, но действительно ли порядок в архивной базе данных? – jpw

ответ

1

Используйте три названия части объекта (database.owner.table):

DECLARE @7daysago datetime 
SELECT @7daysago = DATEADD(d, -7, GetDate()); 
SET IDENTITY_INSERT [activetrackarchivedb].dbo.[Data Import] ON; 
WITH CTE as (
    SELECT TOP 1000000 * 
    FROM [activetrackdb].dbo.[Data Import] 
    WHERE [activetrackdb].dbo.[Data Import].[Receive Date] < @7daysago 
    ) 
DELETE CTE 
    OUTPUT DELETED.id, 
    DELETED.[Company id], 
    DELETED.[Receive date], 
    .... 
    INTO [activetrackarchivedb].dbo.[Data Import] 
    (id, 
    [Company id], 
    [Receive date], 
    .... 
); 
+1

Yup, это именно то, что я искал. Благодаря! –