Измените последнее утверждение следующим образом:
EXEC('SELECT * FROM ' + @tablename)
Вот как я делаю свое действие в хранимой процедуре. Первый блок объявит переменную и задает имя таблицы на основе имени текущего года и месяца, в этом случае TEST_2012OCTOBER. Затем я проверяю, существует ли он в БД, и удалите, если это произойдет. Затем следующий блок будет использовать инструкцию SELECT INTO для создания таблицы и заполнить ее записями из другой таблицы параметрами.
--DECLARE TABLE NAME VARIABLE DYNAMICALLY
DECLARE @table_name varchar(max)
SET @table_name =
(SELECT 'TEST_'
+ DATENAME(YEAR,GETDATE())
+ UPPER(DATENAME(MONTH,GETDATE())) )
--DROP THE TABLE IF IT ALREADY EXISTS
IF EXISTS(SELECT name
FROM sysobjects
WHERE name = @table_name AND xtype = 'U')
BEGIN
EXEC('drop table ' + @table_name)
END
--CREATES TABLE FROM DYNAMIC VARIABLE AND INSERTS ROWS FROM ANOTHER TABLE
EXEC('SELECT * INTO ' + @table_name + ' FROM dbo.MASTER WHERE STATUS_CD = ''A''')
Если у Вас есть серьезное основание полагать, что значительный набор объектов - особенно те, которых Вы подозреваете, чтобы быть в поколениях 1 и 2 - теперь имеют право на сборку "мусора", и это теперь было бы подходящим временем для сбора с точки зрения маленького хита производительности.
А хороший пример этого - то, если Вы только что закрыли большую форму. Вы знаете, что все средства управления UI могут теперь быть собраны "мусор", и очень короткая пауза, поскольку форма закрывается, вероятно, не будет примечательно пользователю.
ОБНОВЛЕНИЕ 07.02.2018
С.NET 4.5 - существует GCLatencyMode.LowLatency
и GCLatencyMode.SustainedLowLatency
. При вводе и отъезде любого из этих режимов, рекомендуется вызвать полный GC с GC.Collect(2, GCCollectionMode.Forced)
.
С.NET 4.6 - существует GC.TryStartNoGCRegion
метод (раньше устанавливал значение только для чтения GCLatencyMode.NoGCRegion
). Это может самостоятельно, выполнять полную сборку "мусора" блокирования в попытке освободить достаточно памяти, но, учитывая мы запрещаем GC в течение периода, я утверждал бы, что это - также хорошая идея выполнить полный GC прежде и после.
Источник: инженер Microsoft Ben Watson: Пишущий Высокоэффективный Код.NET , 2-й Ed. 2018.
См.:
Взгляните на эту статью Rico Mariani. Он дает два правила, когда назвать GC.Collect (правило 1: "Не делайте"):
В Вашем примере я думаю, что вызов, GC.Collect не является проблемой, а скорее существует вопросы проектирования.
, Если Вы собираетесь проснуться с промежутками, (времена набора) затем, Ваша программа должна быть создана для единственного выполнения (выполните задачу однажды), и затем завершите. Затем Вы настраиваете программу как запланированную задачу для выполнения в запланированных интервалах.
Таким образом, Вы не должны интересоваться вызовом GC.Collect, (который Вы должны редко , если когда-нибудь, должны сделать).
Однако у Rico Mariani есть большое сообщение в блоге на этом предмете, который может быть найден здесь:
Можно назвать GC.Collect (), когда Вы знаете что-то о природе приложения, сборщик "мусора" не делает. Заманчиво думать, что, как автор, это вероятно. Однако истина является суммами GC к довольно правильно написанной и протестированной экспертной системе, и редко, чтобы Вы знали что-то о низкоуровневых путях выполнения кода, которые она не делает.
лучший пример я могу думать, где у Вас могла бы быть некоторая дополнительная информация, приложение что циклы между периодами неактивности и очень напряженными периодами. Вы хотите лучшую производительность, возможную в течение напряженных периодов, и поэтому хотите использовать время простоя, чтобы сделать некоторую уборку.
Однако большую часть времени GC достаточно умен, чтобы сделать это так или иначе.
Один случай - когда Вы пробуете к коду модульного теста, который использует WeakReference.
Я использую GC.Collect
только при записи сырых тестовых буровых установок производительности/профилировщика; т.е. Я имею два (или больше) блоки кода для тестирования - что-то как:
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestA(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
TestB(); // may allocate lots of transient objects
GC.Collect(GC.MaxGeneration, GCCollectionMode.Forced);
...
Так, чтобы TestA()
и TestB()
выполненный с максимально подобным состоянием - т.е. TestB()
не становился прибитым просто, потому что TestA
оставил его очень близко к переломному моменту.
классическим примером А была бы простая консоль exe (Main
вид достаточно метода, который будет отправлен здесь, например), который показывает различие между циклично выполненной конкатенацией строк и StringBuilder
.
, Если бы мне нужно что-то точное, затем это было бы двумя абсолютно независимыми тестами - но часто это достаточно, если мы просто хотим минимизировать (или нормализовать) GC во время тестов для получения грубого ощущения поведения.
Во время производственного кода? Я должен все же использовать его;-p
Это настолько не относится к вопросу, но для XSLT преобразовывает в.NET (XSLCompiledTranform) затем, у Вас не могло бы быть выбора. Другой кандидат является управлением MSHTML.
Scott Holden запись в блоге на том, когда к (и если не к) GC.Collect вызова характерен для .NET Компактная Платформа , но правила обычно относятся ко всей управляемой разработке.
Другая причина состоит в том, когда Вам открыли SerialPort на USB COM port, и затем USB-устройство отключается. Поскольку SerialPort был открыт, ресурс содержит ссылку на ранее подключенный порт в реестре системы. Реестр системы будет затем содержать устаревшие данные , таким образом, список доступных портов будет неправильным. Поэтому порт должен быть закрыт.
Вызов SerialPort. Близко () на заходах судна в порт Располагают () на объекте, но это остается в памяти, пока сборка "мусора" на самом деле не работает, заставляя реестр остаться устаревшей, пока сборщик "мусора" не решает выпустить ресурс.
От https://stackoverflow.com/a/58810699/8685342:
try
{
if (port != null)
port.Close(); //this will throw an exception if the port was unplugged
}
catch (Exception ex) //of type 'System.IO.IOException'
{
System.GC.Collect();
System.GC.WaitForPendingFinalizers();
}
port = null;
В большинстве случаев рекомендуется не принудительно выполнять сборку мусора. (Каждая система, над которой я работал, имела принудительную сборку мусора, имела подчеркнутые проблемы, решение которых устранило бы необходимость принудительной сборки мусора и значительно ускорило работу системы.)
Есть несколько случаев , когда вы знаете больше об использовании памяти, тогда это делает сборщик мусора. Это маловероятно для многопользовательского приложения или службы, которая отвечает более чем на один запрос за раз.
Однако при некоторой пакетной обработке вы знаете больше, чем GC. Например, рассмотрим приложение, которое.
Вы может иметь возможность (после тщательного) тестирования убедить вас в том, что вы должны принудительно выполнять полную сборку мусора после обработки каждого файла.
Другим случаем является служба, которая просыпается каждые несколько минут для обработки некоторых элементов, а не сохраняет никакого состояния во время сна . Тогда форсирование полной коллекции непосредственно перед сном может иметь смысл.
Единственный раз, когда я бы рассмотрел возможность принудительного использования дерево синтаксического анализа)
Не сохраняет состояние соответствия между обработанными файлами . Вы можете убедить (после тщательного) тестирования, что вы должны принудительно выполнить полное сборка мусора после обработки каждого файла.
Другим случаем является служба, которая просыпается каждые несколько минут для обработки некоторых элементов, а не сохраняет никакого состояния во время сна . Тогда форсирование полной коллекции непосредственно перед сном может иметь смысл.
Единственный раз, когда я бы рассмотрел возможность принудительного использования дерево синтаксического анализа)
Не сохраняет состояние соответствия между обработанными файлами . Вы можете убедить (после тщательного) тестирования, что вы должны принудительно выполнить полное сборка мусора после обработки каждого файла.
Другим случаем является служба, которая просыпается каждые несколько минут для обработки некоторых элементов, а не сохраняет никакого состояния во время сна . Тогда форсирование полной коллекции непосредственно перед сном может иметь смысл.
Единственный раз, когда я бы рассмотрел возможность принудительного использования и не сохраняет никакого состояния во время сна . Тогда форсирование полной коллекции непосредственно перед сном может иметь смысл.
Единственный раз, когда я бы рассмотрел возможность принудительного использования и не сохраняет никакого состояния во время сна . Тогда форсирование полной коллекции непосредственно перед сном может иметь смысл.
Единственный раз, когда я бы рассмотрел возможность принудительного использования коллекция - это когда я знаю, что много объекта были созданы недавно и очень мало объектов в настоящее время
Я бы предпочел API для сборки мусора, когда я мог бы давать ему подсказки об этом типе вещей без необходимости принудительно запускать сборщик мусора.
См. также " Лакомые кусочки производительности Рико Мариани "