Jegyzet magamnak

Ha legközelebb felmerül a kérdés, hogy PostgreSQL vagy MySQL, egyértelműen az előbbi.
Utóbbi kicsit lomhán kezeli a joinjaimat.

Hozzászólások

Megmutatod a selectet és a két explain plant? Csak kíváncsi vagyok.

Postgres:

GroupAggregate (cost=8282992475.55..8458955231.90 rows=13689 width=28) (actual time=130310.347..130644.880 rows=912 loops=1)
-> Sort (cost=8282992475.55..8326983130.42 rows=17596261946 width=28) (actual time=130310.324..130627.453 rows=84259 loops=1)
Sort Key: sender.functionname, receiver.functionname
Sort Method: external merge Disk: 3352kB
-> Nested Loop (cost=0.00..1920553680.46 rows=17596261946 width=28) (actual time=21.127..128873.597 rows=84259 loops=1)
Join Filter: ((comm.readcycles >= receiver.startcyclecount) AND (sender.functionname <> receiver.functionname))
-> Nested Loop (cost=0.00..7815395.53 rows=79645342 width=18) (actual time=0.215..521.027 rows=645733 loops=1)
-> Seq Scan on controlflow sender (cost=0.00..36.37 rows=2037 width=22) (actual time=0.055..0.929 rows=2037 loops=1)
-> Index Scan using cwcycles on communication comm (cost=0.00..3250.22 rows=39099 width=8) (actual time=0.006..0.201 rows=317 loops=2037)
Index Cond: ((writecycles >= sender.startcyclecount) AND (writecycles <= sender.endcyclecount))
Filter: ((type = 1) OR ((type = 0) AND (channel = ANY ('{0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17}'::integer[]))))
-> Index Scan using cfecycles on controlflow receiver (cost=0.00..12.13 rows=679 width=22) (actual time=0.004..0.131 rows=863 loops=645733)
Index Cond: (comm.readcycles <= endcyclecount)
Total runtime: 130645.871 ms

MySQL:

1 PRIMARY ALL [NULL] [NULL] [NULL] [NULL] 662107 Using temporary; Using filesort
1 PRIMARY receiver ALL cfscycles,cfecycles [NULL] [NULL] [NULL] 2057 Range checked for each record (index map: 0x3)
2 DERIVED comm ALL cchannel [NULL] [NULL] [NULL] 614472 Using where
2 DERIVED sender ALL cfscycles,cfecycles [NULL] [NULL] [NULL] 2057

CTE-t lehet referenciaként használni, olvashatóbb, karban tarthatóbb és rekurzív szelekteknél használható jól. Ennél már csak a temptábla jobb, amire indexet is tehetsz, de az már a "kicsit értek hozzá" mesgye, nagyon veszélyes. :)

Volt nekem 2-300 soros select-szörnyem és CTE-vel valamiért gyorsabb lett, kb 30%-a lett a futásidő az eredetinek..

A MySQL-nel szerintem a nested select a problema, azt nagyon nem szokta szeretni. Ha azt elhagyod, akkor is lassu?
--

Ki oda vagyik, hol szall a galamb, elszalasztja a kincset itt alant. 

Akkor nincs értelme a lekérdezésemnek :-)

Komolyra fordítva: lehet, volna értelme megnézni, ha nagyon ráérek, kipróbálom.
Egyelőre kiválóan megy Postgres-sel, és feltételezhetően lesz olyan rész, amihez meg ígyis-úgyis az fog kelleni, mert a MySQL nem támogatja az adott funkciót.