172 похожих чатов

Между прочим, pooling иногда помогает и для разных сессий. Если любопытно,

попробуйте вот это:
SET search_path = plan_cache_testing;

CREATE TABLE registrations (
id integer NOT NULL PRIMARY KEY,
document_id integer NOT NULL,
reg_date date NOT NULL
);

CREATE INDEX ON registrations(document_id, reg_date);

CREATE OR REPLACE FUNCTION plan_cache_test(arg_id integer, arg_date date)
RETURNS TABLE(id integer, reg_date date)
LANGUAGE plpgsql
STABLE
AS $function$
DECLARE
a_id int;
a_created_at timestamptz;
BEGIN
FOR id, reg_date IN
SELECT r.document_id, r.reg_date
FROM registrations AS r
WHERE r.document_id = arg_id
AND r.reg_date >= arg_date
LOOP
RETURN NEXT;
END LOOP;
RETURN;
END;
$function$

LOAD 'auto_explain';
SET auto_explain.log_analyze = true;
SET auto_explain.log_nested_statements = true;
SET auto_explain.log_timing = true;
SET auto_explain.log_buffers = true;
SET auto_explain.log_triggers = true;
SET auto_explain.log_nested_statements = 't';
SET auto_explain.log_level = 'NOTICE';
SET auto_explain.log_min_duration = 0;

-- 5 times:
SELECT * FROM plan_cache_test(6, '2020-01-01');
SELECT * FROM plan_cache_test(6, '2020-01-01');
SELECT * FROM plan_cache_test(6, '2020-01-01');
SELECT * FROM plan_cache_test(6, '2020-01-01');
SELECT * FROM plan_cache_test(6, '2020-01-01');

-- 6: plan switches to generic/cached:
SELECT *
FROM plan_cache_test(6, '2020-01-01');
-----------------------------------------------------------------------------
-- Imitate session reset on putting it back into the pool:
DISCARD ALL;

-- Let's try again:
SET search_path = plan_cache_testing;

SET auto_explain.log_analyze = true;
SET auto_explain.log_nested_statements = true;
SET auto_explain.log_timing = true;
SET auto_explain.log_buffers = true;
SET auto_explain.log_triggers = true;
SET auto_explain.log_nested_statements = true;
SET auto_explain.log_level = 'NOTICE';
SET auto_explain.log_min_duration = 0;

-- Угадайте, какой план будет здесь?
SELECT *
FROM plan_cache_test(6, '2020-01-02');

1 ответов

5 просмотров

Я с телефона, поэтому просто попробую догадаться - он сразу к кешированному плану перейдёт видимо :) Интересно. А для PREPARE/EXECUTE это не работает, потому что PREPARE создаёт новый объект каждый раз, а тут один объект (функция) живёт между сессий. Логично🤔

Похожие вопросы

Обсуждают сегодня

а зачем этот вопрос для удаления из чата?
Mёdkinson Medvezhkin
63
Эх кто-то пришел и весь праздник испортил :( You need complex FBX scene importing setup to change things on import? good luck with that. You need navigation and pathfinding? g...
Serg Gini
5
Всем привет! Подскажите. Я написал приложение на Delphi 10.2 Tokyo под Windows 10. И передо мной стал вопрос о том чтобы сделать это приложение кроссплатформенным (под Linux и...
Дмитрий Завгородний
24
Какого хера? /Sources/App/Modules/User/Models/UserLinkApple.swift:21:20: warning: stored property '_id' of 'Sendable'-conforming class 'UserLinkApple' is mutable @ID(...
Alexander Sherbakov
14
У тебя в конфиге нигде нет deny all; или вообще любого deny?
Alexander Sherbakov
10
Привет всем. Подскажите где можно посмотреть, какая версия электрон, поддерживает версии windows? Некий changelog. Мне бы желательно, поддержку 7,8,10... latest, как понимаю и...
Anonym Squad
21
Почему стало ломаться на D11? "739002.86400000' is not a valid timestamp" function IncDateTime(aStamp:TTimeStamp;aKind:TTriggerKind;aInterval:Integer):TDateTime; //aStamp = 2...
Катерина Свиридова
8
Есть Pipeline для GitLab Runner (executor = "shell") В нём есть: default: before_script: - set -eo pipefail - source "$(~/bin/trdl use werf 2 stable)" - source...
Aleksandr Karabanov
1
Портфолио: Зовут меня Александр, мне 36 лет. Город Пушкино. Общий рабочий стаж: ~14 лет Уровень квалификации: Senior Full-stack developer Где прочесть мой код? https://github....
Magic
10
Ребят, чет я уже не догоняю... Крч в коде на асм там происходит нечто вроде a+число (a+1, a+2 и т.д.). Но почему строка lea ecx, [edx+1] работает как a+1?? В edx берется адрес...
Alan 🔝 Бэброу
4
Карта сайта