Как освободить память, используемую простаивающими базами данных SQL Server?

У нас есть SQL Server с несколькими сотнями баз данных. Многие базы данных на этом сервере используются всего несколько раз в неделю. У нас есть проблема, когда SQL Server иногда становится очень медленным. Когда это происходит, использование памяти показывает 99%, и происходит подкачка. Чтобы обойти эту проблему, мы запланировали перезапуск службы SQL каждую ночь, чтобы выгрузить все эти базы данных и освободить память.

Каков правильный способ освобождения памяти, используемой простаивающими базами данных, без остановки службы SQL? Мы хотели бы автоматизировать выгрузку любой базы данных, к которой не обращались в течение последних 30 минут.

Примечание: я ищу решение, которое применимо к SQL 2005. Однако, если в SQL 2008 есть функция для этого Я бы хотел об этом знать. если (Enum.IsDefined (memberType, valueString)) {return Enum.Parse (memberType, ...

Есть хороший способ выяснить элемент перечисления, используя следующий подход:

// memberType is enum type
if (Enum.IsDefined(memberType, valueString))
{
    return Enum.Parse(memberType, valueString);
}
else
{
    try 
    {
        var underlyingValue = Convert.ChangeType(valueString, Enum.GetUnderlyingType(memberType));
        if (Enum.IsDefined(memberType, underlyingValue))
        {
            return underlyingValue;
        }
    }
    catch...
}

Это работает как шарм. За исключением значений, созданных из перечислений, отмеченных FlagsAttribute . Например, для этого перечисления и значения:

[Flags]
enum MyEnum {
    One = 0x1,
    Two = One << 1,
    Four = One << 2,
    Eight = One << 3
}

var e = MyEnum.One | MyEnum.Eight;

описанный выше подход не работает. Похоже, единственный способ заставить его работать - это попытаться получить все значения перечисления и побитовое И их с вводом значение. Это несколько утомительно. Так что вы знаете какой-нибудь способ получше?

Ответ:

Последний метод выглядит так:

var parsed = Enum.Parse(memberType, valueString);
decimal d;
if (!decimal.TryParse(parsed.ToString(), out d))
{
    return parsed;
}
throw new ArgumentOutOfRangeException(memberInfo.Name, valueString, "Bad configuration parameter value.");
15
задан Schultz9999 26 April 2011 в 20:57
поделиться