Превышающие размер страницы данные строки, превышающие 8 КБ
Строка таблицы может содержать максимум 8 060 байт. В SQL Server 2008 это ограничение сделано менее строгим в отношении таблиц, содержащих столбцы varchar, nvarchar, varbinary, sql_variant или столбцы определяемого пользователем типа данных CLR. Длина каждого из этих столбцов по-прежнему не может быть больше 8000 байт; но их общая длина может превышать предел 8060 байт. Это применимо в отношении столбцов varchar, nvarchar, varbinary, sql_variant или столбцов определяемого пользователем типа данных CLR при их создании или изменении, а также при обновлении и вставке данных.
Примечание |
---|
Данное ограничение не относится к столбцам varchar(max), nvarchar(max), varbinary(max), text, image или xml. Дополнительные сведения о хранении этих столбцов см. в разделах Использование типов данных больших значений, Использование типов данных text и image и Использование XML-данных. |
Замечания относительно переполнения строк
При объединении столбцов varchar, nvarchar, varbinary, sql_variant или столбцов определяемого пользователем типа данных CLR, длина которых превышает 8 060 байт на строку, необходимо учитывать следующее:
Превышение предела в 8 060 байт на строку может повлиять на производительность, поскольку SQL Server по-прежнему поддерживает максимум 8 КБ на страницу. Если сочетание столбцов varchar, nvarchar, varbinary, sql_variant или столбцов определяемого пользователем типа данных CLR выходит за этот предел, компонент SQL Server Database Engine перемещает столбец записи с наибольшей шириной на другую страницу в единице распределения ROW_OVERFLOW_DATA, оставляя при этом 24-разрядный указатель на исходной странице. Перемещение больших записей на другую страницу осуществляется динамически, по мере удлинения записей при операциях обновления. Операции обновления, которые укорачивают записи, могут привести к возвращению записей на исходную страницу в единице распределения IN_ROW_DATA. Кроме того, выполнение запросов и других операций выборки, например сортировки и соединения, в отношении больших записей с превышающими размер страницы данными строки, увеличивает время обработки, поскольку эти записи обрабатываются синхронно, а не асинхронно.
Поэтому при построении таблиц с несколькими столбцами varchar, nvarchar, varbinary, sql_variant или столбцами определяемого пользователем типа данных CLR следует учитывать процент строк, в которых возможно переполнение и вероятную частоту запросов данных переполнения. Если ожидаются частые запросы по многим превышающим размер страницы данным строки, рекомендуется нормализовать таблицу таким образом, чтобы некоторые столбцы переместились в другую таблицу. После этого запросы по таблице можно будет выполнять с помощью асинхронной операции JOIN.
Длина отдельных столбцов varchar, nvarchar, varbinary, sql_variant и столбцов определяемого пользователем типа данных CLR по-прежнему не должна превышать 8 000 байт. И только общая их длина может выходить за предел в 8 060 байт на строку таблицы.
Сумма столбцов данных других типов, включая char и nchar, не должна превышать 8 060 байт на строку. Данные больших объектов также могут выходить за предел в 8 060 байт на строку.
Ключ индекса кластеризованного индекса не может содержать столбцы типа varchar, в которых имеются данные в единице распределения ROW_OVERFLOW_DATA. Если кластеризованный индекс создается для столбца типа varchar и существующие данные располагаются в единице распределения IN_ROW_DATA, то все последующие операции вставки или обновления для данного столбца, выталкивающие данные за пределы строки, будут завершаться ошибкой. Дополнительные сведения о единицах распределения см. в разделе Организация таблиц и индексов.
Пользователь может включить столбцы, которые содержат превышающие размер страницы данные строки, в качестве ключевых или неключевых столбцов некластеризованного индекса.
Максимальный размер записи в таблицах, в которых используются разреженные столбцы, составляет 8 018 байт. Если суммарная величина преобразуемых данных и существующих данных записи превышает 8 018 байт, то возвращается ошибка MSSQLSERVER ERROR 576. Если выполняется преобразование разреженных и неразреженных типов, то компонент Database Engine хранит копию текущих данных записи. В связи с этим удваивается количества места, которое требуется для хранения записи.
Для получения сведений о таблицах или индексах, которые могут содержать превышающие размер страницы данные строки, используется функция динамического управления sys.dm_db_index_physical_stats.