Переместить таблицу в другую filegroup

rsdman_21610
Дата: 16.02.2010 21:19:17
Прошу о помощи:

Есть база с таблицой которая занимает ~70G. Нужно перенести эту таблицу в другую файловую группу, которая находится на другом диске.
В таблице есть колонка типа image, объявление таблицы ниже.
Какой максимально быстрый способ перенести таблицу в другую группу?

Заранее спасибо за совет.


CREATE TABLE [dbo].[GameDownload](
	[GameDownloadID] [int] IDENTITY(1,1) NOT NULL,
	[GameID] [int] NOT NULL,
	[ContentType] [varchar](255) NULL,
	[ContentDisposition] [varchar](255) NULL,
	[QueryString] [varchar](255) NULL,
	[Data] [image] NULL,
	[DataSize] [int] NOT NULL,
	[LastDownloaded] [datetime] NOT NULL,
 CONSTRAINT [PK__GameDown__2AB897DD2334397B] PRIMARY KEY CLUSTERED 
(
	[GameDownloadID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
Crimean
Дата: 16.02.2010 21:49:47
а какое соотношение собственно БЛОБа и самой таблицы по размерам?
сильно подозреваю, что это будет определяющим фактором
rsdman_21610
Дата: 16.02.2010 22:10:22
Crimean
а какое соотношение собственно БЛОБа и самой таблицы по размерам?
сильно подозреваю, что это будет определяющим фактором

Без БЛОБа - 40MB, с ним 70 000MB.
Crimean
Дата: 16.02.2010 22:12:28
версия сервера? редакция? средний / максимальный размер блоба?
rsdman_21610
Дата: 16.02.2010 22:18:21
MS SQL 2008 SP1 (64bit), Product Version 10.0.2531.0
BLOB avg ~16MB.
Crimean
Дата: 17.02.2010 10:26:54
перенос таблицы в другую файлгруппу - все равно перемещение достаточно большого объема данных. в "нашем" случае это 70 гиг. "отягчающие" условия - наличие БЛОБа..
если в таблице есть кластерный индекс - удалить все некластерные, пеерсоздать кластерный с указанием новой файлгруппы (и файлггруппы для БЛОБа), создать некластерные (с указанием файлгруппы)
но средний размер блоба в средние 16 мег заставляет задуматься, а не перевести ли его в файлстрим? опять же, если на таблице нет кластерного индекса, то для перемещения между файлгруппами его нужно будет создать и удалить, а это 2 больших операции с таблицей
я все к чему
если кластерный индекс (ключ) есть - просто его перестроить с указанием файлгруппы
если нет - подумать насчет "булькнуть", возможно, сразу и БЛОБ превратить в файлстрим..
да! журнала надо будет минимум те же 70 гиг, если за 1 раз булькать
ну или цикл писать, в целом будет дольше, но и ресурсов поест меньше
rsdman_21610
Дата: 17.02.2010 13:15:14
Crimean,

Как видно из DDL выше, кластерный индекс есть.
Но я где то слышал что перенос между группами невозможен для таблицы с БЛОБом.

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

CREATE TABLE [dbo].[newGameDownload](
	[GameDownloadID] [int] IDENTITY(1,1) NOT NULL,
	[GameID] [int] NOT NULL,
	[ContentType] [varchar](255) NULL,
	[ContentDisposition] [varchar](255) NULL,
	[QueryString] [varchar](255) NULL,
	[Data] [image] NULL,
	[DataSize] [int] NOT NULL,
	[LastDownloaded] [datetime] NOT NULL,
 CONSTRAINT [PK__GameDownload] PRIMARY KEY CLUSTERED 
(
	[GameDownloadID] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON) ON [PRIMARY]
) ON [GamesDataGroup] TEXTIMAGE_ON [GamesDataGroup]

CREATE TABLE #movedrows (RowID int primary key)

DECLARE @RowCount int
SET @RowCount = 1000

WHILE @RowCount > 0
BEGIN
SET IDENTITY_INSERT [newGameDownload] ON

INSERT INTO [newGameDownload]
           ([GameDownloadID]
           ,[GameID]
           ,[ContentType]
           ,[ContentDisposition]
           ,[QueryString]
           ,[Data]
           ,[DataSize]
           ,[LastDownloaded])
OUTPUT inserted.GameDownloadID INTO #movedrows
SELECT TOP 1000
			[GameDownloadID]
			,[GameID]
           ,[ContentType]
           ,[ContentDisposition]
           ,[QueryString]
           ,[Data]
           ,[DataSize]
           ,[LastDownloaded]
FROM [GameDownload]
WHERE NOT EXISTS (SELECT 1 FROM #movedrows WHERE RowID = GameDownloadID)

SET @RowCount = @@ROWCOUNT

SET IDENTITY_INSERT [newGameDownload] OFF
END

DROP TABLE #movedrows
Crimean
Дата: 17.02.2010 14:05:54
> кластерный индекс есть.

констрейнт, а не индекс, что чуть усложняет вопрос

> перенос между группами невозможен для таблицы с БЛОБом

собрать модельку займет секунд 40, не больше

> как оценить сколько времени он будет выполняться

в симпл (!) модели засекаешь выполнение первых 10 итераций и умножаешь. в противном случае вопросы с журналом могут время затянуть