Hi,


I am very interested in this feature that will conform to the SQL standard and 
I read that :



Session 1:

create global temp table gtt(x integer);

insert into gtt values (generate_series(1,100000));



Session 2:

insert into gtt values (generate_series(1,200000));



Session1:

create index on gtt(x);

explain select * from gtt where x = 1;



Session2:

explain select * from gtt where x = 1;

??? Should we use index here?



My answer is - yes.

Just because:

- Such behavior is compatible with regular tables. So it will not

confuse users and doesn't require some complex explanations.

- It is compatible with Oracle.



There is a confusion. Sadly it does not work like that at all with Oracle. 
Their implementation is buggy in my opinion.

Here is a very simple test case to prove it with the latest version (january 
2020) :



Connected to:

Oracle Database 19c Enterprise Edition Release 19.0.0.0<http://19.0.0.0>.0 - 
Production

Version 19.6.0.0<http://19.6.0.0>.0



-- session 1

create global temporary table gtt(x integer);

Table created.



-- session 2

insert into gtt SELECT level FROM dual CONNECT BY LEVEL <= 100000;

100000 rows created.



-- session 1

create index igtt on gtt(x);

Index created.



-- session 2

select * from gtt where x = 9;



no rows selected



select /*+ FULL(gtt) */ * from gtt where x = 9;



         X

----------

         9



What happened ? The optimizer (planner) knows the new index igtt can be 
efficient via dynamic sampling. Hence, igtt is used at execution time...but it 
is NOT populated. By default I obtained no line. If I force a full scan of the 
table with a hint /*+ FULL */ you can see that I obtain my line 9. Different 
results with different exec plans it's a WRONG RESULT bug, the worst kind of 
bugs.

Please don't consider Oracle as a reference for your implementation. I am 100% 
sure you can implement and document that better than Oracle. E.g index is 
populated and considered only  for transactions that started after the index 
creation or something like that. It would be far better than this misleading 
behaviour.

Regards,

Phil








Télécharger Outlook pour Android<https://aka.ms/ghei36>

________________________________
From: Konstantin Knizhnik <k.knizh...@postgrespro.ru>
Sent: Monday, February 10, 2020 5:48:29 PM
To: Tomas Vondra <tomas.von...@2ndquadrant.com>; Philippe BEAUDOIN 
<ph...@apra.asso.fr>
Cc: pgsql-hackers@lists.postgresql.org <pgsql-hackers@lists.postgresql.org>; 
Konstantin Knizhnik <knizh...@garret.ru>
Subject: Re: Global temporary tables


Sorry, small typo in the last patch.

--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company

Reply via email to