2010-04-10 2 views
3

У меня есть кеш-код Dictionary<int, string> (в течение 20 минут), который имеет ~ 120 пар ID/Name для справочной таблицы. Я перебираю эту коллекцию при заполнении списков выпадающих списков, и я уверен, что это быстрее, чем запрос к БД для полного списка каждый раз.Стоит ли кэшировать словарь для значений внешнего ключа в ASP.net?

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

Скажите, что эта таблица с кешами является таблицей EmployeeType. Если бы я должен был запрашивать и отображать список имен и типов сотрудников, я должен запрашивать для EmployeeName и EmployeeTypeID и использовать свой кешированный словарь, чтобы захватить имя EmployeeTypeIDs, когда отображается каждая запись, или это быстрее, просто чтобы DB захватил EmployeeName и JOIN чтобы получить строку EmployeeType, минуя кешированный словарь.

Я знаю, что оба будут работать, но меня интересует, что будет выполнять самые быстрые. Спасибо за любую помощь.

ответ

2

Оптимизация 101 говорит не делать, если вам не нужно: - Tips for optimizing C#/.NET programs

Но, да, если это действительно полностью статический поиск для жизни приложения и занимает очень мало оперативной памяти, то кэширование это выглядело бы довольно безобидным, и поиск в Словаре из ОЗУ будет быстрее, чем поездка в базу данных.

Что касается 2-й части, вы можете также позволить базе данных выполнить соединение, вероятно, у нее, вероятно, будет та же таблица в ОЗУ, и увеличенная полезная нагрузка сети будет казаться небольшой.

Но опять же, если вам не нужно это делать, не делайте этого! Опасность здесь заключается в том, что вы делаете это, затем другой, а затем другой, код становится все сложнее, и RAM заполняется теми вещами, которые, по вашему мнению, вам могут понадобиться, но которые на самом деле используются, редко оставляя меньше места для OS/ORM/DB выполнять свою работу. Пусть компилятор, ORM и база данных решают, что сохранить в памяти - у них гораздо больше команда, ориентированная на оптимизацию!

+0

Да, я думаю, что JOIN, вероятно, лучше. Я не согласен с тем, что заполнение ОЗУ является проблемой. Вы можете добавить столько кеширования, сколько хотите. Это никогда не повлияет на производительность, потому что ASP.Net не будет кэшировать элемент, если у сервера нет памяти, чтобы сделать это без побочных эффектов. Он удалит кешированные предметы самостоятельно, чтобы повысить производительность, если это необходимо. Я не полностью согласен с оптимизацией 101. Я думаю, что есть баланс. Может быть, если оптимизация была сложной, но не для чего-то столь же тривиального, как кеширование. Плюс действительно ли разумно подождать, пока не возникнут проблемы с хорошим дизайном? – user169867

+0

Простите, что вы кешировали это в кеше ASP.NET, часто люди ставят полностью статические поиски, подобные этому, в статических переменных на всю жизнь приложения. Вы хотите, чтобы этот поиск выпал из памяти, если сервер простаивает? Кэширование является «тривиальным» только для полностью статических данных, в противном случае это часто является причиной многочисленных ошибок. –

+0

Да, я бы хотел, чтобы он упал, если сервер простаивает, и он будет (через 20 минут). Когда программа обращается к этим данным, она проверяет, находится ли значение в кеше, если оно возвращает это, если оно не запускает запрос для возврата данных и снова добавляет данные в кеш. – user169867

2

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

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

Единственный способ, опять же, сделать это самым простым способом (без кеширования), и если вы не счастливы только тогда, вы перейдете на дополнительный бит.

Смежные вопросы