Сколько столбцов слишком много для таблицы SQL Server 2005?

У меня есть просьба разрешить динамической таблице иметь 1000 столбцов (случайно выбранных моими конечными пользователями). Мне это кажется плохой идеей. Это настраиваемая таблица, поэтому в ней будет смесь столбцов varchar(200) и float (float лучше всего соответствует двойному типу приложений C++). Эта база данных в основном является индексом для устаревшего приложения и служит репозиторием отчетов. Это не система записи. Приложение содержит тысячи точек данных, очень немногие из которых можно нормализовать.

Любые идеи относительно того, как это повлияет на производительность? Или идеальный размер таблицы, чтобы разделить это на части?

Поскольку я не знаю, какие поля из 20k вариантов выбора конечные пользователи выберут, нормализация таблиц неосуществима. Я могу разделить эти данные на несколько таблиц, которыми мне придется динамически управлять (поля могут быть добавлены или опущены. Затем строки удаляются, а система записи повторно анализируется, чтобы заполнить таблицу). Я предпочитаю отодвинуть и нормализовать все 20к бит данных. Но я этого не вижу.

Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
11
0
26 204
10
Перейти к ответу Данный вопрос помечен как решенный

Ответы 10

Как правило: чем шире стол, тем медленнее производительность. Многие тонкие столы предпочтительнее одного жирного стола.

Если ваш стол такой широкий, это почти наверняка проблема дизайна. Нет никакого реального правила о том, сколько столбцов предпочтительнее, я никогда не сталкивался с таблицами с более чем 20 столбцами в реальном мире. Просто сгруппируйте по родству. В конце концов, это СУБД.

«чем шире таблица, тем ниже производительность» Нет, это не общее правило, это зависит от характера запросов. Денормализация часто выполняется для повышения производительности определенных типов запросов.

bradw2k 06.04.2015 21:04

Похоже, очень много. Я бы сначала убедился, что данные нормализованы. Это может быть частью вашей проблемы. Какой цели будут служить эти данные? Это для отчетов? Данные изменятся?

Я бы подумал, что стол такой ширины будет кошмаром с точки зрения производительности и обслуживания.

Я видел это при импорте данных из файла csv. CSV приходил ежедневно из устаревшей системы, и с 8-900 столбцами было быстрее просто поместить его в одну таблицу.

StingyJack 01.12.2008 19:38

если таблица будет использоваться только как временное хранилище и сразу же преобразована в более подходящую форму, то я не думаю, что OP будет задавать вопрос ...

rmeador 01.12.2008 20:05

Это слишком много. Если ширина столбцов превышает 50, вы просите о проблемах с производительностью, обслуживанием кода и устранением неполадок при возникновении проблем.

из документации SQL2005:

SQL Server 2005 может иметь до двух миллиардов таблиц в базе данных и 1024 столбца в таблице. (...) Максимальное количество байтов в строке - 8 060. Это ограничение ослаблено для таблиц со столбцами varchar, nvarchar, varbinary или sql_variant, из-за которых общая заданная ширина таблицы превышает 8 060 байт. Длина каждого из этих столбцов должна оставаться в пределах 8000 байт, но их общая ширина может превышать ограничение в 8060 байт в таблице.

какова функциональность этих столбцов? почему бы лучше не разделить их на основную таблицу, свойства (таблицы поиска) и значения?

MS SQL Server имеет ограничение в 1024 столбца на таблицу, так что вы будете работать на грани этого. Используя столбцы varchar (200), вы сможете преодолеть ограничение в 8 Кбайт на строку, поскольку SQL будет хранить 8 Кбайт на странице данных, а затем переполнять данные за пределами страницы.

В SQL 2008 добавлены разреженные столбцы для подобных сценариев, когда у вас будет много столбцов с нулевыми значениями.

Использование разреженных столбцов http://msdn.microsoft.com/en-us/library/cc280604.aspx

