Я понимаю, что мне нужно разделить или проиндексировать таблицу
Вам нужно понять, что вы получаете от разбиения. Это совсем не тот случай, когда SQL Server требует правильного разделения на большие таблицы. SQL Server масштабируется до произвольных размеров таблиц без каких-либо внутренних проблем.
Общие преимущества разделения:
- Массовое удаление в постоянное время
- Другое хранилище для старых разделов
- Не резервировать старые разделы
Иногда в особых ситуациях (например, columnstore) разбиение может помочь в качестве стратегии для ускорения запросов. Обычно для этого лучше индексировать.
По сути, разбиение разбивает таблицу физически на несколько вложенных таблиц. Чаще всего это оказывает отрицательное влияние на планы запросов. Индексы вполне способны ограничить набор данных, к которым нужно прикоснуться. Перегородки хуже для этого.
Большинство запросов будут фильтроваться по столбцам datetime и по некоторым столбцам varchar. Мол, получить данные для определенного диапазона дат для определенного объекта. С индексами он будет сильно фрагментирован из-за новых вставок, а перестройка / реорганизация индексов также потребует много времени. Я могу сделать это, но опять же не уверен, какой подход.
Кажется, вы можете лучше всего решить эту проблему с помощью индексации:
- Индекс в соответствии с ожидаемыми запросами.
- Поддерживать индексы должным образом. Это не так уж сложно. Например, восстановите их после еженедельной загрузки.
Поскольку таблица большая, я должен сначала создать индексы или сначала создать разделы?
Сначала настройте разделение объектов. Затем создайте или перестройте кластеризованный индекс на новой схеме секционирования. Если возможно, сначала удалите другие индексы, а затем создайте их заново (может не работать из-за ограничений доступности).
что мне делать, чтобы получать новые данные, поступающие еженедельно.
Какие у вас проблемы? Новые данные будут сохранены в соответствующих разделах автоматически. Обязательно создайте новые разделы перед загрузкой данных. Держите перегородки готовыми за 2 недели. Последние разделы всегда должны быть пустыми, чтобы избежать дорогостоящих разбиений.
В таблице нет первичного ключа.
Чаще всего это не очень хороший дизайн. Большинство таблиц должны иметь первичный ключ и кластерный индекс. Если нет естественного ключа, используйте искусственный ключ, такой как bigint identity
.
Вы определенно можете применить разбиение, но я чувствую, что оно не даст вам того, чего вы, возможно, ожидаете. Но это заставит вас взять на себя дополнительное бремя обслуживания, возможно, снизить производительность, и существует риск ошибок, угрожающих доступности. Простота важна.