Рейтинг:0

SQL Server - Как разбить один файл mdf на несколько и разделить данные таблицы между ними?

флаг pl

В надежде улучшить производительность SQL Server я хотел бы взять мою простую базу данных с 1 файлом (1 mdf и 1 ldf) и разделить файлы mdf (и, возможно, файлы ldf) на несколько дисков. Я думаю, что наиболее эффективным способом сделать это было бы разбить большие таблицы на несколько файлов mdf. (Я планирую просто использовать функцию разделения, которая является модулем первичного ключа (который является целым или большим), например (MyTable.Id % 8), где 8 — количество дисков, которые у меня есть).

Какой самый быстрый/лучший/правильный способ сделать это? Например, какие команды SQL или операции SSMS мне нужно выполнить, чтобы добраться из того места, где я сейчас, туда, куда я хочу.

Любые другие предложения также будут оценены. (Объединение дисков через Storage Spaces просто не похоже на вариант, потому что по какой-то причине я просто не получаю хорошей производительности IOPS при записи.)

Рейтинг:1
флаг cn

Вам не нужно использовать разбиение (но можно, если у вас есть другая причина). Если вы создадите новую файловую группу, содержащую нужные вам физические файлы, и перестроите индекс для новой файловой группы, этого должно быть достаточно для распределения данных по этим физическим файлам.

Процесс восстановления будет выглядеть примерно так. Скажем, текущий индекс имеет следующее определение:

создать кластерный индекс [CIX_foo] для dbo.foo (FooID) для [PRIMARY];

Вы можете восстановить его следующим образом:

создать кластеризованный индекс [CIX_foo] для dbo.foo (FooID) с (drop_existing = on) для [NewFileGroup];

Используйте любые другие параметры, которые вы обычно используете при создании этого индекса (например, sort_in_tempdb, pad_index, онлайн, возобновляемый и т. д.).Также подумайте, имеет ли смысл изменение настроек сжатия существующего индекса — вы переписываете весь индекс, так что сейчас самое время!

Наконец, в качестве рекомендации я бы создал как минимум два файла на диск в новой файловой группе. Почему? Если ваш SWAG из 8 файлов (и, предположительно, 8 дисков) недостаточен для вашего варианта использования, вам придется снова пройти описанный выше процесс перестроения индекса. Но если вы это сделаете, скажем, два файла на диск (всего шестнадцать), вы можете предоставить новое хранилище и просто выполнить либо копию файла файловой системы (когда база данных отключена), либо восстановление с указанием новых местоположений. Любой из них должен быть быстрее, чем перестроение индексов.

N73k avatar
флаг pl
Спасибо, Бен. Вопрос 1. Как SQL Server узнает, в каком файле находится данная запись? Вопрос 2: Будет ли какое-то преимущество в скорости при использовании функции разбиения, как я говорил в своем первоначальном вопросе? Вопрос 3: Я предполагаю, что если я хочу переместить индексы (а не только таблицы) в эту новую файловую группу (и распределить данные по файлам), мне придется выполнить одинаковую команду для каждого индекса.
Ben Thul avatar
флаг cn
1. Несколько выходит за рамки вопроса. То есть, какую проблему эти знания помогут вам решить? 2. Разбиение на разделы в mssql больше связано с управлением данными, чем с производительностью. Это позволяет вам обменивать данные в/из таблицы как операцию с метаданными. Классический случай — это загрузка DW, в которой вы бы ETL записали дневные данные в промежуточную таблицу, а затем загрузили их, когда закончите. 3. Да — каждая куча или сбалансированное дерево существуют в пространстве данных. Файловая группа — это тип пространства данных (второй — схема разделов). Любой индекс, который вы хотите в своей новой FG, должен быть перемещен явно.
N73k avatar
флаг pl
Для Q1: Меня интересует производительность. Итак, если SQL Server хочет обновить некоторые записи, должен ли он проверять каждый диск, чтобы увидеть, где эти записи находятся или должны быть, или у него есть быстрый способ узнать (даже без функции разделения), где эти данные (или должно идти) чтобы обращались только к 1 диску?
Ben Thul avatar
флаг cn
Грубо говоря, данные будут равномерно распределены по всем файлам в FG. Решая вашу проблему, SQL не выполняет разброс/сбор для поиска данных, а скорее перемещается по B-дереву для поиска соответствующих страниц данных (и, соответственно, файлов, содержащих эти страницы).
N73k avatar
флаг pl
Что ж, Бен, прошло много времени, а у тебя до сих пор нет золота. Но не больше.

Ответить или комментировать

Большинство людей не понимают, что склонность к познанию нового открывает путь к обучению и улучшает межличностные связи. В исследованиях Элисон, например, хотя люди могли точно вспомнить, сколько вопросов было задано в их разговорах, они не чувствовали интуитивно связи между вопросами и симпатиями. В четырех исследованиях, в которых участники сами участвовали в разговорах или читали стенограммы чужих разговоров, люди, как правило, не осознавали, что задаваемый вопрос повлияет — или повлиял — на уровень дружбы между собеседниками.