> 2020年4月22日 下午10:38,Prabhat Sahu <prabhat.s...@enterprisedb.com> 写道:
> 
> 
> 
> On Wed, Apr 22, 2020 at 2:49 PM 曾文旌 <wenjing....@alibaba-inc.com 
> <mailto:wenjing....@alibaba-inc.com>> wrote:
>> 
>> Although the implementation of GTT is different, I think so TRUNCATE on 
>> Postgres (when it is really finalized) can remove session metadata of GTT 
>> too (and reduce usage's counter). It is not critical feature, but I think so 
>> it should not be hard to implement. From practical reason can be nice to 
>> have a tool how to refresh GTT without a necessity to close session. 
>> TRUNCATE can be this tool.
> Yes, I think we need a way to delete the GTT local storage without closing 
> the session.
> 
> I provide the TRUNCATE tablename DROP to clear the data in the GTT and delete 
> the storage files.
> This feature requires the current transaction to commit immediately after it 
> finishes truncate.
> 
> Hi Wenjing,
> Thanks for the patch(v30) for the new syntax support for (TRUNCATE table_name 
> DROP) for deleting storage files after TRUNCATE on GTT.
>  
> Please check below scenarios:
> 
> Case1:
> -- session1:
> postgres=# create global temporary table gtt2 (c1 integer) on commit preserve 
> rows;
> CREATE TABLE
> postgres=# create index  idx1 on gtt2 (c1);
> CREATE INDEX
> postgres=# create index  idx2 on gtt2 (c1) where c1%2 =0;
> CREATE INDEX
> postgres=# 
> postgres=# CLUSTER gtt2 USING idx1;
> CLUSTER
> postgres=# CLUSTER gtt2 USING idx2;
> ERROR:  cannot cluster on partial index "idx2"        
> 
> Case2:
> -- Session2:
> postgres=# CLUSTER gtt2 USING idx1;
> CLUSTER
> postgres=# CLUSTER gtt2 USING idx2;
> CLUSTER
> 
> postgres=# insert into gtt2 values(1);
> INSERT 0 1
> postgres=# CLUSTER gtt2 USING idx1;
> CLUSTER
> postgres=# CLUSTER gtt2 USING idx2;
> ERROR:  cannot cluster on partial index "idx2"
> 
> Case3:
> -- Session2:
> postgres=# TRUNCATE gtt2 DROP;
> TRUNCATE TABLE
> postgres=# CLUSTER gtt2 USING idx1;
> CLUSTER
> postgres=# CLUSTER gtt2 USING idx2;
> CLUSTER
> 
> In Case2, Case3 we can observe, with the absence of data in GTT, we are able 
> to "CLUSTER gtt2 USING idx2;" (having partial index)
> But why does the same query fail for Case1 (absence of data)?
This is expected
Because TRUNCATE gtt2 DROP; The local storage file was deleted, so CLUSTER 
checked that there were no local files and ended the process.


Wenjing


> 
> Thanks,
> Prabhat Sahu
> 
>  
> 
> 
> Wenjing
> 
> 
>> 
>> Regards
>> 
>> Pavel
>> 
>> 
>> All in all, I think the current implementation is sufficient for dba to 
>> manage GTT.
>> 
>>> 2020年4月2日 下午4:45,Prabhat Sahu <prabhat.s...@enterprisedb.com 
>>> <mailto:prabhat.s...@enterprisedb.com>> 写道:
>>> 
>>> Hi All,
>>> 
>>> I have noted down few behavioral difference in our GTT implementation in PG 
>>> as compared to Oracle DB:
>>> As per my understanding, the behavior of DROP TABLE in case of "Normal 
>>> table and GTT" in Oracle DB are as below:
>>> Any tables(Normal table / GTT) without having data in a session, we will be 
>>> able to DROP from another session.
>>> For a completed transaction on a normal table having data, we will be able 
>>> to DROP from another session. If the transaction is not yet complete, and 
>>> we are trying to drop the table from another session, then we will get an 
>>> error. (working as expected)
>>> For a completed transaction on GTT with(on commit delete rows) (i.e. no 
>>> data in GTT) in a session, we will be able to DROP from another session.
>>> For a completed transaction on GTT with(on commit preserve rows) with data 
>>> in a session, we will not be able to DROP from any session(not even from 
>>> the session in which GTT is created), we need to truncate the table data 
>>> first from all the session(session1, session2) which is having data.
>>> 1. Any tables(Normal table / GTT) without having data in a session, we will 
>>> be able to DROP from another session.
>>> Session1:
>>> create table t1 (c1 integer);
>>> create global temporary table gtt1 (c1 integer) on commit delete rows;
>>> create global temporary table gtt2 (c1 integer) on commit preserve rows;
>>> 
>>> Session2:
>>> drop table t1;
>>> drop table gtt1;
>>> drop table gtt2;
>>> 
>>> -- Issue 1: But we are able to drop a simple table and failed to drop GTT 
>>> as below.
>>> postgres=# drop table t1;
>>> DROP TABLE
>>> postgres=# drop table gtt1;
>>> ERROR:  can not drop relation gtt1 when other backend attached this global 
>>> temp table
>>> postgres=# drop table gtt2;
>>> ERROR:  can not drop relation gtt2 when other backend attached this global 
>>> temp table
>>> 
>>> 3. For a completed transaction on GTT with(on commit delete rows) (i.e. no 
>>> data in GTT) in a session, we will be able to DROP from another session.
>>> Session1:
>>> create global temporary table gtt1 (c1 integer) on commit delete rows;
>>> 
>>> Session2:
>>> drop table gtt1;
>>> 
>>> -- Issue 2: But we are getting error for GTT with(on_commit_delete_rows) 
>>> without data.
>>> postgres=# drop table gtt1;
>>> ERROR:  can not drop relation gtt1 when other backend attached this global 
>>> temp table
>>> 
>>> 4. For a completed transaction on GTT with(on commit preserve rows) with 
>>> data in any session, we will not be able to DROP from any session(not even 
>>> from the session in which GTT is created)
>>> 
>>> Case1:
>>> create global temporary table gtt2 (c1 integer) on commit preserve rows;
>>> insert into gtt2 values(100);
>>> drop table gtt2;
>>> 
>>> SQL> drop table gtt2;
>>> drop table gtt2
>>>   *
>>> ERROR at line 1:
>>> ORA-14452: attempt to create, alter or drop an index on temporary table 
>>> already in use
>>> 
>>> -- Issue 3: But, we are able to drop the GTT(having data) which we have 
>>> created in the same session.
>>> postgres=# drop table gtt2;
>>> DROP TABLE
>>> 
>>> Case2: GTT with(on commit preserve rows) having data in both session1 and 
>>> session2
>>> Session1:
>>> create global temporary table gtt2 (c1 integer) on commit preserve rows;
>>> insert into gtt2 values(100);
>>> 
>>> Session2:
>>> insert into gtt2 values(200);
>>> 
>>> -- If we try to drop the table from any session we should get an error, it 
>>> is working fine.
>>> drop table gtt2;
>>> SQL> drop table gtt2;
>>> drop table gtt2
>>>   *
>>> ERROR at line 1:
>>> ORA-14452: attempt to create, alter or drop an index on temporary table 
>>> already in use
>>> 
>>> postgres=# drop table gtt2 ;
>>> ERROR:  can not drop relation gtt2 when other backend attached this global 
>>> temp table
>>> 
>>> -- To drop the table gtt2 from any session1/session2, we need to truncate 
>>> the table data first from all the session(session1, session2) which is 
>>> having data.
>>> Session1:
>>> truncate table gtt2;
>>> -- Session2:
>>> truncate table gtt2;
>>> 
>>> Session 2:
>>> SQL> drop table gtt2;
>>> 
>>> Table dropped.
>>> 
>>> -- Issue 4: But we are not able to drop the GTT, even after TRUNCATE the 
>>> table in all the sessions.
>>> -- truncate from all sessions where GTT have data.
>>> postgres=# truncate gtt2 ;
>>> TRUNCATE TABLE
>>> 
>>> -- try to DROP GTT still, we are getting error.
>>> postgres=# drop table gtt2 ;
>>> ERROR:  can not drop relation gtt2 when other backend attached this global 
>>> temp table
>>> 
>>> To drop the GTT from any session, we need to exit from all other sessions.
>>> postgres=# drop table gtt2 ;
>>> DROP TABLE
>>> 
>>> Kindly let me know if I am missing something.
>>> 
>>> 
>>> On Wed, Apr 1, 2020 at 6:26 PM Prabhat Sahu <prabhat.s...@enterprisedb.com 
>>> <mailto:prabhat.s...@enterprisedb.com>> wrote:
>>> Hi Wenjing,
>>> I hope we need to change the below error message.
>>> 
>>> postgres=# create global temporary table gtt(c1 int) on commit preserve 
>>> rows;
>>> CREATE TABLE
>>> 
>>> postgres=# create materialized view mvw as select * from gtt;
>>> ERROR: materialized views must not use global temporary tables or views
>>> 
>>> Anyways we are not allowed to create a "global temporary view", 
>>> so the above ERROR message should change(i.e. " or view" need to be removed 
>>> from the error message) something like:
>>> "ERROR: materialized views must not use global temporary tables"
>>> 
>>> -- 
>>> With Regards,
>>> Prabhat Kumar Sahu
>>> EnterpriseDB: http://www.enterprisedb.com <http://www.enterprisedb.com/>
>>> 
>>> 
>>> -- 
>>> With Regards,
>>> Prabhat Kumar Sahu
>>> EnterpriseDB: http://www.enterprisedb.com <http://www.enterprisedb.com/>
>> 
> 
> 
> 
> -- 
> With Regards,
> Prabhat Kumar Sahu
> EnterpriseDB: http://www.enterprisedb.com <http://www.enterprisedb.com/>

Attachment: smime.p7s
Description: S/MIME cryptographic signature

Reply via email to