2017-09-27 3 views
0
SELECT 
    XYZ_ID 
FROM XYZ 
WHERE 
    SUBSTR(Processor_Key, 24, 5) = '01000' AND 
    SUBSTR(Processor_Key, 32, 5) = '00900' AND 
    SUBSTR(Processor_Key, 40, 5) = '00070' AND 
    SUBSTR(Processor_Key, 48, 5) = '10000' AND 
    SUBSTR(Processor_Key, 56, 5) = '66000' AND 
    SUBSTR(Processor_Key, 64, 5) = '09000' AND 
    SUBSTR(Processor_Key, 72, 5) = '00050'; 

Wie die Abfrage zu optimieren und die Kosten der Abfrage zu reduzieren?So optimieren Sie die Abfrage mit SUBSTR

+4

Entfernen Sie den Teilstr. Bewahren Sie die Daten so auf, dass sie nicht benötigt werden. Oder behandeln Sie die Datenverarbeitung im Anwendungscode. Sonst bist du ziemlich festgefahren. – Strawberry

+0

Daten sind vom Benutzer, wo es alles sein kann .. Anwendung Datenverarbeitung nicht möglich, und ich habe hier nur Dummy-Daten hinzugefügt. – user8413514

Antwort

3

Hohe Risiko von Downvoted werden, aber eine Sache, die würde funktionieren könnte, um Ihre viele SUBSTR Anrufe mit einem einzigen LIKE Ausdruck zu ersetzen: Diese

SELECT XYZ_ID 
FROM XYZ 
WHERE 
    Processor_Key LIKE '_______________________01000___00900___00070___10000___66000___09000___00050%'; 

Der Grund übertreffen könnte Ihre ursprüngliche Abfrage ist, dass der LIKE Ausdruck kann ausgewertet werden, indem höchstens ein einziger Durchgang über die ersten 77 Zeichen des Prozessorschlüssels gemacht wird. In Ihrer ursprünglichen Abfrage führen Sie sieben verschiedene Aufrufe an SUBSTR aus, von denen jede möglicherweise ausgewertet werden muss, um eine Entscheidung zu treffen.

Dies gesagt, wie @Gordon und die obigen Kommentare darauf hingewiesen haben, könnte die beste langfristige Lösung sein, Ihren Schlüssel in separate Spalten aufzubrechen und jede einzelne zu indizieren. Dies würde es Ihnen ermöglichen, die volle Leistungsfähigkeit einer Datenbank zu nutzen, z. über die Indexierung.

1

Sie können nicht. Die SQL-Steuerkomponente kann keinen traditionellen Index für diese Abfrage verwenden.

Was sind Ihre Möglichkeiten? Abhängig davon, wie die Zeichenfolge wirklich aussieht, können Sie möglicherweise eine Volltextsuche verwenden.

Alternativ können Sie die Codes auch in separate Spalten ziehen und dann Indizes für diese Spalten erstellen. Vermutlich bedeuten die Codes tatsächlich etwas. Sie können dies beim Einfügen explizit tun oder einen Trigger verwenden, um die Spalten zu füllen.

Eine weitere Alternative ist in den neuesten Versionen von MySQL verfügbar. Sie können für jede Teilzeichenfolge eine generierte Spalte erstellen und dann einen Index für sie erstellen.

Verwandte Themen