SELECT COUNT(*) optimieren?
-
hi zusammen,
ich habe eine form mit einer statistik. die mssql datenbank frage ich bis jetzt so ab:
[cpp] querystatistik->Close(); querystatistik->SQL->Clear(); querystatistik->SQL->Add("SELECT count(branche) as branche FROM adressen WHERE branche = 'abfall'"); querystatistik->Open(); Label4->Caption = querystatistik->FieldByName("branche")->AsString; querystatistik->Close(); querystatistik->SQL->Clear(); querystatistik->SQL->Add("SELECT count(branche) as branche FROM adressen WHERE branche = 'bagger'"); querystatistik->Open(); Label5->Caption = querystatistik->FieldByName("branche")->AsString;[/cpp]
bei einer kleinen datenbak geht das recht flott, allerdings ist die datenbank jetzt recht groß geworden so das die abfrage sehr lange dauert.
meine frage ist, wie ich das ganze optimieren kann. hab bisher nichts wirklich passendes gefunden.
-
Hallo
Das Optimieren von SQL-Konzepten hat mit der Builder-Verarbeitung des Ergebnisses nicht mehr viel zu tun. Deshalb ab ins Datenbank-Forum.
bis bald
akari
-
Dieser Thread wurde von Moderator/in akari aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum Datenbanken verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
So eine Optimierung, wie du sie vorhast, nimmt der SQL-Daemon i.d.R. von alleine vor, und zwar effektiver, als du es je könntest (darauf ist er ja optimiert).
-
Du kannst das höchstens dadurch beschleunigen, daß Du einen Index für die zu zählenden Felder einführst, dann kann die DB das (vermutlich) ebenfalls schneller durchführen.
-
hi zusammen,
hmmmm, das soll also heißen ich muß damit leben das das Formular ca 10 sec. brauch bis es richtig angezeigt wird? denn erst dann ist die auswertung durch.
z.Z. müssen 200 000 datensätze ausgewertet werden. was soll es dann werden wenn die datenbak sich verdoppelt? formular öffnen, kaffee holen, ziggi rauchen und dann weiter arbeiten? das kann es nicht sein.
es muß sich doch irgendwie beschleunigen lassen. mit 1 - 2 sekunden wäre ich ja noch einverstanden.@ makc++us,
wie meinst du das:daß Du einen Index für die zu zählenden Felder einführst
einen index hab ich. ist auch primärschlüssel.
meine db sieht so aus:
id | mail | branche | sperrabfragen über andere Tabellen finden nicht statt. ich frag nur inerhalb dieser db ab.
-
Machst du das für jede Branche oder nur für die beiden? Wenn du es für jede Branche machst ist es vielleicht schneller über GROUP BY:
SELECT branche, count(*) FROM adressen GROUP BY branche
BTW: Was macht Branche da überhaupt als String in der Tabelle? Gehört da nicht eine ID in die Branchen-Tabelle hin?
MfG SideWinder
-
SideWinder schrieb:
Machst du das für jede Branche oder nur für die beiden? Wenn du es für jede Branche machst ist es vielleicht schneller über GROUP BY:
SELECT branche, count(*) FROM adressen GROUP BY branche
BTW: Was macht Branche da überhaupt als String in der Tabelle? Gehört da nicht eine ID in die Branchen-Tabelle hin?
MfG SideWinder
hi SideWinder,
ich mach das für ca 30 branchen. hab hier nur einen teilauszug gepostet. ich werde das mal über GROUP BY testen.
mit dem string hast du natürlich recht. sollte eigentlich eine extra tabelle für die branchen haben.
-
Bei deinem Statement
SELECT count(branche) as branche FROM adressen WHERE branche = 'abfall'
Würde ein Index auf "branche" nachtürlich am meissten bringen. Der Primärschlüssel hilft dir wenig, wenn er auf einem Feld liegt das nicht Teil der Bedingung ist. Im Notfall kannst du auch eher unorthodoxe Methoden versuchen, wie z.B. einen Trigger auf Insert und Delete, der einen Zähler in einer separaten Statistik-Tabelle hoch und runterzählt.
-
Also wenn schon ein INDEX dann icht auf ein CHAR oder VARCHAR.
Normalisiere die Tabelle.
Dann setzen eine INDEX auf die ID der branche.
-
daß Du einen Index für die zu zählenden Felder einführst einen index hab ich. ist auch primärschlüssel.
meine db sieht so aus:
id | mail | branche | sperrabfragen über andere Tabellen finden nicht statt. ich frag nur inerhalb dieser db ab.
dein index auf pk id hat bei diesem select keinen effekt. um das ganze turboschnell zu machen, musst du den index auf die attribute, die in der where-klausel auftreten legen, d.h. "branche" muss indiziert werden. macht natürlich nur sinn, wenn viele tupel, so ab einigen 1000, gespeichert sind.
mfg, tesuji