2016-07-12 10 views
0

In postgresqlWarum unterschiedliche Geschwindigkeit zwischen Oracle und Postgresql?

select * from test where text123 = '1' 

"Index Scan using ix_test on test (cost=0.57..12619.44 rows=6980 width=343)" 
" Index Cond: ((text123)::text = '1'::text)" 



select * from test where text123 = '' 

"Seq Scan on test (cost=0.00..11918891.20 rows=209355618 width=343)" 
" Filter: ((text123)::text = ''::text)" 

erste Abfrageergebnis kehrt sofort zurück. aber zweitens nicht.

In Oracle hat es den gleichen Plan mit postgresql, aber das zweite Abfrageergebnis wird sofort zurückgegeben.

Was kann ich für die zweite Abfrage in Postgresql tun? Und warum zweite Abfrage ist so langsam?

mir bitte helfen ...

+0

Versuchen Sie 'analyze test;' in postgresql. Es sollte nur die Statistiken auf der Testtabelle neu berechnen, so dass der Abfrageplan der beste verfügbare sein kann. Ändern Sie die Auswahlliste, wenn Sie die Abfrage erneut testen, z. B. 'wählen Sie text123 aus test aus, wobei text123 = '1'' ist, damit Sie sicher sein können, dass der Abfrageplan erneut vorbereitet wird. Melden Sie sich mit dem Ergebnis zurück - dies kann oder kann es nicht sofort beheben. –

+0

Zuerst, danke über Ihren Rat. Ich habe deinen Vorschlag ausprobiert. aber es funktioniert nicht. Kannst du einen anderen Weg für mich geben? –

+0

In Oracle '' ist das gleiche wie NULL. In PostgreSQL sind sie nicht gleich. Keine Ahnung, warum Vergleich mit '' (leere Zeichenfolge) länger dauern sollte als Vergleich mit '1' - vielleicht gibt es nur sehr wenige Zeilen mit '1', aber viele mit ''? Versuchen Sie, wo Text123 ist NULL in PostgreSQL und sehen, was passiert. – mathguy

Antwort

2

Die zweite Abfrage

select * from test where text123 = '' 

tut sehr verschiedene Dinge in PostgreSQL und Oracle.

In PostgreSQL '' bedeutet "eine Zeichenfolge der Länge Null". So in PostgreSQL bedeutet die Abfrage

Return all fields in all rows of table test where the text123 column 
is equal to a string which is zero characters long 

In Oracle jedoch '' bedeutet NULL. So in Oracle diese Abfrage bedeutet

Return all fields in all rows of table TEST where the TEXT123 column 
is equal to NULL 

und weil nichts, auch nicht NULL ist immer gleich die Abfrage auf NULL wird nichts zurück.

Viel Glück.

+0

Danke! Ich habe nützliches Wissen von dir bekommen. –

Verwandte Themen