2016-04-18 14 views
0

Ich brauche Beratung, wie das schnellste Ergebnis für die Abfrage auf große Tabelle zu bekommen. Ich benutze SQL Server 2012, meine Bedingung ist wie folgt:Schnellste Ausführungszeit für die Abfrage auf Big-Size-Tabelle

Ich habe 5 Tabellen enthält Transaktionsaufzeichnung, jede Tabelle hat 35 Millionen Datensätze. Alle Tabellen haben 14 Spalten, die Spalten, die ich durchsuchen muss, sind GroupName, CustomerName und NoRegistration. Und ich habe eine Ansicht, die 5 von all diesen Tabellen enthält. Die Datensätze GroupName, CustomerName und NoRegistration sind nicht für jede Tabelle eindeutig.

Meine Anwendung habe eine Funktion, um diese Spalte zu suchen. Die Abfrage ist dies wie:

Suche nach Gruppenname:

SELECT DISTINCT(GroupName) FROM TransactionRecords_view WHERE GroupName LIKE ''[email protected]+'%' 

Suche nach Name:

SELECT DISTINCT(CustomerName) AS 'CustomerName' FROM TransactionRecords_view WHERE CustomerName LIKE ''[email protected]+'%' 

Suche nach NoRegistration:

SELECT DISTINCT(NoRegistration) FROM TransactionRecords_view WHERE LOWER(NoRegistration) LIKE LOWER(@NoRegistration)+'%' 

Meine Frage ist, wie kann Ich erreiche schnellste Ausführungszeit für die Suche? Mit meinem Zustand jetzt, jedes Mal, wenn ich suche, dauerte es 3 bis 5 Minuten.

Meine Idee ist es, eine neue Tabellen enthält die unterschiedlichen GroupName, CustomerName und NoRegistration von allen 5 Tabellen.

Ist meine Idee ist die Ausführungszeit ist schneller? oder irgendeine andere Idee?

Danke


EDIT:

Dies ist Abfrage für view "TransactionRecords_view"

CREATE VIEW TransactionRecords_view 
AS 
SELECT * FROM TransactionRecords_1507 
UNION ALL 
SELECT * FROM TransactionRecords_1506 
UNION ALL 
SELECT * FROM TransactionRecords_1505 
UNION ALL 
SELECT * FROM TransactionRecords_1504 
UNION ALL 
SELECT * FROM TransactionRecords_1503 
+0

So sind die Spalten sind typisiert-in Strings: vielleicht kann es für Sie sinnvoll sein? Sie können eine neue Transaktion mit GroupName 'NewGroup' eingeben und wenn Sie diese vor ein paar Jahren einmal verwendet haben, ist die neue Transaktion zufällig in derselben Gruppe? Aber wenn es einen Tippfehler wie "NewGroup" gibt, dann ist es zufällig eine Gruppe für sich? Ich würde eher eine GroupName-Tabelle mit den Transaktionen erwarten, die sich auf ihre Datensätze beziehen. –

+0

'SELECT * ... UNION ALL'? Also sind deine fünf Tische alle gleich strukturiert? Warum hast du dann fünf Tische und keinen? Wäre das nicht viel besser? –

+0

@ThorstenKettner, weil es jeden Monat eine Transaktion aufzeichnet. Eine andere Funktion in meinen Apps ist die Berechnung der Transaktion pro Monat, letzten Monat und letztes Jahr, also dachte ich, es würde jeden Monat eine bessere Performance geben. – user1008497

Antwort

1

Ok, also müssen Sie diese neuen Tabellen nicht erstellen. Wenn Sie basierend auf diesen Feldern Non-Clustered-Indizes erstellen, wird (tatsächlich) das erledigt, was Sie suchen. Der Index speichert nur Daten zu den von Ihnen angegebenen Spalten und nicht die gesamte Tabelle. Beachten Sie jedoch, dass Indizes für SELECT-Anweisungen sehr hilfreich sind, sich jedoch negativ auf alle Schreibanweisungen auswirken (INSERT, UPDATE usw.).

Als nächstes möchten Sie die Abfragen mit dem tatsächlichen Ausführungsplan ausgeführt ausführen. Dies zeigt Ihnen, wie der Optimierer entschieden hat, jede Abfrage auszuführen (im Backend). Gibt es hier besondere Probleme? Sind einige der Schritte für die Gesamtkosten des Betreibers von Bedeutung? Es gibt viele gute Lehrvideos über Ausführungspläne auf youtube, schau sie dir an, wenn du vorher noch keine exe-Pläne angeschaut hast.

+1

Vielen Dank für Ihren Rat. Ich führe die Abfrage mit der tatsächlichen Ausführungszeit und 2 Indizes fehlt. – user1008497

3

Sie SQL von TransactionRecords_view zeigen müssen. Haben Sie Indizes? Wie lautet die Sortierung der NoRegistration-Spalte? Fügen Sie den tatsächlichen Ausführungsplan für jede Abfrage ein.

+1

IST das eine ** Antwort ** oder ** Kommentar **. –

+0

Ich indiziere bereits jede Tabelle, aber nur für eine andere und wichtigere Funktion in meiner App. Vergessen Sie die Indizierung für diese Funktion. Tatsächlichen Ausführungsplan verwenden und 2 Indizes fehlen. Danke – user1008497

+0

@NeerajPrasadSharma das ist ein Kommentar mit einer Antwort von selbst zu betrachten :) –

0

Haben Sie versucht, mit dem tatsächlichen Ausführungsplan zu überprüfen, ob Indizes fehlen?

Darüber hinaus, wie Sie Klausel auf Varchar verwenden, habe ich über Volltextsuche gehört.

https://msdn.microsoft.com/en-us/library/ms142571(v=sql.120).aspx

+0

Volltextsuche scheint gut, aber um das zu verwenden, muss ich den Volltextindex erstellen, und der Volltextindex muss einen primären eindeutigen Schlüssel haben, und die Tabellen haben keinen eindeutigen Schlüssel. Vielen Dank – user1008497