Для меня ваша логика выбора записей должна быть выражена в виде условия в предложении WHERE
, например:
(:p_terminal LIKE 'CN%' AND sm.terminalid like 'CN%')
OR (:p_terminal NOT LIKE 'CN%' AND sm.terminalid = :p_terminal)
Когда данный параметр выглядит как начинается с 'CN'
, выбираются все записи. где terminalid
начинается с 'CN'
. Иначе он выбирает записи, где terminalid
равно параметру.
Запрос:
SELECT
sm.terminalid as terminalcode,
sm.sums as Latest_sums
FROM sums1 sm
WHERE
(:p_terminal LIKE 'CN%' AND sm.terminalid like 'CN%')
OR (:p_terminal NOT LIKE 'CN%' AND sm.terminalid = :p_terminal)
Не много - сборщик "мусора" очень быстр для gen0. Это также настраивает себя, корректируя размер gen0 в зависимости от того, сколько этому удается собрать каждый раз, когда это идет. (Если этим будут управлять для сбора много, то это уменьшит размер gen0 для сбора ранее в следующий раз, и наоборот.)
Окончательный тест - то, как Ваше приложение работает все же. Perfmon очень удобен здесь, показывая, сколько времени было проведено в GC, сколько наборов, там имели каждое поколение и т.д.
В целом это не что-то, о чем Вы должны, вероятно, волноваться и кажетесь, что это начинает падать очень близко к "микрооптимизации". GC был разработан с предположением, что "хорошо настроенное приложение" будет иметь весь, его - выделения в Gen0 - подразумевать, что они все "умирают молодые". Любое время Вы выделяете новый объект, это всегда находится в Gen0. Набор не произойдет, пока порог Gen0 не будет передан и нет достаточного количества свободного места в Gen0 для содержания следующего выделения.
"Новая" операция является на самом деле набором вещей:
Поскольку Вы говорите, что само выделение очень недорого. Стоимость генерации большого количества недолгих объектов является более частыми сборками "мусора", поскольку они инициированы, когда бюджет поколения 0 исчерпывается. Однако набор поколения 0 является довольно дешевым, поэтому, пока Ваш объект действительно является недолгим, издержки наиболее вероятны не значительные.
С другой стороны, типичный пример конкатенации большого количества строк в цикле значительно продвигает сборщик "мусора", таким образом, все это зависит от количества объектов, Вы создаете. Не повреждает думать о выделении.
Стоимость сборки "мусора" - то, что управляемые потоки приостановлены во время уплотнения.
Хотя новая операция разработана и записана эффективно, это не свободно и действительно занимает время для выделения новой памяти. Библиотека выделения памяти должна отследить, какие блоки доступны для выделения, и недавно выделенная память обнуляется.
Создание большого количества объектов, которые умирают молодые, также инициирует сборку "мусора" чаще, и та операция может быть дорогой. Особенно с "остановкой мировые" сборщики "мусора".
Вот статья из MSDN о том, как это работает: http://msdn.microsoft.com/en-us/magazine/bb985011.aspx
Примечание: то, что это описывает, как вызов сборки "мусора" является дорогим, потому что это должно создать граф объектов, прежде чем это сможет запустить сборку "мусора".
Если эти объекты никогда не будут продвигаться из Поколения 0 затем, то Вы будете видеть довольно хорошую производительность. Единственные скрытые затраты, которые я вижу, - то, что при превышении бюджета Поколения 0, Вы вынудите GC уплотнить "кучу", но GC самонастроится так, это не большая часть беспокойства.
Сборка "мусора" поколений в .NET. Недолгие объекты будут собираться сначала и часто. Генерал 0 наборов являются дешевыми, но в зависимости от масштаба количества объектов Вы создаете, это могло быть довольно дорогостоящим. Я выполнил профилировщика, чтобы узнать, влияет ли это на производительность. Если это, рассмотрите переключение их к структурам. Они не должны быть собраны.