Невозможно создать строку с разреженными данными размером 8330, который превышает допустимый максимальный размер разреженных данных 8023

#sql #sql-server #sparse-matrix

Вопрос:

Я работаю над приложением, в котором есть таблица из 3000 разреженных столбцов (nvarchar(Макс)), я знаю, что это не очень хорошая идея-иметь столько столбцов, но нашим требованием было хранить все данные в одной строке. В таблице не так много строк.

Вначале это нормально работало с меньшим количеством данных в столбцах, но через некоторое время, когда мы добавили данные в большее количество столбцов, возникла следующая проблема:

Невозможно создать строку с разреженными данными размером 8330, который превышает допустимый максимальный размер разреженных данных 8023

Я сохраняю только ненулевые значения в запросе вставки/обновления, я использую эту ссылку для вставки/обновления на основе наборов столбцов

Может ли кто-нибудь помочь мне, как сохранить большие данные в 3000 разреженных столбцах? В настоящее время эти данные сохраняются максимум в 1200 столбцах, и в основном это не длинные строки.

Комментарии:

1. Наличие 3000 разреженных столбцов не «ужасно», 3000 nvarchar(MAX) столбцов? Вам ни в коем случае не нужно 6000 ГБ на строку.

2. Мне любопытно, на чем основано требование хранить все эти данные в одной строке. Это невероятно неудачное дизайнерское решение, и теперь вы точно понимаете, почему. Я бы сказал, что ищите способы нормализации ваших данных. Если нормализация невозможна, я бы сказал, что, возможно, реляционная база данных является неправильной платформой для вашего приложения, и вместо этого вам следует обратиться к платформе на основе документов, такой как MongoDB или CouchDB.

3. Да, что бы ни требовало, чтобы значение nvarchar(max) указывалось в разреженном столбце #467, у вас легко может быть два столбца, в одном из которых хранится 467, а в другом-большой двоичный объект. Это на 2998 столбцов меньше! Ура! И, возможно, больше строк, если для этой строки будет храниться более одного большого двоичного объекта, но именно поэтому мы используем реляционную базу данных. Если вы не хотите нормализовываться, используйте плоские файлы или базу данных на основе документов, как предложил @squillman.

4. Обратите внимание, что вы можете создать разреженную матрицу с нормализованными данными. Вам просто нужно объединить таблицы в своем запросе, а не запрашивать одну таблицу.