2016-07-25 14 views
0

Ich möchte eine Tabelle mit einer Million Datensätze für Kunden namens "FooBar" abfragen, die Datensätze am 24.07.2016 datiert haben. Die Tabelle enthält 10 Tage Daten.Kann ich in Oracle SQL eine Partition einer Tabelle anstatt einer ganzen Tabelle abfragen, damit sie schneller ausgeführt wird?

select * 
from table 
where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

Das Problem mit der obigen Abfrage ist, dass es eine Weile dauert zu laufen. Ich möchte, dass es schneller läuft.

Die Tabelle ist in 24-Stunden-Tage unterteilt. Kann ich die Abfrage auf die Tabellenpartitionen konzentrieren? Würde das die Abfrage schneller ausführen?

select * 
from partition-7-24-2016 
where customer = 'FooBar'; 
+3

Oracle sollte die richtigen Partitionen für die Abfrage auswählen. –

+0

Was ist der Abfrageplan? Setzt Oracle die Partitionierung automatisch ab? Gibt es einen lokalen Index für "Kunden"? Wenn die Tabelle nur Daten für 10 Tage enthält, würde das Löschen der Partition immer noch einen vollständigen Scan einer Partition erfordern, die 10% der Daten in der Tabelle aufweist, die vermutlich sehr viel ist. Unter der Annahme, dass "Kunde" relativ selektiv ist, wäre ein Index für "Kunden" ein viel größerer Vorteil als die Partitionierung. –

Antwort

1

Die korrekte Syntax ist select [columns] from [table] partition ([partition]). Also, in diesem usecase, würden Sie so etwas wie dieses:

SELECT * 
FROM mytable PARTITION (partition_7_24_2016) 
WHERE customer = 'FooBar'; 
+3

Zuerst bin ich mir ziemlich sicher, dass Sie den Partitionsnamen mit Klammern umgeben müssen (ich habe zur Zeit keine partitionierte Tabelle zum Testen). Obwohl Sie diese Syntax verwenden können, sollten Sie diese Syntax fast nie verwenden. Wenn die Tabelle in der 'date'-Spalte partitioniert ist (die vermutlich nicht nach einem reservierten Wort benannt ist), sollte die Partitionsbeschneidung automatisch die Partition (en) auswählen, die Sie benötigen. Das ist viel sinnvoller als die Verwendung von dynamischem SQL, um den Partitionsnamen zur Abfrage hinzuzufügen. –

+0

Diese Abfrage funktionierte für mich. Ich habe drei separate Tests auf drei verschiedenen Partitionen durchgeführt. Verglichen mit meiner ursprünglichen Abfrage oben ohne Partitionen, lief diese Abfrage zwischen 8x bis 24x schneller. Test 1: 28 Sekunden ursprüngliche Abfrage, 3 Sekunden Partitionsabfrage. Test 2: 49 Sekunden ursprüngliche Abfrage, 2 Sekunden Partition Abfrage. Test 3: 79 Sekunden ursprüngliche Abfrage, 9 Sekunden Partition Abfrage. –

1

Sie können es wie folgt tun:

select * from table PARTITION FOR (date '2016-07-24') where customer = 'FooBar' 
and insert_date between to_date('2016-07-24 00:00:00', 'YYYY-MM-DD HH24:MI:SS') and to_date('2016-07-24 23:59:59', 'YYYY-MM-DD HH24:MI:SS'); 

Dies wird sich nur für die Zeilen in der Partition, wo Ihre angegebene Datum fällt - date '2016-07-24' in diesem Beispiel.

Sie müssen sicherstellen, dass Sie den Partitionswert in den Klammern angeben. Wenn Sie einen Index erstellt haben, vergewissern Sie sich, dass er lokal ist. Andernfalls werden Sie keine große Verbesserung feststellen, wenn Sie die Tabelle selbst auswählen.

+0

In der obigen Abfrage habe ich die zusätzlichen 'und' entfernt und ausgeführt. Als ich das tat, erhielt ich einen Fehler. ORA-00905: fehlendes Schlüsselwort. –

+1

es funktioniert auf 12c, möglicherweise ältere Version ausgeführt – Palcente

Verwandte Themen