2009-06-30 2 views
3

В нашем приложении на многих страницах есть «обновление», и когда мы обновляем таблицу, мы обновляем ненужные столбцы, которые также не изменяются. Я хочу знать, что есть способ избежать ненужных обновлений столбцов. Мы используем хранимые процедуры в .net 2003. В следующей ссылке я нашел решение, но оно не для хранимых процедур.Avoding ненужных обновлений В Update Query

http://blogs.msdn.com/alexj/archive/2009/04/25/tip-15-how-to-avoid-loading-unnecessary-properties.aspx

Благодаря

+0

Насколько я понимаю, наименьшая единица работы для базы данных была строкой и что она стоила того же самого, чтобы обновлять один столбец, как и для их обновления. Я считаю, что единственным исключением из этого могут быть таблицы, содержащие столбцы text/ntext или blob. – MyItchyChin

+0

не обязательно верно. если у этих столбцов есть внешние ключи и индексы, их может быть больше работы, необходимой для обновления данной строки –

+0

. Вопрос в том, какой rdbms? если это sql 2008, может помочь инструкция MERGE. –

ответ

0

Когда я работал в финансовой компании-разработчике программного обеспечения, производительность была жизненно важной. В некоторых таблицах было сотни столбцов, а операторы обновления были дорогостоящими. Мы создали собственный слой ORM (в java), который включал кеш объектов. Когда мы сгенерировали инструкцию update, мы сравнивали текущие значения каждого поля со значениями по мере их загрузки и обновляли только измененные поля.

Наш db был SQLServer. Я не помню улучшения производительности, но он был значительным и стоил инвестиций. Мы также проводили массовые вставки и обновления, где это было возможно.

Я считаю, что Hibernate и другие большие ORM все это делают для вас, если вы не хотите писать их самостоятельно.

+0

u правы, ORM - лучший способ для этого – 2009-10-13 18:48:01

1

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

Если вы используете хранимую процедуру, тогда все значения столбцов будут отправляться в базу данных в любом случае, когда вы вызываете хранимую процедуру, чтобы вы не могли ее сохранить. SP, вероятно, просто выполнит операционный оператор UPDATE. Затем RDMS берет верх. Он не будет физически изменять данные на диске, если он не отличается. Для этого он достаточно умен.

Итак, ответьте кратко: не беспокойтесь об этом. Это не очень важно и требует радикальных изменений, чтобы получить то, что вы хотите, и вы даже не увидите преимуществ производительности.

+0

Это абсолютно неправда. большинство движков db будут выполнять обновление независимо. их по-прежнему отслеживание транзакций, ведение журнала изменений (если они реализованы), обновления индексов и проверки внешнего ключа. Обновление ненужных столбцов может оказать определенное влияние, особенно если эти столбцы индексируются, что еще хуже, если они являются частью кластерного индекса. –

+0

Я считаю, что Hibernate/NHibernate сделает это из коробки. Он проверяет, является ли объект «грязным» (изменения, внесенные в его свойства), и затем создаст свою собственную инструкцию SQL для обновления соответствующих столбцов. Конечно, вы также получаете дополнительные накладные расходы на запуск структуры ORM, но если инфраструктура не находится на том же сервере, что и база данных, это может помочь. –