Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oTTyC-0007bO-O7 for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Aug 2022 20:05:53 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.92) (envelope-from ) id 1oTTyB-0001vU-M4 for pgsql-hackers@arkaria.postgresql.org; Wed, 31 Aug 2022 20:05:51 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oTTyA-0001vL-Ns for pgsql-hackers@lists.postgresql.org; Wed, 31 Aug 2022 20:05:51 +0000 Received: from smtp-fw-9103.amazon.com ([207.171.188.200]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1oTTy6-00008E-Rm for pgsql-hackers@lists.postgresql.org; Wed, 31 Aug 2022 20:05:49 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=amazon.com; i=@amazon.com; q=dns/txt; s=amazon201209; t=1661976346; x=1693512346; h=message-id:date:mime-version:to:cc:references:from: in-reply-to:subject; bh=ZDBaMls5jAjsMrWTrFtUOAo0whT5nJ/8tNZ9RcqNyHs=; b=iADikSsBNwfFcGRJypALXCIoveQJdsn7jL7wMHFpMyUOCLTgNtUiJR3t pZZ8w1RNgO88zoH4ziP1+MHYsX1WWG3p1uslDOansuAxP56dz5G8iq4iS iOPlUhMe0lya+ie8HNA27k+ezf2sG5Fo8PQJ/ITyXOSXQhAvo28/z6MEW g=; X-IronPort-AV: E=Sophos;i="5.93,279,1654560000"; d="scan'208,217";a="1050063682" Subject: Re: [PATCH] Query Jumbling for CALL and SET utility statements Received: from pdx4-co-svc-p1-lb2-vlan3.amazon.com (HELO email-inbound-relay-pdx-2b-6e5a0cd6.us-west-2.amazon.com) ([10.25.36.214]) by smtp-border-fw-9103.sea19.amazon.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 31 Aug 2022 20:05:42 +0000 Received: from EX13MTAUWB001.ant.amazon.com (pdx1-ws-svc-p6-lb9-vlan3.pdx.amazon.com [10.236.137.198]) by email-inbound-relay-pdx-2b-6e5a0cd6.us-west-2.amazon.com (Postfix) with ESMTPS id 3B38CA293E; Wed, 31 Aug 2022 20:05:40 +0000 (UTC) Received: from EX19D018UWC004.ant.amazon.com (10.13.138.168) by EX13MTAUWB001.ant.amazon.com (10.43.161.249) with Microsoft SMTP Server (TLS) id 15.0.1497.38; Wed, 31 Aug 2022 20:05:40 +0000 Received: from [10.111.246.30] (10.43.160.191) by EX19D018UWC004.ant.amazon.com (10.13.138.168) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA) id 15.2.1118.12; Wed, 31 Aug 2022 20:05:40 +0000 Content-Type: multipart/alternative; boundary="------------n8priadbOn7u9PBtn45XZXG0" Message-ID: Date: Wed, 31 Aug 2022 13:05:39 -0700 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.15; rv:102.0) Gecko/20100101 Thunderbird/102.2.0 Content-Language: en-US To: Andres Freund CC: "Drouvot, Bertrand" , PostgreSQL Hackers , Peter Eisentraut , Pavel Stehule , Nikolay Samokhvalov References: <36e5bffe-e989-194f-85c8-06e7bc88e6f7@amazon.com> <20220831160839.wseeotr7rckucpmv@awork3.anarazel.de> <46ca04f9-1e37-c862-9a28-c5dffaee412f@amazon.com> <20220831190604.l2luuhj3xkau7dvk@awork3.anarazel.de> From: Jeremy Schneider In-Reply-To: <20220831190604.l2luuhj3xkau7dvk@awork3.anarazel.de> X-Originating-IP: [10.43.160.191] X-ClientProxiedBy: EX13D20UWC001.ant.amazon.com (10.43.162.244) To EX19D018UWC004.ant.amazon.com (10.13.138.168) List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --------------n8priadbOn7u9PBtn45XZXG0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit On 8/31/22 12:06 PM, Andres Freund wrote: >> Regarding SET, the compelling use case was around "application_name" >> whose purpose is to provide a label in pg_stat_activity and on log >> lines, which can be used to improve observability and connect queries to >> their source in application code. > I wasn't saying that SET shouldn't be jumbled, just that it seems more > reasonable to track it only when track_utility is enabled, rather than doing > so even when that's disabled. Which I do think makes sense for executing a > prepared statement and calling a procedure, since they're really only utility > statements by accident. Hey Andres, sorry for misunderstanding your email! Based on this quick test I just now ran (transcript below), I think that PREPARE/EXECUTE is already excluded from track_utility? I get your point about CALL, maybe it does make sense to also exclude this. It might also be worth a small update to the doc for track_utility about how it behaves, in this regard. https://www.postgresql.org/docs/14/pgstatstatements.html#id-1.11.7.39.9 Example updated sentence: > |pg_stat_statements.track_utility| controls whether <> utility commands are tracked by the module. Utility commands are all those other than |SELECT|, |INSERT|, |UPDATE| and |DELETE| <<, but this parameter does not disable tracking of PREPARE, EXECUTE or CALL>>. The default value is |on|. Only superusers can change this setting. ===== pg-14.4 rw root@db1=# set pg_stat_statements.track_utility=on; SET pg-14.4 rw root@db1=# select pg_stat_statements_reset();  pg_stat_statements_reset -------------------------- (1 row) pg-14.4 rw root@db1=# prepare test as select /* unique123 */ 1; PREPARE pg-14.4 rw root@db1=# execute test;  ?column? ----------         1 (1 row) pg-14.4 rw root@db1=# set application_name='test'; SET pg-14.4 rw root@db1=# select substr(query,1,50) from pg_stat_statements;                   substr -------------------------------------------  prepare test as select /* unique123 */ $1  select pg_stat_statements_reset()  set application_name=$1 (3 rows) ===== pg-14.4 rw root@db1=# set pg_stat_statements.track_utility=off; SET pg-14.4 rw root@db1=# select pg_stat_statements_reset();  pg_stat_statements_reset -------------------------- (1 row) pg-14.4 rw root@db1=# prepare test as select /* unique123 */ 1; PREPARE pg-14.4 rw root@db1=# execute test;  ?column? ----------         1 (1 row) pg-14.4 rw root@db1=# set application_name='test'; SET pg-14.4 rw root@db1=# select substr(query,1,50) from pg_stat_statements;                   substr -------------------------------------------  prepare test as select /* unique123 */ $1  select pg_stat_statements_reset() (2 rows) -- Jeremy Schneider Database Engineer Amazon Web Services --------------n8priadbOn7u9PBtn45XZXG0 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: 8bit
On 8/31/22 12:06 PM, Andres Freund wrote:
Regarding SET, the compelling use case was around "application_name"
whose purpose is to provide a label in pg_stat_activity and on log
lines, which can be used to improve observability and connect queries to
their source in application code.
I wasn't saying that SET shouldn't be jumbled, just that it seems more
reasonable to track it only when track_utility is enabled, rather than doing
so even when that's disabled. Which I do think makes sense for executing a
prepared statement and calling a procedure, since they're really only utility
statements by accident.

