Я думаю, что это будет довольно простой вопрос, но на самом деле мне было трудно найти ответ на этот вопрос.
Вопрос: Можете ли вы переместить строки данных в разделенной таблице из одного раздела в другой, просто обновив столбец раздела так, чтобы он пересекал границу раздела?
Например, если у меня есть таблица с ключом раздела:
CREATE TABLE SampleTable
(
SampleID INT PRIMARY KEY,
SampleResults VARCHAR(100) NOT NULL,
)
С функцией разделения, которая отображается на первичный ключ:
CREATE PARTITION FUNCTION MyPartitionFunc (INT) AS
RANGE LEFT FOR VALUES (10000, 20000);
Можно ли переместить строку из первого раздела в третий, изменив SampleID с 1 на (скажем) 500 000?
Примечание: я отмечаю это как SQL Server 2005 и 2008, так как они оба поддерживают разбиение. Они справляются с этим по-другому?
$PARTITION
вычисляет только номер раздела на основе ввода; это фактически не проверяет, где физически живет ряд.Чтобы проверить это, эксперимент должен фактически разделить таблицу. См. Http://www.kodyaz.com/articles/how-to-partition-table-non-partitioned-table-sql-server-2008.aspx
Запрос функции разделения просто говорит вам, что говорит функция разделения. Там не сказано, где хранятся данные. Вы можете настроить функцию разделения и запустить ее без фактического разделения таблицы, как уже было продемонстрировано здесь.
Чтобы разделить таблицу, вы также должны создать группы файлов и схему разделения, которая использует функцию разделения для назначения результатов функции группам файлов. Затем вы должны поместить кластерный ключ в таблицу, которая использует эту схему разбиения.
Настройте разделение
Я не эксперт в командной строке SQL. Я использовал интерфейс SSMS для настройки групп файлов pfg1 (с файлом pf1) и pfg2 (с файлом pf2). Затем я объявил функцию разделения и схему:
Создать таблицу и кластерный индекс
После того, как вы это сделаете, когда вы запросите sys.partitions (у меня есть 2005), вы увидите, что в таблице теперь есть два раздела вместо одного для таблицы. Это указывает на то, что мы полностью реализовали разбиение для этой таблицы.
Теперь, когда у нас есть два раздела (с количеством строк для каждого), мы можем провести эксперимент.
Вставьте строки
Проверьте sys.partitions, чтобы увидеть, что случилось.
Ага. Одна строка в каждом разделе.
Переместить ряд.
Проверьте разделы
Первый раздел теперь имеет две строки вместо 1, а второй раздел имеет нулевые строки вместо двух.
Я думаю, это подтверждает, что строка была автоматически перемещена в результате изменения кластеризованного ключа в многораздельной таблице.
источник
Я не думаю, что ответ правильный. Когда вы используете значение
вы просто пересчитываете, каким должен быть раздел, а не то, где в данный момент находится запись.
Вы должны использовать:
В моих тестах на SQL 2005 значение меняется, но запись остается в том же разделе. Вероятно, это будет мешать статистике и оптимизатору, так как он будет работать в многопоточном режиме, ожидая, что раздел находится в определенном диапазоне. Это также будет совершенно неправильно, если он попытается использовать удаление разделов только для запроса соответствующего раздела. Я думаю, что вам нужно удалить и заново вставить каждую запись, чтобы заставить их двигаться.
источник
$partition
здесь предполагает, что принятый ответ является правильным. Как вы подтверждаете, что запись остается в том же разделе после ее обновления?