2 Stimmen

Vollständiger Tabellen-Scan bei Verwendung einer if-Bedingung in der Abfrage

Ich habe eine Situation, bei der ich eine Bedingung in meiner WHERE-Klausel der Abfrage verwenden muss. Alle Felder haben ihre eigenen Indizes, die in der Bedingung verwendet werden. Aber die Abfrage führt einen vollständigen Tabellenscan durch. Kann mir jemand helfen, den vollständigen Tabellenscan zu vermeiden?

Meine Abfrage:

ERKLÄRE SELECT COUNT(*) 
VON BILL_PATIENT_BILL ALS fetchInfo 
WO IF(fetchInfo.BILL_TYPE='OP' 
UND fetchInfo.BILL_CATEGORY=0, fetchInfo.DUE_AMOUNT != 0, TRUE)

1voto

Konerak Punkte 38232
ERKLÄREN SIE SELECT COUNT(*) AUS BILL_PATIENT_BILL ALS fetchInfo WO IF(fetchInfo.BILL_TYPE='OP' UND fetchInfo.BILL_CATEGORY=0, fetchInfo.DUE_AMOUNT != 0, TRUE)

Ihr IF macht keinen Sinn. Was es macht, ist:

  • Wenn BILL_TYPE='OP',
  • und BILL_CATEGORY=0,
  • dann ist die WHERE-Klausel wahr, wenn DUE_AMOUNT != 0
  • sonst ist die WHERE-Klausel immer wahr.

Aber egal, Sie brauchen es nicht. Sie können die Abfrage wie folgt neu schreiben und De Morgan verwenden

ERKLÄREN SIE SELECT COUNT(*) 
AUS BILL_PATIENT_BILL ALS fetchInfo 
WO (fetchInfo.BILL_TYPE='OP' 
  UND fetchInfo.BILL_CATEGORY=0 
  UND fetchInfo.DUE_AMOUNT != 0) 
  ODER fetchInfo.BILL_TYPE<>'OP' 
  ODER fetchInfo.BILL_CATEGORY=0 

Sie sollten einen Index auf (BILL_TYPE, BILL_CATEGORY, DUE_AMOUNT) haben, aber selbst dann könnte es aufgrund der OR-Klauseln entscheiden, den Index nicht zu verwenden. In diesem Fall versuchen Sie es mit einer neuen Schreibweise als Union:

SELECT COUNT(*) 
    AUS BILL_PATIENT_BILL ALS fetchInfo 
    WO (fetchInfo.BILL_TYPE='OP' 
      UND fetchInfo.BILL_CATEGORY=0 
      UND fetchInfo.DUE_AMOUNT != 0)
UNION ALLES
SELECT COUNT(*) 
    AUS BILL_PATIENT_BILL ALS fetchInfo 
      WO fetchInfo.BILL_TYPE<>'OP'
UNION ALLES
SELECT COUNT(*) 
    AUS BILL_PATIENT_BILL ALS fetchInfo 
      WO fetchInfo.BILL_CATEGORY=0

Sie können eine SUMME durchführen, um diese hinzuzufügen.

Weil Sie tatsächlich alle Werte der Spalten akzeptieren, benötigen Sie vielleicht nicht einmal eine WHERE-Klausel...

ERKLÄREN SIE SELECT COUNT( 
  IF(fetchInfo.BILL_TYPE='OP' 
    UND fetchInfo.BILL_CATEGORY=0 
    UND fetchInfo.DUE_AMOUNT != 0, 
  1, 
  0)) 
AUS BILL_PATIENT_BILL ALS fetchInfo

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X