По умолчанию PostgreSQL настроен таким образом, чтобы расходовать минимальное количество ресурсов для работы с небольшими базами до 4 Gb на не очень производительных серверах. То есть, если дело касается систем посерьезней, то вы столкнетесь с большими потерями производительности базы данных лишь потому, что дефолтные настройки могут в корне не соответствовать производительности вашего северного оборудования. Настройки выделения ресурсов оперативной памяти RAM для работы PostgreSQL хранятся в файле postgresql.conf .
Доступен как из папки, куда установлен PostgreSQL / Data, так и из pgAdmin:
В общем на начальном этапе при возникновении трудностей и замедления работы БД, заметной для глаз пользователей достаточно увеличить три параметра:
shared_buffers
Это размер памяти, разделяемой между процессами PostgreSQL, отвечающими за выполнения активных операций. Максимально-допустимое значение этого параметра – 25% всего количества RAM
Например, при 1-2 Gb RAM на сервере, достаточно указать в этом параметре значение 64-128 Mb (8192-16384).
temp_buffers
Это размер буфера под временные объекты (временные таблицы). Среднее значение 2-4% всего количества RAM
Например, при 1-2 Gb RAM на сервере, достаточно указать в этом параметре значение 32-64 Mb.
work_mem
Это размер памяти, используемый для сортировки и кэширования таблиц.
При 1-2 Gb RAM на сервере, рекомендуемое значение 32-64 Mb.
Для вступления новых значений в силу, потребуется перезапуск службы, поэтому лучше делать во вне рабочее время.
Еще два важных параметра это maintenance_work_mem (для операций VACUUM, CREATE INDEX и других) и max_stack_depth
Примеры оптимальных настроек: Hardware:
CPU: E3-1240 v3 @ 3.40GHz RAM: 32Gb 1600Mhz Диски: Plextor M6Pro postgresql.conf:
shared_buffers = 8GB work_mem = 128MB maintenance_work_mem = 2GB fsync = on synchronous_commit = off wal_sync_method = fdatasync checkpoint_segments = 64 seq_page_cost = 1.0 random _page_cost = 6.0cpu_tuple_cost = 0.01 cpu_index_tuple_cost = 0.0005 cpu_operator_cost = 0.0025 effective_cache_size = 24GB Вариант настроек от pgtune :
Полезные запросы: Блокировки БД по пользователям
Код SQL select a.usename, count (l.pid) from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not (mode = ‘AccessShareLock’) group by a.usename;
Вывести все таблицы, размером больше 10 Мб
Код SQL SELECT tableName, pg_size_pretty(pg_total_relation_size(CAST (tablename as text))) as size
from pg_tables
where tableName not like ‘sql_%’ and pg_size_pretty(pg_total_relation_size(CAST (tablename as text))) like ‘%MB%’;
Определение размеров таблиц в базе данных PostgreSQL
Код SQL SELECT tableName, pg_size_pretty(pg_total_relation_size(CAST (tablename as text))) as size
from pg_tables
where tableName not like ‘sql_%’
order by size ;
Пользователи блокирующие конкретную таблицу
Код SQL select a.usename, t.relname, a.current_query, mode from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid inner join pg_stat_all_tables t on t.relid=l.relation where t.relname = ‘tablename’;
Код SQL select relation::regclass, mode, a.usename, granted, pid from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not mode = ‘AccessShareLock’ and relation is not null ;
Запросы с эксклюзивными блокировками
Код SQL select a.usename, a.current_query, mode from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where mode ilike ‘%exclusive%’;
Количество блокировок по пользователям
Код SQL select a.usename, count (l.pid) from pg_locks l inner join pg_stat_activity a on a.procpid = l.pid where not (mode = ‘AccessShareLock’) group by a.usename;
Количество подключений по пользователям
Код SQL select count (usename), usename from pg_stat_activity group by usename order by count (usename) desc ;
Встроенные функции 1С 8.х для работы со значениями типа Число:
Код 1C v 8.х
Функция Степень(_База, _Степ)
Результат = 1 ;
Для К = 1 По _Степ Цикл
Результат = Результат * _База;
КонецЦикла ;
Возврат Результат;
КонецФункции
ACos - Вычисляет арккосинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ACos( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ASin - Вычисляет арксинус от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ASin( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции. Определен в диапазоне -1 ... 1.
ATan - Вычисляет арктангенс от аргумента <Число>.
Синтаксис:
Код 1C v 8.х ATan( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Cos - Вычисляет косинус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Cos( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Exp - Вычисляет результат возведения основания натурального логарифма (числа е) в степень <Число>.
Синтаксис:
Код 1C v 8.х Exp( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Аргумент функции.
Log - Вычисляет натуральный логарифм числа.
Синтаксис:
Код 1C v 8.х Log( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Log10 - Вычисляет десятичный логарифм числа.
Синтаксис:
Код 1C v 8.х Log10( < Число> )
Параметры: <Число> - Обязательный
Тип: Число. Исходное число, больше 0.
Sin - Вычисляет синус от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Sin( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Tan - Вычисляет тангенс от аргумента <Угол>, заданного в радианах.
Синтаксис:
Код 1C v 8.х Tan( < Угол> )
Параметры: <Угол> - Обязательный
Тип: Число. Аргумент функции.
Код 1C v 7.x
Перем ДocтaтoчнaяToчнocть;
Перем КoличecтвoЗнaкoв;
Перем КoличecтвoИтepaций;
Перем ЧиcлoПИ;
Функция КвaдpaтныйКopeнь(Apгумeнт) Далее
Функция ЭкcПонeнтa(Apгумeнт) Далее
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2) Далее
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0) Далее
Функция КвaдpaтныйКopeнь(Apгумeнт)
Если Apгумeнт< 0 Тогда
Сообщить( "..." , "!" ) ;
Возврат ПолучитьПустоеЗначение( ) ;
ИначеЕсли Apгумeнт= 0 Тогда
Возврат 0 ;
КонецЕсли ;
ПpeдыдущaяИтepaция = Apгумeнт/ 2 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
Значeниe = 0.5 * ( ПpeдыдущaяИтepaция+
Apгумeнт/ ПpeдыдущaяИтepaция) ;
Если Значeниe< ПpeдыдущaяИтepaция Тогда
Paзницa = ПpeдыдущaяИтepaция- Значeниe;
Иначе
Paзницa = Значeниe- ПpeдыдущaяИтepaция;
КонецЕсли ;
Если Paзницa< ДocтaтoчнaяToчнocть Тогда
Прервать;
КонецЕсли ;
ПpeдыдущaяИтepaция= Значeниe;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция ЭкcПонeнтa(Apгумeнт)
Значeниe = 1 ;
ПpeдыдущийЧлeн = 1 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн* Apгумeнт/ Cч;
Значeниe = Значeниe+ OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/ Значeниe;
Если ( Toчнocть< ДocтaтoчнaяToчнocть) И ( OчepeднoйЧлeн< 0.1 ) Тогда
Прервать;
КонецЕсли ;
ПpeдыдущийЧлeн= OчepeднoйЧлeн;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция CтeпeннaяФункция(Apгумeнт1,Apгумeнт2)
Если Apгумeнт1 < 0 Тогда
Сообщить( "..." , "!" ) ;
ИначеЕсли Apгумeнт1 = 0 Тогда
Возврат 0 ;
КонецЕсли ;
Значeниe = 1 ;
ПpeдыдущийЧлeн = 1 ;
Для Cч= 1 По КoличecтвoИтepaций Цикл
OчepeднoйЧлeн = ПpeдыдущийЧлeн* Apгумeнт2 * Лог( Apгумeнт1 ) / Cч;
Значeниe = Значeниe+ OчepeднoйЧлeн;
Toчнocть = OчepeднoйЧлeн/ Значeниe;
Если Toчнocть< 0 Тогда
Toчнocть = - Toчнocть;
КонецЕсли ;
Если ( Toчнocть< ДocтaтoчнaяToчнocть) И ( OчepeднoйЧлeн< 0.1 ) Тогда
Прервать;
КонецЕсли ;
ПpeдыдущийЧлeн= OчepeднoйЧлeн;
КонецЦикла ;
Значeниe = Окр( Значeниe, Макс( КoличecтвoЗнaкoв- Лог10 ( Значeниe) , 0 ) ) ;
Возврат Значeниe;
КонецФункции
Функция CлужTaнгeнc(Apгумeнт)
КвApгум = Apгумeнт* Apгумeнт;
Значeниe = Apгумeнт/ ( 1 - КвApгум/ ( 3 - КвApгум/ ( 5 - КвApгум/ ( 7 - КвApгум/ ( 9 - КвApгум/ ( 11 - КвApгум/ ( 13 - КвApгум/ ( 15 - КвApгум) ) ) ) ) ) ) ) ;
Возврат Значeниe;
КонецФункции
Функция Cинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
ЗнaкPeзультaтa= 1 ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( 2 * ЧиcлoПИ) ) * 2 * ЧиcлoПИ;
Если Apгумeнт> ЧиcлoПИ Тогда
Apгумeнт = Apгумeнт- ЧиcлoПИ;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Если Apгумeнт> ЧиcлoПИ/ 2 Тогда
Apгумeнт= ЧиcлoПИ- Apгумeнт;
КонецЕсли ;
Если Apгумeнт> ЧиcлoПИ/ 4 Тогда
Значeниe = ЗнaкPeзультaтa* Кocинуc( ЧиcлoПИ/ 2 - Apгумeнт) ;
Иначе
TaнгeнcПолoвины = CлужTaнгeнc( Apгумeнт/ 2 ) ;
Значeниe = ЗнaкPeзультaтa* 2 * TaнгeнcПолoвины/
( 1 + TaнгeнcПолoвины* TaнгeнcПолoвины) ;
КонецЕсли ;
Возврат Значeниe;
КонецФункции
Функция Кocинуc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( 2 * ЧиcлoПИ) ) * 2 * ЧиcлoПИ;
Если Apгумeнт< ЧиcлoПИ/ 4 Тогда
TaнгeнcПолoвины = CлужTaнгeнc( Apгумeнт/ 2 ) ;
Значeниe = ( 1 - TaнгeнcПолoвины* TaнгeнcПолoвины) /
( 1 + TaнгeнcПолoвины* TaнгeнcПолoвины) ;
Иначе
Значeниe = Cинуc( Apгумeнт+ ЧиcлoПИ/ 2 ) ;
КонецЕсли ;
Возврат Значeниe;
КонецФункции
Функция Taнгeнc(Знач Apгумeнт, TипApгумeнтa = 0)
Если TипApгумeнтa= 1 Тогда
Apгумeнт = ( Apгумeнт/ 180 ) * ЧиcлoПИ;
КонецЕсли ;
ЗнaкPeзультaтa= 1 ;
Если Apгумeнт< 0 Тогда
Apгумeнт= - Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Apгумeнт = Apгумeнт- Цел( Apгумeнт/ ( ЧиcлoПИ) ) * ЧиcлoПИ;
Если Apгумeнт> ЧиcлoПИ/ 2 Тогда
Apгумeнт= ЧиcлoПИ- Apгумeнт;
ЗнaкPeзультaтa= - 1 * ЗнaкPeзультaтa;
КонецЕсли ;
Если Apгумeнт< ЧиcлoПИ/ 8 Тогда
Значeниe = ЗнaкPeзультaтa* CлужTaнгeнc( Apгумeнт) ;
Иначе
Попытка
Значeниe = ЗнaкPeзультaтa* Cинуc( Apгумeнт) /
Кocинуc( Apгумeнт) ;
Исключение
Сообщить( "..." , "!" ) ;
Значeниe = ПолучитьПустоеЗначение( ) ;
КонецПопытки
КонецЕсли ;
Возврат Значeниe;
КонецФункции
ДocтaтoчнaяToчнocть = 0.00000000001 ;
КoличecтвoИтepaций = 1000 ;
КoличecтвoЗнaкoв = - Лог10 ( ДocтaтoчнaяToчнocть) - 1 ;
ЧиcлoПИ = 3.1415926535897932384626433832795 ;
Код 1C v 7.x VBS=CreateObject("MSScriptControl.ScriptControl");
VBS.Language="VBscript";
Параметр=1234;
Корень=VBS.Eval("sqr("+СокрЛП(Параметр)+")");
Процедура Сформировать()
Ctrl=СоздатьОбъект("MSScriptControl.ScriptControl");
Ctrl.Language="vbscript";
Ctrl.AddCode("
|pi=4 * atn(1.0)
|
|Function ShowPI
|ShowPI=pi
|End Function
|
|Function CalcSQR(number)
|if number<0 then
| CalcSQR=0
|else
| CalcSQR=SQR(Number)
|end if
|End Function
|
|Function CalcSIN(number)
|CalcSin=Sin(number/(180/pi))
|End Function
|
|Function CalcCOS(number)
|CalcCOS=COS(number/(180/pi))
|End Function
|
|Function CalcTAN(number)
|CalcTAN=TAN(number/(180/pi))
|End Function
|
|Function CalcRND
|Random ize
|CalcRND=RND
|End Function
|
|Function NameOfWeekDay(MyDate)
|NameOfWeekDay=WeekDayName(Weekday(MyDate),False)
|End Function
|
|");
Сообщить(Ctrl.Run("ShowPI")); // Число ПИ
Сообщить(Ctrl.Run("CalcSQR",4)); // Квадратный корень из 4
Сообщить(Ctrl.Run("CalcSin",90)); // Синус 90 градусов
Сообщить(Ctrl.Run("CalcCOS",180)); // Косинус 180 градусов
Сообщить(Ctrl.Run("CalcTAN",180)); // Тангенс 90 градусов
Сообщить(Ctrl.Run("CalcRND")); // Случайное число от 0 до 1
Сообщить(Ctrl.Run("NameOfWeekDay",ТекущаяДата())); // Название дня недели
Генератор случайных чисел инициализируется начальным числом из параметра:
Код 1C v 8.х НачальноеЧисло = 167 ;
ГСЧ = Новый ГенераторСлучайныхЧисел( НачальноеЧисло) ;
СлучайноеЧисло = ГСЧ. СлучайноеЧисло( 0 , 1000 ) ;
Последовательность случайных чисел для одного и того же начального числа будет одинакова.
При создании генератора случайных чисел можно не передавать ему начальное число. В этом случае он инициализируется временем работы операционной системы с момента старта.
Код 1C v 8.х ГСЧ = Новый ГенераторСлучайныхЧисел( ) ;
СлучайноеЧисло = ГСЧ. СлучайноеЧисло( 0 , 1000 ) ;
Еще примеры самодельных функций:
Код 1C v 8.х Функция Рандом() Экспорт
UID= Новый УникальныйИдентификатор( ) ;
UID = СтрЗаменить( UID, "-" , "" ) ;
Значение = "" ;
Для Н= 1 По СтрДлина( UID) Цикл
Симв = Сред( UID, Н, 1 ) ;
Значение = Значение+ Прав( КодСимвола( Симв) , 1 ) ;
КонецЦикла ;
Возврат Число( "0." + Значение) ;
КонецФункции
Код 1C v 8.х Функция Ранд(Парам=0)
Если Парам< > 0 Тогда
Случай= Парам;
КонецЕсли ;
Если Число( Случай) = 0 Тогда
Случай= Число( СтрЗаменить( "" + ТекущееВремя( ) , ":" , "" ) ) ;
Случай= ( 16807 * Случай) %2147483647 ;
КонецЕсли ;
Случай= ( 16807 * Случай) %2147483647 ;
Случай= макс( Случай, - Случай) ;
Возврат ( Случай/ 2147483647 ) ;
КонецФункции
Для 7.7 можно использовать генератор случайностей
Код 1C v 7.x ремоте= СоздатьОбъект( "rcbdyctl.setting" ) ;
Сообщить( ремоте. CreatePassword) ;