Пример использования таблицы в памяти SQL Server с огромными данными
У меня есть таблица SQL Server с более чем 160 миллионами записей, имеющих непрерывные операции CRUD из пользовательского интерфейса, пакетные задания и т. Д. В основном из нескольких источников.
В настоящее время я разбил таблицу на столбцы, чтобы повысить производительность в таблице.
Я столкнулся с таблицами в памяти, которые можно использовать в случае таблиц с частыми обновлениями, а также, если обновления происходят из нескольких источников, он не будет блокировать, вместо этого он будет поддерживать управление версиями строк, поэтому одновременные обновления лучше использовать этот подход.
Итак, какие у меня варианты в этом случае?
Разделите таблицу на разделы или создайте таблицу в памяти
Поскольку я читал, что SQL-сервер не поддерживает таблицу в памяти, когда таблица разбита на разделы.
Какой вариант лучше в этом случае - таблица в памяти или секционированная таблица.
1 ответ
Это зависит.
Таблицы в памяти выглядят отлично в теории, но вам действительно нужно потратить время на изучение деталей, чтобы сделать правильную реализацию. Некоторые детали могут вас смутить. Например:
- в таблицах в памяти нет параллельных вставок, которые замедляют создание строк по сравнению с параллельной вставкой в традиционной таблице, хранящейся на SSD
- не все операции с индексами, поддерживаемые индексами на основе dis, доступны в индексах таблиц в памяти
- не все типы данных поддерживаются
- есть как неподдерживаемые функции, так и конструкции T-SQL
- вам может понадобиться больше оперативной памяти, чем вы думаете
Если вы готовы заплатить цену за использование Hekaton, вы можете начать с чтения его официального документа.
Само по себе разделение имеет свои преимущества, но нет гарантии, что оно исцелит вашу систему. Только определенные запросы и сценарии могут извлечь выгоду из этого. Например, если 99% вашей рабочей нагрузки касается данных в одном разделе, вы можете вообще не увидеть оптимизации. С другой стороны, если ваши отчеты основаны на исторических данных и ваши вставки / обновления / удаления касаются другого раздела, это будет лучше.
Обе технологии хороши, но требуют детального изучения и осторожного применения. Часто люди считают, что использование новых технологий решит их проблемы, когда проблемы можно решить, просто применяя некоторые базовые концепции.
Например, вы сказали, что выполняете CRUD более 160 миллионов записей. Спроси себя:
- нормализована ли моя таблица - когда данные хранятся нормализованным образом, вы получаете две вещи: во-первых, вы будете выполнять CRUD только для части данных, движок может читать только те данные, которые необходимы для конкретного запроса (без необходимости поддержки индекс)
- хорошо ли пишутся мои операторы T-SQL - строка за мучительной строкой, вызов хранимых процедур в циклах или не обработка данных в пакетах - распространенные источники медленных запросов
- которые являются блокирующими и взаимоблокированными запросами - например, существует возможность одного длительного запроса для блокировки всех ваших вставок - сначала определите эти типы проблем и попытайтесь решить их с помощью предварительного расчета данных (индексированное представление) или создания покрывающих индексов которые также можно фильтровать с помощью включаемых столбцов)
- блокируются ли читатели и писатели - вы можете попробовать разные уровни изоляции для решения этого типа проблем - RCSI - это уровень изоляции Azure по умолчанию. Возможно, вам потребуется добавить больше ОЗУ к вашему RAMDISK, используемому вашим TempDB, но, поскольку вы смотрите на Hekaton, это будет легче протестировать (и выполнить откат) по сравнению с ним (или разбить на разделы)