Oracle
 sql >> Datenbank >  >> RDS >> Oracle

Gilt die Verwendung von select * für einen Cursor in PL/SQL als schlechte Programmierung?

Mit select * in Ihrem Code ist das, was ich als faule Programmierung bezeichnen würde, mit mehreren unangenehmen Nebenwirkungen. Wie stark Sie diese Nebenwirkungen erleben, wird unterschiedlich sein, aber es ist nie positiv.

Ich werde einige der Punkte verwenden, die bereits in anderen Antworten erwähnt wurden, aber Sie können meine Antwort gerne bearbeiten und weitere negative Punkte zur Verwendung von select * hinzufügen .

  1. Sie senden mehr Daten von der SQL-Engine an Ihren Code als nötig, was sich negativ auf die Leistung auswirkt.

  2. Die Informationen, die Sie zurückerhalten, müssen in Variablen platziert werden (z. B. eine Datensatzvariable). Dadurch wird mehr PGA-Speicher als nötig benötigt.

  3. Mit select * Sie werden niemals einen Index allein verwenden, um die gewünschten Informationen abzurufen, Sie müssen immer auch die Tabelle besuchen (vorausgesetzt, es existiert kein Index, der alle Spalten der Tabelle enthält). Wiederum mit negativen Auswirkungen auf die Leistung.

  4. Weniger klar für Leute, die Ihren Code pflegen, was Ihre Absicht ist. Sie müssen in den Code eintauchen, um alle Vorkommen Ihrer Datensatzvariablen zu erkennen, um zu wissen, was abgerufen wird.

  5. Sie werden keine SQL-Funktionen verwenden, um Berechnungen durchzuführen, sondern sich immer auf PL/SQL- oder Java-Berechnungen verlassen. Möglicherweise verpassen Sie einige großartige SQL-Verbesserungen wie analytische Funktionen, Modellklauseln, rekursive Unterabfragefaktorisierung und dergleichen.

  6. Ab Oracle11 werden Abhängigkeiten auf Spaltenebene verfolgt, dh wenn Sie select * verwenden , wird Ihr Code im Datenwörterbuch als "von allen Spalten abhängig" dieser Tabelle markiert. Ihre Prozedur wird ungültig, wenn etwas mit einer dieser Spalten passiert. Die Verwendung von select * bedeutet also, dass Ihr Code öfter als nötig ungültig wird.

Auch hier können Sie gerne Ihre eigenen Punkte hinzufügen.