Загрузка базы данных SQL в память сервера   

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

Но иногда нужно принудительно заставить SQL-сервер дать какой-то базе данных больше памяти. Этого можно добиться, заставив его перечитать все таблицы базы данных. При этом SQL-сервер прочтет все страницы с диска, и непосредственно сразу после выполнения данных операций есть высокая вероятность, что большая часть базы данных (по крайней мере, помещающаяся в памяти) будет закеширована SQL-сервером. Разумеется, работа с другими базами приведет к обратному перераспределению и, в конце концов, память будет распределена равномерно пропорционально загрузке баз. Но кратковременный эффект будет достигнут.

Для демонстрации эффекта могу привести небольшой пример. Предположим на сервере две базы данных. Сначала активно использовалась первая, а потом стала использоваться вторая. SQL-сервер будет постепенно очищать кэш страниц для первой базы и кэшировать страницы второй.

Но мы можем добиться немедленного эффекта с помощью приводимой ниже обработки.

Для работы необходимо наличие библиотеки rainbow.dll в папке ИБ, которую можно взять здесь. Текст обработки представлен ниже:

Процедура Сформировать()
    ЗапросРадуги=СоздатьОбъект("ODBCQuery");
    СЗ=СоздатьОбъект("СписокЗначений");
    ТекстЗапроса="Select RTRIM(CONVERT(char(30),TABLE_NAME)) from INFORMATION_SCHEMA.TABLES
    |WHERE TABLE_TYPE='BASE TABLE' AND TABLE_NAME<>'dtproperties'";
    Если ЗапросРадуги.Prepare(ТекстЗапроса,0,0)=1 Тогда
        Если ЗапросРадуги.Open()=1 Тогда
            ЗапросРадуги.GotoNext();
            Пока ЗапросРадуги.IsOK()=1 Цикл
                СЗ.ДобавитьЗначение(ЗапросРадуги.GetString(0));
                ЗапросРадуги.GotoNext();
            КонецЦикла;
            ЗапросРадуги.Close();
        Иначе
            Предупреждение("Ошибка открытия запроса!",10);
            Возврат;
        КонецЕсли;
        ЗапросРадуги.Reset();
    Иначе
        Предупреждение("Ошибка выполнения запроса!",10);
        Возврат;
    КонецЕсли;
    Для к=1 по СЗ.РазмерСписка() Цикл
        Если ЗапросРадуги.Prepare("SELECT COUNT(*) FROM "+СЗ.ПолучитьЗначение(к),0,0)=1 Тогда
            Если ЗапросРадуги.Open()=1 Тогда
                ЗапросРадуги.Close();
            КонецЕсли;
            ЗапросРадуги.Reset();
        КонецЕсли;
    КонецЦикла;
    ЗапросРадуги="";
    Предупреждение("Память для базы данных выделена!",10);
КонецПроцедуры
//________________________________________________________
Процедура ПриОткрытии()
    ЗагрузитьВнешнююКомпоненту("rainbow.dll");
КонецПроцедуры

Эту обработку можно загрузить в разделе "Скачать".

 

 

Перепечатка, воспроизведение в любой форме, распространение, в том числе в переводе, любых материалов с сайта www.softpoint.ru возможны только с письменного разрешения компании "СофтПоинт". Это правило действует для всех без исключения случаев, кроме тех, когда в материале прямо указано разрешение на копирование (основание: Закон Российской Федерации "Об авторском праве и смежных правах").