2016-04-21 14 views
0

Dies ist meine Select-Abfrage.Oracle wählen Abfrage dauert lange

select count(m.uniq_no) cnt 
     from web_cst_mst m 
inner join WEB_CST_INV i on M.UNIQ_NO=I.UNIQ_NO 
where I.INV_NO='inv01' 
    and I.INV_DT=to_date('2015-01-12','YYYY-MM-DD') 
    and M.sel_tin='19320703277' 
    ; 

Ich habe einen Index für (uniq_no,sel_tin) für web_cst_mst Tabelle und einen Index für (uniq_no,inv_no,inv_dt) für web_cst_inv Tabelle erstellt.

Diese Abfrage dauert etwa 250ms. Früher habe ich 500ms gebraucht, als ich die Trimmfunktion für Verkäufer tin(trim(M.sel_tin)) hatte. Ich entfernte trim und es dauert die Hälfte der ursprünglichen Zeit, so dass ich denke, wenn ich to_date Funktion entfernen kann, dann könnte es weniger Zeit dauern, aber das Problem, das ich hier bin, ist ich sende ein Datum im String-Format, wie ich c# Datum Variable senden kann in (10-JAN-14) dieses Format, weil die c# Datumsvariable auch Zeit hält. Ich habe den folgenden Code ausprobiert, nur um den Datumsteil zu senden, damit ich to_date Funktion in Orakel entfernen kann, aber es funktioniert nicht. Und die Daten in Oracle sind im Format (dd-MMM-yy ex:10-JAN-14) gespeichert. Entweder muss ich nur den Datumsteil senden oder habe die Funktion to_date in der Abfrage.

Ich möchte nur den Datumsteil der Datetime-Variable senden, um die Leistung dieser Abfrage zu erhöhen. Aber ich kann das nicht erreichen.

Alle Vorschläge/Hilfe zur Verbesserung der Leistung. Vielen Dank.

DateTime inv_date = DateTime.ParseExact(inv_dt, "dd-MMM-yy", CultureInfo.InvariantCulture).Date; 
+0

Sie * sollte * parametrisierte Abfragen verwenden und tatsächliche Datetime-Werte anstelle von Zeichenfolgen übergeben, Konvertierungsfehler zu vermeiden . Zum Beispiel wird das von Ihnen erwähnte Format ('10-JAN-14') garantiert fehlschlagen * und * der Y2K-Fehler eingeführt. Das * wird jedoch nicht mit der Leistung helfen. 'to_date' wird auf eine einzelne Zeichenfolge angewendet, die zum Suchen in einem Index verwendet werden kann. 'Trim' muss andererseits auf * alle * Zeilen angewendet werden, was die Verwendung von Indizes verhindert. –

+0

Haben Sie den SQL-Ausführungsplan angeschaut? –

Antwort