ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Код КАК Код,
Контрагенты.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ИНДЕКСИРОВАТЬ ПО
Ссылка
1. создаем ВТ. Если ВТ с таким именем уже существует, то сначала уничтожим ее.
drop table if exists tt1 cascade;create temporary table tt3 (_Q_001_F_000RRef bytea, _Q_001_F_001 mvarchar(9), _Q_001_F_002 mvarchar(25) ) without oids
2. Запишем либо прочитаем информацию о созданной ВТ. Данная функция выполняется на стороне сервера 1С.
Func=lookupTmpTable
3. Удалим индекс tmpind_0, если он существует
drop index if exists tmpind_0
4. Создадим индекс tmpind_0 на созданной ВТ
create index tmpind_0 on pg_temp.tt3(_Q_001_F_000RRef)
5. Вставим данные в ВТ
INSERT INTO pg_temp.tt3 (_Q_001_F_000RRef, _Q_001_F_001, _Q_001_F_002) SELECT
T1._IDRRef,
T1._Code,
T1._Description
FROM _Reference54 T1
6. Рассчитаем статистику на ВТ
ANALYZE pg_temp.tt3
7. Удаляем индекс
drop index if exists TMPIND_0
8. Очищаем ВТ
SELECT FASTTRUNCATE ('pg_temp.tt3')
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Код КАК Код
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ИНДЕКСИРОВАТЬ ПО
Ссылка
SELECT n.nspname AS schema_name, c.relname AS table_name
FROM pg_class c
JOIN pg_namespace n ON n.oid = c.relnamespace
WHERE c.relname in ('tt3', 'tt4') AND n.nspname LIKE 'pg_temp%';
schema_name | table_name
-------------+------------
pg_temp_27 | tt3
pg_temp_27 | tt4
(2 rows)
SELECT a.attrelid::regclass, a.attname, t.typname AS data_type
FROM pg_attribute a
JOIN pg_type t ON a.atttypid = t.oid
WHERE a.attrelid in ('pg_temp_27.tt3'::regclass, 'pg_temp_27.tt4'::regclass) AND attnum > 0;
attrelid | attname | data_type
---------------+------------------+-----------
pg_temp_27.tt3 | _q_001_f_000rref | bytea
pg_temp_27.tt3 | _q_001_f_001 | mvarchar
pg_temp_27.tt3 | _q_001_f_002 | mvarchar
pg_temp_27.tt4 | _q_001_f_000rref | bytea
pg_temp_27.tt4 | _q_001_f_001 | mvarchar
(5 rows)
ВЫБРАТЬ
Контрагенты.Ссылка КАК Ссылка,
Контрагенты.Код КАК Код,
Контрагенты.Наименование КАК Наименование
ПОМЕСТИТЬ ВТ_Контрагенты
ИЗ
Справочник.Контрагенты КАК Контрагенты
ИНДЕКСИРОВАТЬ ПО
Ссылка
;
////////////////////////////////////////////////////////////////////////////////
УНИЧТОЖИТЬ ВТ_Контрагенты
fasttruncate(PG_FUNCTION_ARGS) {
text *name=PG_GETARG_TEXT_P(0);
char *relname;
List *relname_list;
RangeVar *relvar;
Oid relOid;
Relation rel;
bool makeanalyze = false;
relname = palloc( VARSIZE(name) + 1);
memcpy(relname, VARDATA(name), VARSIZE(name)-VARHDRSZ);
relname[ VARSIZE(name)-VARHDRSZ ] = '\0';
relname_list = stringToQualifiedNameList(relname);
relvar = makeRangeVarFromNameList(relname_list);
relOid = RangeVarGetRelid(relvar, AccessExclusiveLock, false);
if ( get_rel_relkind(relOid) != RELKIND_RELATION )
elog(ERROR,"Relation isn't a ordinary table");
rel = table_open(relOid, NoLock);
if ( !isTempNamespace(get_rel_namespace(relOid)) )
elog(ERROR,"Relation isn't a temporary table");
heap_truncate(list_make1_oid(relOid));
if ( rel->rd_rel->relpages > 0 || rel->rd_rel->reltuples > 0 )
makeanalyze = true;
/*
* heap_truncate doesn't unlock the table,
* so we should unlock it.
*/
table_close(rel, AccessExclusiveLock);
if ( makeanalyze ) {
VacuumParams params;
VacuumRelation *rel;
params.options = VACOPT_ANALYZE;
params.freeze_min_age = -1;
params.freeze_table_age = -1;
params.multixact_freeze_min_age = -1;
params.multixact_freeze_table_age = -1;
params.is_wraparound = false;
params.log_min_duration = -1;
rel = makeNode(VacuumRelation);
rel->relation = relvar;
rel->oid = relOid;
rel->va_cols = NULL;
vacuum(list_make1(rel), ¶ms,
GetAccessStrategy(BAS_VACUUM), false);
}
PG_RETURN_VOID();
}
text *name=PG_GETARG_TEXT_P(0);
relname = palloc( VARSIZE(name) + 1);
memcpy(relname, VARDATA(name), VARSIZE(name)-VARHDRSZ);
relname[ VARSIZE(name)-VARHDRSZ ] = '\0';
relname_list = stringToQualifiedNameList(relname);
relvar = makeRangeVarFromNameList(relname_list);
relOid = RangeVarGetRelid(relvar, AccessExclusiveLock, false);
if ( get_rel_relkind(relOid) != RELKIND_RELATION )
elog(ERROR,"Relation isn't a ordinary table");
rel = table_open(relOid, NoLock);
if ( !isTempNamespace(get_rel_namespace(relOid)) )
elog(ERROR,"Relation isn't a temporary table");
heap_truncate(list_make1_oid(relOid));
if ( rel->rd_rel->relpages > 0 || rel->rd_rel->reltuples > 0 )
makeanalyze = true;
table_close(rel, AccessExclusiveLock);
if (makeanalyze) {
VacuumParams params;
VacuumRelation *rel;
params.options = VACOPT_ANALYZE;
...
rel = makeNode(VacuumRelation);
rel->relation = relvar;
rel->oid = relOid;
rel->va_cols = NULL;
vacuum(list_make1(rel), params,
GetAccessStrategy(BAS_VACUUM), false);
}
Функция SelectFasttruncate(ВременнаяТаблица)
ТребуетсяПересчитатьСтатистикуПоТаблице = Ложь;
ВременнаяТаблица.Очистить();
Если КоличествоСтрокВоВременнойТаблицеСогласноСтатистики > 0 Тогда
ТребуетсяПересчитатьСтатистикуПоТаблице = Истина;
КонецЕсли;
Если ТребуетсяПересчитатьСтатистикуПоТаблице Тогда
ПересчитатьСтатистикуПоТаблице(ВременнаяТаблица);
КонецЕсли;
КонецФункции
<log location="ПутьСбораЛогов" history="72">
<event>
<eq property="Name" value="DBPOSTGRS"/>
<eq property="p:processname" value="ИмяБазы"/>
<like property="Sql" value="INSERT%pg_temp%"/>
</event>
<property name="RowsAffected"/>
</log>
Функция SelectFasttruncate(ВременнаяТаблица)
ТребуетсяПересчитатьСтатистикуПоТаблице = Ложь;
Если ВременнаяТаблица.Количество() > 0 Тогда
ВременнаяТаблица.Очистить();
ТребуетсяПересчитатьСтатистикуПоТаблице = Истина;
КонецЕсли;
Если ТребуетсяПересчитатьСтатистикуПоТаблице Тогда
ПересчитатьСтатистикуПоТаблице(ВременнаяТаблица);
КонецЕсли;
КонецФункции
<log location="ПутьСбораЛогов" history="72">
<event>
<eq property="Name" value="DBPOSTGRS"/>
<eq property="p:processName" value="ИмяБазы"/>
<like property="Sql" value="%FASTTRUNCATE%"/>
</event>
</log>
ВЫБРАТЬ ПЕРВЫЕ 100000
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 1
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ДОБАВИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
1. создаем ВТ. Если ВТ с таким именем уже существует, то сначала уничтожим ее.
drop table if exists tt1 cascade;create temporary table tt1 (_Q_001_F_000 timestamp, _Q_001_F_001TRef bytea, _Q_001_F_001RRef bytea, _Q_001_F_002 numeric(9, 0) ) without oids
2. Запишем либо прочитаем информацию о созданной ВТ. Данная функция выполняется на стороне сервера 1С.
Func=lookupTmpTable
3. Вставим 100К строк в ВТ
INSERT INTO pg_temp.tt1 (_Q_001_F_000, _Q_001_F_001TRef, _Q_001_F_001RRef, _Q_001_F_002) SELECT
T1._Period,
T1._RecorderTRef,
T1._RecorderRRef,
T1._LineNo
FROM _AccumRg50748 T1
WHERE (T1._Fld2488 = CAST(0 AS NUMERIC)) LIMIT 100000
4. Рассчитаем статистику на ВТ
ANALYZE pg_temp.tt1
5. Вставим еще одну строку в ВТ
INSERT INTO pg_temp.tt1 (_Q_001_F_000, _Q_001_F_001TRef, _Q_001_F_001RRef, _Q_001_F_002) SELECT
T1._Period,
T1._RecorderTRef,
T1._RecorderRRef,
T1._LineNo
FROM _AccumRg50748 T1
WHERE (T1._Fld2488 = CAST(0 AS NUMERIC)) LIMIT 1
6. Очищаем ВТ
52:06.452000-4999,DBPOSTGRS,5,Sql="SELECT FASTTRUNCATE ('pg_temp.tt1')"
ВЫБРАТЬ ПЕРВЫЕ 100000
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
УПОРЯДОЧИТЬ ПО
Период,
Регистратор,
НомерСтроки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
ВременнаяТаблица.НомерСтроки = 2
Query Text: SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt1 T1
WHERE (T1._Q_001_F_002 = CAST(2 AS NUMERIC))
Aggregate (cost=1942.92..1942.93 rows=1 width=8) (actual time=11.698..11.699 rows=1 loops=1)
Output: count('1'::numeric)
Buffers: local hit=841
-> Seq Scan on pg_temp.tt1 t1 (cost=0.00..1941.00 rows=1923 width=0) (actual time=0.011..11.599 rows=1865 loops=1)
Output: _q_001_f_000, _q_001_f_001tref, _q_001_f_001rref, _q_001_f_002
Filter: (t1._q_001_f_002 = '2'::numeric)
Rows Removed by Filter: 98135
Buffers: local hit=841
ВЫБРАТЬ ПЕРВЫЕ 0
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
УПОРЯДОЧИТЬ ПО
Период,
Регистратор,
НомерСтроки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ ПЕРВЫЕ 100000
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ДОБАВИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
УПОРЯДОЧИТЬ ПО
Период,
Регистратор,
НомерСтроки
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
ВременнаяТаблица.НомерСтроки = 2
Query Text: SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt1 T1
WHERE (T1._Q_001_F_002 = CAST(2 AS NUMERIC))
Aggregate (cost=1498.12..1498.13 rows=1 width=8) (actual time=12.345..12.346 rows=1 loops=1)
Output: count('1'::numeric)
Buffers: local hit=841
-> Seq Scan on pg_temp.tt1 t1 (cost=0.00..1497.82 rows=299 width=0) (actual time=0.015..12.244 rows=1865 loops=1)
Output: _q_001_f_000, _q_001_f_001tref, _q_001_f_001rref, _q_001_f_002
Filter: (t1._q_001_f_002 = '2'::numeric)
Rows Removed by Filter: 98135
Buffers: local hit=841
Query Identifier: 209524141104999352
Query Text: SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt1 T1
WHERE (T1._Q_001_F_002 = CAST(2 AS NUMERIC))
Aggregate (cost=1942.83..1942.84 rows=1 width=8) (actual time=12.583..12.584 rows=1 loops=1)
Output: count('1'::numeric)
Buffers: local hit=841
-> Seq Scan on pg_temp.tt1 t1 (cost=0.00..1941.00 rows=1827 width=0) (actual time=0.013..12.459 rows=1865 loops=1)
Output: _q_001_f_000, _q_001_f_001tref, _q_001_f_001rref, _q_001_f_002
Filter: (t1._q_001_f_002 = '2'::numeric)
Rows Removed by Filter: 98135
Buffers: local hit=841
Query Identifier: -6082868411932076458
ВЫБРАТЬ ПЕРВЫЕ 100000
СебестоимостьТоваров.Период КАК Период,
СебестоимостьТоваров.Регистратор КАК Регистратор,
СебестоимостьТоваров.НомерСтроки КАК НомерСтроки
ПОМЕСТИТЬ ВременнаяТаблица
ИЗ
РегистрНакопления.СебестоимостьТоваров КАК СебестоимостьТоваров
УПОРЯДОЧИТЬ ПО
Период,
Регистратор,
НомерСтроки
ИНДЕКСИРОВАТЬ ПО НАБОРАМ
(
(Период,
Регистратор,
НомерСтроки) УНИКАЛЬНО,
(Регистратор),
(НомерСтроки)
)
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
ВременнаяТаблица.НомерСтроки = 2
;
////////////////////////////////////////////////////////////////////////////////
ВЫБРАТЬ
КОЛИЧЕСТВО(1) КАК Поле1
ИЗ
ВременнаяТаблица КАК ВременнаяТаблица
ГДЕ
ВременнаяТаблица.Регистратор = ЗНАЧЕНИЕ(Документ.РасчетСебестоимостиТоваров.ПустаяСсылка)
1. Создаем ВТ. Если ВТ с таким именем уже существует, то сначала уничтожим ее.
drop table if exists tt3 cascade;create temporary table tt3 (_Q_001_F_000 timestamp, _Q_001_F_001TRef bytea, _Q_001_F_001RRef bytea, _Q_001_F_002 numeric(9, 0) ) without oids
2. Запишем либо прочитаем информацию о созданной ВТ. Данная функция выполняется на стороне сервера 1С.
Func=lookupTmpTable
3. Удалим индекс tmpind_0, если он существует
drop index if exists tmpind_0
4. Создадим уникальный индекс tmpind_0 на созданной ВТ
create unique index tmpind_0 on pg_temp.tt3(_Q_001_F_000, _Q_001_F_001TRef, _Q_001_F_001RRef, _Q_001_F_002)
5. Удалим и создадим еще 2 индекса: tmpind_1 и tmpind_2
drop index if exists tmpind_1
create index tmpind_1 on pg_temp.tt3(_Q_001_F_001TRef, _Q_001_F_001RRef)
drop index if exists tmpind_2
create index tmpind_2 on pg_temp.tt3(_Q_001_F_002)
6. Вставим данные в ВТ
INSERT INTO pg_temp.tt3 (_Q_001_F_000, _Q_001_F_001TRef, _Q_001_F_001RRef, _Q_001_F_002) SELECT
T1._Period,
T1._RecorderTRef,
T1._RecorderRRef,
T1._LineNo
FROM _AccumRg50748 T1
WHERE (T1._Fld2488 = CAST(0 AS NUMERIC))
ORDER BY (T1._Period), (T1._RecorderTRef), (T1._RecorderRRef), (T1._LineNo) LIMIT 100000
7. Рассчитаем статистику на ВТ
ANALYZE pg_temp.tt3
8. Выполним запрос вычисления строк с отбором по НомерСтроки
SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt3 T1
WHERE (T1._Q_001_F_002 = CAST(2 AS NUMERIC))
9. Выполним запрос вычисления строк с отбором по Регистратор
SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt3 T1
WHERE (T1._Q_001_F_001TRef = '\\000\\000\\004\\270'::bytea AND T1._Q_001_F_001RRef = '\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000'::bytea)'
10. Удаляем 3 созданных индекса
drop index if exists TMPIND_0
drop index if exists TMPIND_1
drop index if exists TMPIND_2
11. Очищаем ВТ
SELECT FASTTRUNCATE ('pg_temp.tt3')
Query Text: SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt3 T1
WHERE (T1._Q_001_F_002 = CAST(2 AS NUMERIC))
Aggregate (cost=880.63..880.64 rows=1 width=8) (actual time=1.264..1.265 rows=1 loops=1)
Output: count('1'::numeric)
Buffers: local hit=492
-> Bitmap Heap Scan on pg_temp.tt3 t1 (cost=17.23..878.90 rows=1723 width=0) (actual time=0.220..1.173 rows=1865 loops=1)
Recheck Cond: (t1._q_001_f_002 = '2'::numeric)
Heap Blocks: exact=486
Buffers: local hit=492
-> Bitmap Index Scan on tmpind_2 (cost=0.00..17.06 rows=1723 width=0) (actual time=0.155..0.155 rows=1865 loops=1)
Index Cond: (t1._q_001_f_002 = '2'::numeric)
Buffers: local hit=6
Query Text: SELECT
COUNT(CAST(1 AS NUMERIC))
FROM pg_temp.tt3 T1
WHERE (T1._Q_001_F_001TRef = '\\000\\000\\004\\270'::bytea AND T1._Q_001_F_001RRef = '\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000\\000'::bytea)
Aggregate (cost=2.33..2.34 rows=1 width=8) (actual time=0.009..0.009 rows=1 loops=1)
Output: count('1'::numeric)
Buffers: local hit=2
-> Index Only Scan using tmpind_1 on pg_temp.tt3 t1 (cost=0.12..2.33 rows=1 width=0) (actual time=0.008..0.008 rows=0 loops=1)
Output: _q_001_f_001tref, _q_001_f_001rref
Index Cond: ((t1._q_001_f_001tref = '\\x000004b8'::bytea) AND (t1._q_001_f_001rref = '\\x00000000000000000000000000000000'::bytea))
Heap Fetches: 0
Buffers: local hit=2