ASP.Net - C # - SQL Server - Обновление кэшированной таблицы данных с использованием только записей, которые были изменены - PullRequest
4 голосов
/ 20 января 2010

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

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

Затем я намереваюсь объединить этот меньший набор данных с моим кэшируемым набором данных.

Кто-нибудь делал что-то подобное или есть что-нибудь, что уже с этим справляется?

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

1 Ответ

4 голосов
/ 20 января 2010

Лично я уже использовал подход с метками времени, и он работает хорошо - он делает кэширование более эффективным, получая только те данные, которые изменились с момента последнего чтения.

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

Есть еще одна полезная статья о SqlCacheDependency здесь

Обновление: Да, я не думаю, что это действительно обновит данные.Похоже, вы должны сделать это самостоятельно.От 2-ой ссылки:

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

Там также естьОсобые примечания по реализации SQL 2005 во 2-й ссылке:

SQL Server 2005 отслеживает изменения в наборе результатов конкретной команды SQL.Если в базе данных произойдет изменение, которое изменит набор результатов этой команды, зависимость приведет к тому, что кэшированный элемент станет недействительным.Это позволяет SQL Server 2005 предоставлять уведомления на уровне строк.

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

Обновление 2: Что касается объединения новых данных в существующую таблицу данных, я думаю, Объединение Метод DataTable - это то, что вам нужно.

Метод Merge используется для объединения двух объектов DataTable, имеющих в значительной степени сходные схемы.Слияние обычно используется в клиентском приложении для включения последних изменений из источника данных в существующую таблицу данных.......При объединении нового исходного объекта DataTable с целевым объектом любые исходные строки со значением DataRowState, равным «Не изменен», «Изменен» или «Удален», сопоставляются целевым строкам с одинаковыми значениями первичного ключа.Исходные строки с добавленным значением DataRowState добавляются к новым целевым строкам с теми же значениями первичного ключа, что и для новых исходных строк.

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

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