GO
Обратите внимание, что для использования столбца DocumentID в качестве столбца секционирования базовый некластеризованный индекс, применяющий ограничение UNIQUE
к DocGUID, должен быть явным образом размещен в файловой группе, так как столбец DocumentID может быть столбцом секционирования. Это означает, что переключение секций возможно только в том случае, если ограничения UNIQUE отключены перед выполнением переключения секций,
так как они представляют собой невыровненные индексы, а затем повторно включены.
Продолжая предыдущий пример, приведенный ниже код создает таблицу, а затем пытается переключить секции.
CREATE TABLE NonPartitionedDocumentStore (
DocumentID INT IDENTITY PRIMARY KEY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
UNIQUE DEFAULT NEWID ());
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
Переключение секции завершается следующим сообщением об ошибке.
Сообщение 7733, уровень 16, состояние 4, строка 1
«ALTER TABLE SWITCH» — ошибка при выполнении инструкции. Таблица «FileStreamTestDB. dbo. DocumentStore» секционирована, а индекс «UQ_Document_8CC1617F60ED59» не секционирован.
Отключить уникальный индекс в исходной таблице и повторить попытку можно с использованием следующего кода.
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON DocumentStore DISABLE;
GO
ALTER TABLE FileStreamTest3 SWITCH PARTITION 2 TO NonPartitionedFileStreamTest3;
GO
Эта попытка также завершится следующим сообщением об ошибке.
Сообщение 4947, уровень 16, состояние 1, строка 1
ALTER TABLE SWITCH — ошибка при выполнении инструкции. Отсутствует идентичный индекс в исходной таблице «FileStreamTestDB. dbo. DocumentStore» для индекса «UQ_NonParti_8CC3316103317E3D» в целевой таблице «FileStreamTestDB. dbo. NonPartitionedDocumentStore».
Прежде чем выполнить переключение, убедитесь в том, что отключены уникальные индексы как
в секционированных, так и несекционированных таблицах.
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON NonPartitionedDocumentStore DISABLE;
GO
ALTER TABLE DocumentStore SWITCH PARTITION 2 TO NonPartitionedDocumentStore;
GO
ALTER INDEX [UQ__NonParti__8CC3316103317E3D] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
ALTER INDEX [UQ__Document__8CC331617F60ED59] ON
NonPartitionedDocumentStore REBUILD WITH (ONLINE = ON);
GO
Дополнительные сведения о секционировании данных FILESTREAM будут приведены в будущем техническом документе о секционировании в SQL Server 2008.
Балансировка нагрузки данных FILESTREAM
Секционирование можно также применять для создания схемы таблицы, которая допускает грубую балансировку нагрузки данных FILESTREAM между несколькими томами. Это может оказаться желательным по многим причинам, в частности из-за аппаратных ограничений или чтобы разрешить хранение гиперобъектов в таблице на разных томах.
Следующий код демонстрирует функцию и схему секционирования по столбцу uniqueidentifier, который, в сущности, распределяет данные FILESTREAM по 16 томам при чередовании структурированных данных между двумя файловыми группами.
USE master;
GO
-- Создание базы данных
CREATE DATABASE Production ON PRIMARY
(NAME = 'Production', FILENAME = 'E:\Production\Production. mdf'),
FILEGROUP DataFilegroup1
(NAME = 'Data_FG1', FILENAME = 'F:\Production\Data_FG1.ndf'),
FILEGROUP DataFilegroup2
(NAME = 'Data_FG2', FILENAME = 'G:\Production\Data_FG2.ndf'),
FILEGROUP FSFilegroup0 CONTAINS FILESTREAM
(NAME = 'FS_FG0', FILENAME = 'H:\Production\FS_FG0'),
FILEGROUP FSFilegroup1 CONTAINS FILESTREAM
(NAME = 'FS_FG1', FILENAME = 'I:\Production\FS_FG1'),
FILEGROUP FSFilegroup2 CONTAINS FILESTREAM
(NAME = 'FS_FG2', FILENAME = 'J:\Production\FS_FG2'),
FILEGROUP FSFilegroup3 CONTAINS FILESTREAM
(NAME = 'FS_FG3', FILENAME = 'K:\Production\FS_FG3'),
FILEGROUP FSFilegroup4 CONTAINS FILESTREAM
(NAME = 'FS_FG4', FILENAME = 'L:\Production\FS_FG4'),
FILEGROUP FSFilegroup5 CONTAINS FILESTREAM
(NAME = 'FS_FG5', FILENAME = 'M:\Production\FS_FG5'),
FILEGROUP FSFilegroup6 CONTAINS FILESTREAM
(NAME = 'FS_FG6', FILENAME = 'N:\Production\FS_FG6'),
FILEGROUP FSFilegroup7 CONTAINS FILESTREAM
(NAME = 'FS_FG7', FILENAME = 'O:\Production\FS_FG7'),
FILEGROUP FSFilegroup8 CONTAINS FILESTREAM
(NAME = 'FS_FG8', FILENAME = 'P:\Production\FS_FG8'),
FILEGROUP FSFilegroup9 CONTAINS FILESTREAM
(NAME = 'FS_FG9', FILENAME = 'Q:\Production\FS_FG9'),
FILEGROUP FSFilegroupA CONTAINS FILESTREAM
(NAME = 'FS_FGA', FILENAME = 'R:\Production\FS_FGA'),
FILEGROUP FSFilegroupB CONTAINS FILESTREAM
(NAME = 'FS_FGB', FILENAME = 'S:\Production\FS_FGB'),
FILEGROUP FSFilegroupC CONTAINS FILESTREAM
(NAME = 'FS_FGC', FILENAME = 'T:\Production\FS_FGC'),
FILEGROUP FSFilegroupD CONTAINS FILESTREAM
(NAME = 'FS_FGD', FILENAME = 'U:\Production\FS_FGD'),
FILEGROUP FSFilegroupE CONTAINS FILESTREAM
(NAME = 'FS_FGE', FILENAME = 'V:\Production\FS_FGE'),
FILEGROUP FSFilegroupF CONTAINS FILESTREAM
(NAME = 'FS_FGF', FILENAME = 'W:\Production\FS_FGF');
GO
USE Production;
GO
-- Создание функции секционирования на основе последних 6 байт GUID
CREATE PARTITION FUNCTION LoadBalance_PF (UNIQUEIDENTIFIER)
AS RANGE LEFT FOR VALUES (
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-100000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-200000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-300000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-400000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-500000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-600000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-700000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-800000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-900000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-a00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-b00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-c00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-d00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-e00000000000'),
CONVERT (uniqueidentifier, '00000000-0000-0000-0000-f00000000000'));
GO
-- Создание схемы секционирования FILESTREAM, которая обеспечивает сопоставление до 16 файловых групп FILESTREAM
CREATE PARTITION SCHEME LoadBalance_FS_PS
AS PARTITION LoadBalance_PF TO (
FSFileGroup0, FSFileGroup1, FSFileGroup2, FSFileGroup3,
FSFileGroup4, FSFileGroup5, FSFileGroup6, FSFileGroup7,
FSFileGroup8, FSFileGroup9, FSFileGroupA, FSFileGroupB,
FSFileGroupC, FSFileGroupD, FSFileGroupE, FSFileGroupF);
GO
-- Создание схемы секционирования данных для циклического перебора между двумя файловыми группами
CREATE PARTITION SCHEME LoadBalance_Data_PS
AS PARTITION LoadBalance_PF TO (
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2,
DataFileGroup1, DataFileGroup2, DataFileGroup1, DataFileGroup2);
GO
-- Создание секционированной таблицы
CREATE TABLE DocumentStore (
DocumentID INT IDENTITY,
Document VARBINARY (MAX) FILESTREAM NULL,
DocGUID UNIQUEIDENTIFIER NOT NULL ROWGUIDCOL
DEFAULT NEWID (),
CONSTRAINT DocStorePK PRIMARY KEY CLUSTERED (DocGUID),
CONSTRAINT DocStoreU UNIQUE (DocGUID))
ON LoadBalance_Data_PS (DocGUID)
FILESTREAM_ON LoadBalance_FS_PS;
GO
Балансировку нагрузки можно протестировать с помощью следующего кода.
SET NOCOUNT ON;
GO
-- Вставка 10 000 строк для тестирования балансировки нагрузки
DECLARE @count INT = 0;
WHILE (@count < 10000)
BEGIN
INSERT INTO DocumentStore DEFAULT VALUES;
SET @count = @count + 1;
END;
GO
-- Проверка распределения
SELECT COUNT ($PARTITION. LoadBalance_PF (DocGUID))
FROM DocumentStore
GROUP BY $PARTITION. LoadBalance_PF (DocGUID);
GO
Результатами образцового выполнения этого теста были 631, 641, 661, 640, 649, 637, 618, 618, 576, 608, 595, 645, 640, 616, 602 и 623 строк в каждой из файловых групп от FILESTREAM FS_FG0 до FS_FGF.
Сочетания функций и ограничения
Поскольку компонент FILESTREAM хранит данные в файловой системе, существуют некоторые ограничения и особенности при взаимодействии FILESTREAM с другими компонентами
SQL Server. В этом разделе приведены общие сведения о сочетаниях компонентов, которые необходимо учитывать. Дополнительные сведения см. в разделе «Использование FILESTREAM
с другими компонентами SQL Server» электронной документации по SQL Server 2008 (http://msdn. microsoft. com/ru-ru/library/bb895334.aspx).
Репликация
Как репликация транзакций, так и репликация слиянием поддерживают данные FILESTREAM, однако необходимо учитывать множество факторов, например:
· Если топология репликации включает экземпляры с использованием различных версий SQL Server, существуют ограничения на размер данных, которые можно передавать
в экземпляры более низкого уровня.
· Параметры фильтра репликации определяют, реплицирован ли атрибут FILESTREAM,
или не используют репликацию транзакций.
· Размер максимального значения данных varbinary (max), которые могут быть реплицированы в репликации транзакций без репликации атрибута FILESTREAM, — 2 ГБ.
· Если используется репликация слиянием, то для нее и FILESTREAM требуется столбец типа uniqueidentifier. Следует соблюдать осторожность в отношении схемы таблицы
при использовании репликации слиянием, чтобы идентификаторы GUID были последовательными (т. е. использовать NEWSEQUENTIALID() вместо NEWID()).
Зеркальное отображение базы данных
Зеркальное отображение базы данных не поддерживает FILESTREAM. Создание файловой группы FILESTREAM на основном сервере невозможно. Настройка зеркального отображения базы данных, содержащей файловые группы FILESTREAM, невозможна.
|
Из за большого объема этот материал размещен на нескольких страницах:
1 2 3 4 5 6 7 8 |


