2016-12-28 2 views
-5

Ich versuche, die unter Abfrage auszuführen, aber es ist zu langer Zeit zu nehmen, weil die Daten sehr groß ist:Reduzierung der Zeit für die Suche nach

SELECT pre.Count AS Precount, consol.Count AS commoncount, post.Count AS Postcount, Precount-commoncount AS deleted, postcount-commoncount AS added 
FROM (SELECT COUNT([PRE_L]) AS [count] FROM PRE_LNADJL_2) AS pre, 
    (SELECT COUNT([PRE_L]) AS [count] FROM CD_LNADJL) AS consol, 
    (SELECT COUNT([Post_L]) AS [count] FROM POST_LNADJL_2) AS post; 
+2

1. Bitte verwenden Sie keine Großbuchstaben in Ihrem Beitrag, es gilt als schreien und ist daher unhöflich. 2. Bitte verwenden Sie passende Tags für Ihre Frage. Es kann nichts mit MySQL zu tun haben, da es verschiedene Arten verwendet, um Aliase anzuzeigen. Access-Tag ist für die Sicherheit gedacht. 3. Da Sie alle Datensätze in 3 Tabellen zählen, ist der Optimierungsaufwand sehr gering. – Shadow

+0

Was genau möchten Sie zählen? Alle Datensätze? Dann verwenden Sie 'COUNT (*)', es ist viel schneller, wenn die Tabelle einen Primärschlüssel hat. Versuchen Sie auch, die 3 Unterabfragen separat auszuführen, um zu sehen, wie viel schneller das ist. – Andre

Antwort

0

Wir haben einen kleinen Trick tun, wenn ich bei einer Wirtschaftsprüfungs gearbeitet Unternehmen, wo unser Back-End SQL Server war und wir hatten mit einigen Tabellen mit mehr als 5B Datensätze zu tun. Wir würden unsere Berichte "vorlaufen lassen". Das heißt, wir würden unsere Daten über Nacht filtern und in neue Tabellen schreiben. Auf diese Weise wurden alle größeren, zeitraubenden Berechnungen durchgeführt, wenn niemand die Daten benötigte.

Ich würde vorschlagen, dass Sie einen On Timer-Ereignissatz ausführen, der ausgeführt wird, wenn niemand im Büro ist. In diesem Fall laufen so etwas wie:

INSERT INTO pre SELECT COUNT([PRE_L]) AS [count] FROM PRE_LNADJL_2 
INSERT INTO consol SELECT COUNT([PRE_L]) AS [count] FROM CD_LNADJL 
INSERT INTO post SELECT COUNT([Post_L]) AS [count] FROM POST_LNADJL_2 

(Sie ebenfalls in die Sie auswählen könnte, entweder man ist in Ordnung, je nachdem, ob Sie möchten, dass Ihre Daten Halter Tabellen löschen/neu erstellen oder löschen, jedes Mal haben diese ausgeführt wird)

und dann, wenn Ihre Benutzer diesen Bericht ausgeführt werden muss oder was auch immer es ist, die SQL muss nur sein:

SELECT pre.Count AS Precount, consol.Count AS commoncount, post.Count AS Postcount, 
     Precount-commoncount AS deleted, postcount-commoncount AS added 
FROM (SELECT * FROM pre), 
(SELECT * FROM consol), 
(SELECT * FROM post); 

in 2 Sekunden laufen soll.

Verwandte Themen