Optimierungsfrage

Optimierungsfrage

am 18.04.2008 05:45:11 von Andreas Born

Hallo,

ich habe eine Frage zu einem sql-statement.

Und zwar will ich mir alle Datensätze einer Tabelle ausgeben, die in
einem Feld einen Wert haben, der in mehr als nur diesem Datensatz
vorkommt.

Zur veranschaulichung:

t: R1 R2
1 a
2 b
3 b
4 c
5 d
6 e
7 e
8 e
9 f

gewünschtes Ergebnis:

r: R1 R2 cnt
2 b 2
3 b 2
6 e 3
7 e 3
8 e 3

Aktuell löse ich das mit einem join auf einen subquery:

select t.R1,t.R2,t2.cnt
from t left join (select
R2, count(*) as cnt from t group by R2 having cnt > 1
) as t2 on t.R2 = t2.R2
where t2.R2 is not null
order by t2.cnt,R1,R2


Geht das evtl. einfacher, d.h. ohne subquery?



Viele Grüße,
Andreas

Re: Optimierungsfrage

am 18.04.2008 10:12:30 von Harald Stowasser

Andreas Born schrieb:
> Hallo,
>
> ich habe eine Frage zu einem sql-statement.
>
> Und zwar will ich mir alle Datensätze einer Tabelle ausgeben, die in
> einem Feld einen Wert haben, der in mehr als nur diesem Datensatz vorkommt.
....
> Aktuell löse ich das mit einem join auf einen subquery:
>
> select t.R1,t.R2,t2.cnt
> from t left join (select
> R2, count(*) as cnt from t group by R2 having cnt > 1
> ) as t2 on t.R2 = t2.R2
> where t2.R2 is not null
> order by t2.cnt,R1,R2
>
>
> Geht das evtl. einfacher, d.h. ohne subquery?

wenn es Dir reicht in der Application R1s zu zerpfücken:

SELECT GROUP_CONCAT(t.R1) AS R1s,t.R2,count(*) AS cnt
FROM t
GROUP BY R2
HAVING cnt > 1
ORDER BY cnt,R1s,R2

Having hat ausreichend Performance wenn du viele cnt >1 hast.
Eventuell könnte ein X-Join auch performanter sein (vorraussetzung
passender index über R2 und R1) Achtung einige R1 kommen hier evtl.
doppelt:

SELECT GROUP_CONCAT(t.R1) AS R1s,t.R2,count(*) AS cnt
FROM t, t as t2
WHERE t.R2=t2.R2 AND t.R1 < t2.R1 #( beinhaltet: t.R1 != t2.R1 )
GROUP BY t.R2

(btw wenn dir Group_concat nicht gefällt, kannste den X-Join auch in
deiner Subquery probieren.)



---> Achtung alle Querys ungetestet!

Re: Optimierungsfrage

am 18.04.2008 11:06:02 von Harald Fuchs

In article <66qjs9F2laphqU1@mid.individual.net>,
"Andreas Born" writes:

> t: R1 R2
> 1 a
> 2 b
> 3 b
> 4 c
> 5 d
> 6 e
> 7 e
> 8 e
> 9 f

> gewünschtes Ergebnis:

> r: R1 R2 cnt
> 2 b 2
> 3 b 2
> 6 e 3
> 7 e 3
> 8 e 3

> Aktuell löse ich das mit einem join auf einen subquery:

> select t.R1,t.R2,t2.cnt
> from t left join (select
> R2, count(*) as cnt from t group by R2 having cnt > 1
> ) as t2 on t.R2 = t2.R2
> where t2.R2 is not null
> order by t2.cnt,R1,R2


> Geht das evtl. einfacher, d.h. ohne subquery?

Einfacher schon, aber wohl nicht so performant:

SELECT t1.r1, t1.r2, count (t2.r1) + 1 AS cnt
FROM t t1
JOIN t t2 ON t2.r2 = t1.r2 AND t2.r1 != t1.r1
GROUP BY t1.r1, t1.r2

Re: Optimierungsfrage

am 18.04.2008 11:47:07 von Boris Stumm

Andreas Born wrote:
> Geht das evtl. einfacher, d.h. ohne subquery?

Dein Subject ist "Optimierungsfrage", was eigentlich
nicht zu dem Rest deiner Mail passt. Willst du es
einfach oder willst du es schnell? So viele sinnvolle
Möglichkeiten seh ich allerdings nicht.

select
t1.r1, t1.r2, count(*)
from
t t1, t t2
where
t1.r2 = t2.r2
group by
t1.r1, t1.r2

Re: Optimierungsfrage

am 18.04.2008 11:54:22 von Thomas Rachel

Boris Stumm schrieb:

> select
> t1.r1, t1.r2, count(*)
> from
> t t1, t t2
> where
> t1.r2 = t2.r2
> group by
> t1.r1, t1.r2

Der Komma-Operator hier führt im Falle von Erweiterungen des Querys zu
unnötigem Ärgernis.

Was spricht gegen

select
t1.r1, t1.r2, count(*)
from
t t1 join t t2 using (r2)
group by
t1.r1, t1.r2

?


Thomas

Re: Optimierungsfrage

am 21.04.2008 12:09:37 von Boris Stumm

Thomas Rachel wrote:

> Boris Stumm schrieb:
>> select
>> t1.r1, t1.r2, count(*)
>> from
>> t t1, t t2
>> where
>> t1.r2 = t2.r2
>> group by
>> t1.r1, t1.r2
>
> Der Komma-Operator hier führt im Falle von Erweiterungen des Querys zu
> unnötigem Ärgernis.
>
> Was spricht gegen
>
> select
> t1.r1, t1.r2, count(*)
> from
> t t1 join t t2 using (r2)
> group by
> t1.r1, t1.r2

Nix :-)
Würde ich unter "Geschmacksfrage" abhaken.

Re: Optimierungsfrage

am 23.04.2008 01:47:34 von Andreas Born

Hi,

leider ist mir zeitlich etwas dazwischen gekommen und ich komme jetzt
erst zum antworten.

Zunächst einmal vielen Dank für alle Infos und Tipps. Ich werde mal
austesten welche der Abfragen am schnellste ist, habe aber den Eindruck,
daß ich schon (mehr oder weniger zufälig) das optimum getroffen habe.

Btw, mit "einfacher" implizierte ich auch eine performantere Abfrage;
daß das nicht unbedingt korrelieren muß ist mir dann auch aufgefallen,
leider zu spät ;-)

Also nochmals vielen Dank für Eure Antworten!


Viele Grüße,
Andreas