Hey Andres, sorry for misunderstanding your email!

Based on this quick test I just now ran (transcript below), I think that PREPARE/EXECUTE is already excluded from track_utility?

I get your point about CALL, maybe it does make sense to also exclude this. It might also be worth a small update to the doc for track_utility about how it behaves, in this regard.

https://www.postgresql.org/docs/14/pgstatstatements.html#id-1.11.7.39.9

Example updated sentence:
> pg_stat_statements.track_utility controls whether <<most>> utility commands are tracked by the module. Utility commands are all those other than SELECT, INSERT, UPDATE and DELETE <<, but this parameter does not disable tracking of PREPARE, EXECUTE or CALL>>. The default value is on. Only superusers can change this setting.


=====

pg-14.4 rw root@db1=# set pg_stat_statements.track_utility=on;
SET
pg-14.4 rw root@db1=# select pg_stat_statements_reset();
 pg_stat_statements_reset
--------------------------

(1 row)
pg-14.4 rw root@db1=# prepare test as select /* unique123 */ 1;
PREPARE
pg-14.4 rw root@db1=# execute test;
 ?column?
----------
        1
(1 row)

pg-14.4 rw root@db1=# set application_name='test';
SET
pg-14.4 rw root@db1=# select substr(query,1,50) from pg_stat_statements;
                  substr
-------------------------------------------
 prepare test as select /* unique123 */ $1
 select pg_stat_statements_reset()
 set application_name=$1
(3 rows)


=====

pg-14.4 rw root@db1=# set pg_stat_statements.track_utility=off;
SET
pg-14.4 rw root@db1=# select pg_stat_statements_reset();
 pg_stat_statements_reset
--------------------------

(1 row)

pg-14.4 rw root@db1=# prepare test as select /* unique123 */ 1;
PREPARE
pg-14.4 rw root@db1=# execute test;
 ?column?
----------
        1
(1 row)

pg-14.4 rw root@db1=# set application_name='test';
SET
pg-14.4 rw root@db1=# select substr(query,1,50) from pg_stat_statements;
                  substr
-------------------------------------------
 prepare test as select /* unique123 */ $1
 select pg_stat_statements_reset()
(2 rows)






-- 
Jeremy Schneider
Database Engineer
Amazon Web Services
--------------n8priadbOn7u9PBtn45XZXG0--