Разреженные столбцы были бы здесь хорошим вариантом, если вы можете использовать sql 2008. Также обратите внимание на использование связанных с ним наборов столбцов msdn.microsoft.com/en-us/library/cc280521.aspx

kristof 01.12.2008 20:31

Вот простой пример использования разреженных столбцов и наборов столбцов sqlskills.com/blogs/paul/post/…

kristof 01.12.2008 20:34
Ответ принят как подходящий

Мне это кажется плохим дизайном.

На что следует обратить внимание:

Будет ли большинство этих столбцов содержать значения NULL?

Многие ли будут называться Property001, Property002, Property003 и т. д.?

Если это так, я рекомендую вам переосмыслить нормализацию данных.

Эти столбцы будут относиться к точкам данных в приложении. Если пользователь рекламирует поле, я ожидаю, что значения обычно не будут нулевыми.

Aaron Fischer 01.12.2008 20:15

«Если пользователь добавляет поле» указывает мне, что в противном случае оно было бы нулевым. Этот список полей динамический? Будете ли вы добавлять столбцы для поддержки добавления полей? Тогда отношение 1 ко многим в порядке.

Chris Nava 26.09.2009 01:22

Это будет иметь огромные проблемы с производительностью и данными. Наверное, нужно нормализовать.

Хотя сервер SQl позволит вам создать таблицу, содержащую более 8060 байт строки inteh, он НЕ позволит вам хранить больше данных, чем в ней. У вас могут быть неожиданно усеченные данные (и, что еще хуже, это может произойти только через несколько месяцев, когда исправить это чудовище будет как срочно, так и чрезвычайно сложно).

Запросить это тоже будет настоящей проблемой. Как узнать, в каком из 1000 столбцов искать данные? Должен ли каждый запрос запрашивать все 1000 столбцов в предложении where?

И идея о том, что это будет настраивать пользователь, действительно пугает. Зачем пользователю нужно настраивать 1000 полей? Большинство приложений, которые я видел, которые дают пользователю возможность настраивать некоторые поля, устанавливают небольшой предел (обычно менее 10). Если их нужно настроить так много, значит, приложение плохо определило, что на самом деле нужно клиенту.

Иногда, как разработчику, вам просто нужно встать и сказать «нет», это плохая идея. Это один из тех моментов.

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

И, кстати, float - это неточный тип данных, и его не следует использовать для полей, в которых выполняются вычисления, если вам не нравятся неправильные результаты.

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

Если бы вы спросили: «Сколько символов я могу уместить в varchar?» тогда вам вообще не следует использовать varchars.

Если вы серьезно хотите знать, подходят ли 1000 столбцов, вам отчаянно нужно реорганизовать данные. (нормализация)

Это нормально, если у системы есть разумные ограничения. Возьмите максимальную длину имени файла в D0S. 8 персонажей - это безумно мало, но с этим приходилось долго разбираться. Кроме того, 640 КБ памяти. Или 2 КБ данных подряд для SQL Server 7.

Kibbee 01.12.2008 20:39

Думали ли вы о просмотре итоговой таблицы (1000 столбцов) в результате кросс-табличного запроса? Тогда в исходной таблице будет всего несколько столбцов, но много тысяч записей.

Не могли бы вы подробнее рассказать о своей проблеме? Думаю, никто толком не понимает, зачем вам эти 1000 столбцов!

Я должен не согласиться со всеми здесь ... Я знаю, это звучит безумно, но использование таблиц с сотнями столбцов - лучшее, что я когда-либо делал.

Да, многие столбцы часто имеют нулевые значения; Да, я мог бы нормализовать его до нескольких таблиц и транспонировать; Да это неэффективно

Однако невероятно быстро и легко анализировать данные столбцов бесконечным количеством различных способов.

Расточительно и неизящно - ничего полезнее вы никогда не построите!

Такой стол используется на складе. Однако иногда нам хотелось бы иметь такую ​​гибкость и в наших базах данных.

Mahen 24.07.2013 18:29

Другие вопросы по теме