Предложения по оптимизации для таблицы SQL Server - PullRequest
0 голосов
/ 13 мая 2009

У меня есть таблица, содержащая пользовательский ввод, который необходимо оптимизировать. У меня есть некоторые идеи о том, как решить эту проблему, но я был бы очень признателен за ваш вклад в это. Таблица, которая нуждается в оптимизации, называется структурой ниже. Все таблицы, упомянутые ниже, имеют первичные целочисленные ключи, называемые Id.
Характеристики: Ms Sql Server 2008, Linq2Sql, веб-сайт asp.net, C #.

Текущая структура выглядит следующим образом:
Страница -> Поле -> FieldControl -> ValueGroup -> Значение

Страница

Страницы - это контейнер для одного или нескольких полей.

поле

Поле - это контейнер для одного или нескольких элементов FieldControl, таких как текстовое поле или параметры раскрывающегося списка.
Отношения: PageId

FieldControl

Если поле имеет тип TextBox, то для поля создается один элемент FieldControl. Если поле имеет тип «DropDown», то для поля, содержащего текст параметра, создается один параметр FieldControl per dropdown.
Отношения: FieldId

ValueGroup

Каждый раз, когда пользователь заполняет поля на странице и сохраняет их, создается новая группа значений (Id), чтобы отслеживать вводимые пользователем данные, относящиеся к этому сохранению. Когда пользователь хочет Посмотрите на ранее заполненную форму, группа значений используется для загрузки значений в FieldControls ранее заполненного экземпляра.
Отношения: нет

Значение

Фактический ввод FieldControl. Если пользователь введет «Hello» в TextBox, то «Hello» будет храниться в строке в этой таблице с последующей ссылкой, для которой FieldControl «Hello» был введен. ValueGroup связан со значениями, чтобы сгруппировать их, чтобы отслеживать, к какому сохранению / экземпляру они относятся, как описано в ValueGroup.
Отношения: ValueGroupId, FieldControlId

проблема

Если 100 000 страниц заполнены полностью, каждый из которых содержит 10 текстовых блоков, то мы получим 100 000 * 10 записей в таблице значений, что означает, что мы быстро достигнем миллиона записей, что делает его действительно медленным, как сейчас Пользователь может создать столько разных страниц с любым количеством полей, сколько ему нравится, и все эти значения сохраняются в таблице значений. Я использую эти данные, либо отображая сетку с пагинацией, которая отображает все записи для одного типа страницы, либо просматривая конкретный экземпляр страницы (значения, сгруппированные по ValueGroupId).

Некоторые идеи, которые у меня есть:
Хорошая индексация должна быть очень важна при оптимизации таблицы значений.
Должен ли я, возможно, добавить внешний ключ непосредственно обратно на страницу из значения, в результате чего будет выполнена индексация по (Id, PageId, ValueGroup), позволяющая сетке просмотра получать значения, которые относятся только к одной странице?

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

PS. На этом форуме должен быть значок для всех людей, которые закончили читать этот длинный пост, и я надеюсь, что я дал понять:)

Ответы [ 3 ]

1 голос
/ 14 мая 2009

Просто чтобы закрыть этот пост. Корректное индексирование решило все проблемы с производительностью.

0 голосов
/ 13 мая 2009

Generic

Вы говорите, что это медленно, и это может быть много причин, кроме базы данных например, нехватка памяти, высокая загрузка ЦП, фрагментация диска, нагрузка на сеть, проблемы с сокетами и т. д. и т. д. Это должно отображаться на системном мониторе

Попробуйте, например, инструмент Sysinternals (сейчас MS): http://live.sysinternals.com/procexp.exe

Но если это все под контролем, тогда вернемся к базе данных.

Индекс базы данных

Миллион записей - это не так уж много и не должно быть проблемой. Индекс должен помочь, если у вас сейчас нет индексов. Возможно, вам следует установить индексы для всех таблиц, если вы еще этого не сделали.

Я пытался сделать модель базы данных, это правильно: http://www.freeimagehosting.net/image.php?a39cf99ae5.png

Структура таблицы (?)

Страница -> Поле -> FieldControl -> ValueGroup -> Значение

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

Все ли таблицы имеют внешние ключи таблица выше?

Это похоже на ваш код?

Псевдокод:

1. Get page info. Gives key "page-id"
2. Get all "Field":s marked with that "page-id".
   Gives keys "field-id" & "fieldcontrol-id"
3. Loop trough all fields-id:s and get the FieldControl for each one
4. Loop trough all fields-id:s and get all ValueGroup:s.
   Gives a list of "valuegroup-id":s keys
5. Loop trough all ValueGroup:s and get all fields
0 голосов
/ 13 мая 2009

Это может быть немного не по теме, но почему? Это данные, к которым вам нужно получить доступ в режиме реального времени, или для дальнейшей обработки? Не могли бы вы упаковать данные в одну строку, а затем распаковать их позже?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...