У меня возникла ситуация, когда я получаю много строк транзакционных данных с аппаратного устройства. Я анализирую эти данные и превращаю данные предыдущего дня в отчет. В результате мое приложение часто расчесывает всю таблицу для создания отчетов, но на самом деле ей действительно нужно иметь дело с предыдущими 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 по причинам $$$.
Забавный факт: с помощью 'TOP 1000000 *' 'без того by' даст вам (до) миллиона строк в в неопределенном порядке. Возможно, это не проблема, если вы всегда получаете меньше строк, но вы должны включать порядок, когда используете верх. – jpw
Считаете ли вы (учитывая тот факт, что дата получения coloumn индексируется) это замедлит запрос? IE будет выполнять заказы медленнее, чем неупорядоченное исполнение? –
Не должно быть, если индекс охватывает все необходимые данные, но действительно ли порядок в архивной базе данных? – jpw