In diesem Dokument werden die grundlegenden Unterschiede zwischen Oracle® und Cloud SQL for MySQL bei Abfragen vorgestellt und es wird beschrieben, wie Features in Oracle den Features in Cloud SQL for MySQL zugeordnet werden. Außerdem werden Leistungsaspekte für Cloud SQL for MySQL und Möglichkeiten zur Analyse und Optimierung der Abfrageleistung in Google Cloud präsentiert. In diesem Dokument geht es zwar um Techniken zur Optimierung gespeicherter Verfahren und Trigger für Cloud SQL for MySQL, aber nicht um die Übersetzung von PL/SQL-Code in gespeicherte MySQL-Verfahren und -Funktionen.
Beim Konvertieren von Abfragen von Oracle Database nach Cloud SQL for MySQL sind Unterschiede zwischen bestimmten SQL-Dialekten zu beachten. Außerdem gibt es mehrere eingebundene Funktionen, die auf den beiden Datenbankplattformen unterschiedlich oder nicht kompatibel sind.
Grundlegende Unterschiede bei Abfragen
Obwohl Oracle und Cloud SQL for MySQL ANSI SQL unterstützen, gibt es einige grundlegende Unterschiede bei der Datenabfrage, hauptsächlich in Bezug auf die Verwendung von Systemfunktionen.
In der folgenden Tabelle sind die Unterschiede in der SELECT
- und FROM
-Syntax für Oracle und Cloud SQL for MySQL aufgeführt.
Name des Oracle-Features | Umsetzung in Oracle | Cloud SQL for MySQL-Unterstützung | Cloud SQL for MySQL-Entsprechung |
---|---|---|---|
Grundlegende SQL-Syntax für den Datenabruf |
SELECT FROM WHERE GROUP BY HAVING ORDER BY
|
Ja |
SELECT FROM WHERE GROUP BY HAVING ORDER BY
|
SELECT für die Ausgabe |
SELECT 1 FROM DUAL
|
Ja | SELECT 1 oder SELECT 1 FROM DUAL |
Spalten-Aliasse | SELECT COL1 AS C1
|
Ja | SELECT COL1 AS C1 oder SELECT COL1 C1 |
Groß-/Kleinschreibung bei Tabellennamen | Groß-/Kleinschreibung wird nicht berücksichtigt (z. B. kann der Tabellenname orders und ORDERS sein). |
Nein | Groß-/Kleinschreibung gemäß dem definierten Tabellennamen (z. B. kann der Tabellenname nur orders oder ORDERS sein). |
Inline-Ansichten
Inline-Ansichten (auch als abgeleitete Tabellen bezeichnet) sind SELECT
-Anweisungen in der FROM
-Klausel, die als Unterabfrage verwendet werden. Inline-Ansichten können dazu beitragen, komplexe Abfragen zu vereinfachen, indem kumulierende Berechnungen oder Join-Vorgänge beseitigt werden. Gleichzeitig werden mehrere separate Abfragen zu einer einzigen, vereinfachten Abfrage zusammengefasst.
Im folgenden Beispiel wird eine Konvertierung von Oracle 11g/12c nach Cloud SQL for MySQL für eine Inline-Ansicht veranschaulicht.
Eine Inline-Ansicht in Oracle 11g/12c:
SELECT FIRST_NAME,
DEPARTMENT_ID,
SALARY,
DATE_COL
FROM EMPLOYEES,
(SELECT SYSDATE AS DATE_COL FROM DUAL);
Eine Arbeitsansicht in Cloud SQL for MySQL 5.7 mit einem Alias:
SELECT FIRST_NAME,
DEPARTMENT_ID,
SALARY,
DATE_COL
FROM EMPLOYEES, (SELECT SYSDATE() AS DATE_COL FROM DUAL) AS A1;
Joins
Mit Ausnahme von FULL JOIN
werden die Join-Typen von Oracle von Cloud SQL for MySQL unterstützt.
Cloud SQL for MySQL-Joins unterstützen die Verwendung einer alternativen Syntax wie die USING
-Klausel, die WHERE
-Klausel anstelle der ON
-Klausel und die SUBQUERY
in der JOIN
-Anweisung.
Die folgende Tabelle zeigt ein Beispiel für eine JOIN
-Konvertierung.
JOIN -Typ von Oracle |
Cloud SQL for MySQL-Unterstützung | JOIN -Syntax von Cloud SQL for MySQL |
---|---|---|
INNER JOIN |
Ja |
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
|
CROSS JOIN |
Ja |
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D
|
FULL JOIN |
Nein | Erwägen Sie die Verwendung von UNION mit LEFT und RIGHT JOINS:
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID
UNION
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
. |
LEFT JOIN
[ OUTER ]
|
Ja |
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
|
RIGHT JOIN
[ OUTER ]
|
Ja |
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
|
SUBQUERY |
Ja |
SELECT E.FIRST_NAME, D.DEPARTMENT_NAME
FROM EMPLOYEES E JOIN (SELECT * FROM DEPARTMENTS)D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
|
Cloud SQL for MySQL unterstützt die Funktionen UNION
und UNION ALL
, die Funktionen INTERSECT
und MINUS
werden von Oracle jedoch nicht unterstützt:
- Mit
UNION
werden die Ergebnismengen von zweiSELECT
-Anweisungen angehängt, nachdem doppelte Datensätze entfernt wurden. - Mit
UNION ALL
werden die Ergebnismengen von zweiSELECT
-Anweisungen angehängt, ohne doppelte Datensätze zu entfernen. INTERSECT
gibt die Schnittmenge von zweiSELECT
-Anweisungen zurück, wenn in den Ergebnismengen aus beiden Abfragen ein Datensatz vorhanden ist.- Mit
MINUS
werden zwei oder mehrSELECT
-Anweisungen miteinander verglichen und nur bestimmte Zeilen aus der ersten Abfrage zurückgegeben, die von der zweiten Abfrage nicht zurückgegeben werden.
Die folgende Tabelle enthält einige Beispiele für die Konvertierung von Oracle nach Cloud SQL for MySQL.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Unterstützung | Cloud SQL for MySQL-Entsprechung |
---|---|---|---|
UNION |
SELECT COL1 FROM TBL1 UNION SELECT COL1 FROM TBL2
|
Ja | SELECT COL1 FROM TBL1 UNION SELECT COL1 FROM TBL2
|
UNION ALL |
SELECT COL1 FROM TBL1 UNION ALL SELECT COL1 FROM TBL2
|
Ja | SELECT COL1 FROM TBL1 UNION ALL SELECT COL1 FROM TBL2
|
INTERSECT |
SELECT COL1 FROM TBL1 INTERSECT SELECT COL1 FROM TBL2
|
Nein |
SELECT COL1 FROM TBL1 WHERE COL1 IN (SELECT COL1 FROM TBL2)
|
MINUS |
SELECT COL1 FROM TBL1 MINUS SELECT COL1 FROM TBL2
|
Nein | SELECT A.COL1
FROM TBL1 A LEFT JOIN TBL2 B
ON USING(COL1)
WHERE B.COL1 IS NULL
|
Skalierungs- und Gruppenfunktionen
Cloud SQL for MySQL bietet eine umfassende Liste von (einzeiligen) Skalierungs- und Aggregationsfunktionen. Einige Funktionen von Cloud SQL for MySQL sind ihren Entsprechungen von Oracle recht ähnlich (nach Name und Funktionalität oder unter einem anderen Namen, aber mit ähnlicher Funktionalität). Obwohl einige Funktionen von Cloud SQL for MySQL identische Namen wie ihre Entsprechungen von Oracle haben, können sie auch über andere Funktionalitäten verfügen.
In der folgenden Tabelle wird beschrieben, in welchen Fällen Zeichenfunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
CONCAT |
Gibt den ersten String zurück, der mit dem zweiten String verkettet ist:CONCAT('A', 1) = A1 |
Ja | CONCAT |
CONCAT('A', 1) = A1 |
CONCAT USING PIPE |
FNAME |' '| LNAME |
Nein | CONCAT |
CONCAT(FNAME, ' ', LNAME) |
LOWER oder UPPER |
Gibt den String mit allen Klein- oder Großbuchstaben zurück:LOWER('SQL') = sql |
Ja | LOWER oder UPPER |
LOWER('SQL') = sql |
LPAD/RPAD |
Gibt expression1 zurück, links oder rechts auf n Zeichen aufgefüllt, mit der Zeichenfolge in expression2 :LPAD('A',3,'*') = **A |
Ja | LPAD oder RPAD |
LPAD('A',3,'*') = **A |
SUBSTR |
Gibt einen Teil des Strings ab Position x (in diesem Fall 3) mit einer Länge von y zurück. Die erste Position im String ist 1.
SUBSTR('MySQL', 3, 3)
= SQL
|
Ja | SUBSTR |
SUBSTR('MySQL', 3, 3)
= SQL
|
INSTR |
Gibt die Position (Index) eines Strings aus einem bestimmten String zurück:
INSTR('MySQL', 'y')
= 2
|
Ja | INSTR |
INSTR('MySQL', 'y')
= 2
|
REPLACE |
Gibt einen String zurück, bei dem jeder vorkommende Suchstring durch einen Ersatzstring ersetzt wird:
REPLACE('ORADB', 'ORA', 'MySQL')
= MySQLDB
|
Ja | REPLACE |
REPLACE('ORADB', 'ORA', 'MySQL')
= MySQLDB
|
TRIM |
Kürzt vor- oder nachgestellte Zeichen (oder beides) aus einem String:
TRIM(both '-' FROM '-MySQL-')
= MySQL
TRIM(' MySQL ')
= MySQL
|
Ja | TRIM |
TRIM(both '-' FROM '-MySQL-')
= MySQL
TRIM(' MySQL ')
= MySQL
|
LTRIM/RTRIM |
Entfernt von der linken oder rechten Seite eines Strings alle Zeichen, die bei der Suche vorkommen:
LTRIM(' MySQL', ' ')
= MySQL
|
Teilweise | LTRIM or RTRIM |
Die Funktionen LTRIM und RTRIM von Oracle haben einen zweiten Parameter, mit dem angegeben wird, welche vorangestellten oder nachgestellten Zeichen aus dem String entfernt werden sollen. Bei Cloud SQL for MySQL-Funktionen werden nur vorangestellte und nachgestellte Leerzeichen aus dem angegebenen String entfernt:
LTRIM(' MySQL')
= MySQL
|
ASCII |
Nimmt ein einzelnes Zeichen und gibt den numerischen ASCII-Code zurück:ASCII('A') = 65 |
Ja | ASCII |
ASCII('A') = 65 |
CHR |
Gibt den ASCII-Codewert für ein Zeichen zurück, bei dem es sich um einen numerischen Wert zwischen 0 und 225 handelt:CHR(65) = A |
Erfordert einen anderen Funktionsnamen. | CHAR |
Cloud SQL for MySQL verwendet für dieselbe Funktionalität die Funktion CHAR . Daher müssen Sie den Funktionsnamen ändern:CHAR(65) = A |
LENGTH |
Gibt die Länge eines bestimmten Strings zurück:LENGTH('MySQL') = 5 |
Ja | LENGTH |
LENGTH('MySQL') = 5 |
REGEXP_REPLACE |
Sucht in einem String nach einem Muster eines regulären Ausdrucks:REGEXP_REPLACE('John', '[hn].', 'e') = Joe |
Nein | – | Wird ab MySQL-Version 8 unterstützt. Verwenden Sie als Behelfslösung nach Möglichkeit die Funktion REPLACE oder verschieben Sie die Logik in die Anwendungsebene. |
REGEXP_SUBSTR |
Erweitert die Funktionalität der Funktion SUBSTR , indem in einem String nach einem Muster eines regulären Ausdrucks gesucht wird:
REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?')
=
https://console.cloud.google.com/
|
Nein | – | Wird ab MySQL-Version 8 unterstützt. Verwenden Sie als Behelfslösung nach Möglichkeit die Funktion SUBSTR oder verschieben Sie die Logik in die Anwendungsebene. |
REGEXP_COUNT |
Gibt zurück, wie häufig ein Muster in einem Quellstring vorkommt. | Nein | – | Für Cloud SQL for MySQL ist keine entsprechende Funktion verfügbar. Verschieben Sie diese Logik in die Anwendungsebene. |
REGEXP_INSTR |
Durchsucht eine Stringposition (Index) nach einem Muster eines regulären Ausdrucks. | Nein | – | Wird ab MySQL-Version 8 unterstützt. Wenn Sie eine ältere Version verwenden, verschieben Sie diese Logik in die Anwendungsebene. |
REVERSE |
Gibt den umgekehrten String für einen bestimmten String zurück:
REVERSE('MySQL')
= LQSyM
|
Ja | REVERSE |
REVERSE('MySQL')
= LQSyM
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen numerische Funktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
ABS |
Gibt den absoluten Wert einer bestimmten Zahl zurück:ABS(-4.6) = 4.6 |
Ja | ABS |
ABS(-4.6) = 4.6 |
CEIL |
Gibt die kleinste Ganzzahl zurück, die größer oder gleich der angegebenen Zahl ist:CEIL(21.4) = 22 |
Ja | CEIL |
CEIL(21.4) = 22 |
FLOOR |
Gibt die größte Ganzzahl zurück, die kleiner oder gleich der angegebenen Zahl ist:FLOOR(-23.7) = -24 |
Ja | FLOOR |
FLOOR(-23.7) = -24 |
MOD |
Gibt den Rest von m geteilt durch n zurück:MOD(10, 3) = 1 |
Ja | MOD |
MOD(10, 3) = 1 |
ROUND |
Gibt n zurück, gerundet auf Ganzzahlen rechts vom Dezimalzeichen:ROUND(1.39, 1) = 1.4 |
Ja | ROUND |
ROUND(1.39, 1) = 1.4 |
TRUNC (Zahl) |
Gibt n1 zurück, abgeschnitten auf n2 Dezimalstellen. Der zweite Parameter ist optional.
TRUNC(99.999) = 99
TRUNC(99.999, 0) = 99
|
Erfordert einen anderen Funktionsnamen. | TRUNCATE (Zahl) |
Die Funktion von Cloud SQL for MySQL hat einen anderen Namen und der zweite Parameter ist obligatorisch.TRUNCATE(99.999, 0) = 99 |
In der folgenden Tabelle wird beschrieben, in welchen Fällen datetime
-Funktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
SYSDATE |
Gibt das aktuelle Datum und die aktuelle Uhrzeit für das Betriebssystem zurück, auf dem sich der Datenbankserver befindet:
SELECT SYSDATE
FROM DUAL;
= 31-JUL-2019
|
Ja | SYSDATE() |
Das
SELECT SYSDATE()
FROM DUAL;
= 2019-01-31 10:01:01.0
Sie können das |
SYSTIMESTAMP |
Gibt das Systemdatum zurück, einschließlich Sekundenbruchteilen und Zeitzone:
SELECT SYSTIMESTAMP FROM DUAL
= 01-JAN-19 07.37.11.622187000 AM +00:00
|
Erfordert einen anderen Funktionsnamen. |
CURRENT_
TIMESTAMP
|
Die Funktion von Cloud SQL for MySQL gibt standardmäßig ein anderes datetime -Format zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
SELECT CURRENT_TIMESTAMP
FROM DUAL;
= 2019-01-31 06:55:07
|
LOCAL_
TIMESTAMP
|
Gibt das aktuelle Datum und die aktuelle Uhrzeit als Typ TIMESTAMP zurück:
SELECT LOCALTIMESTAMP
FROM DUAL
= 01-JAN-19 10.01.10.123456 PM
|
Gibt ein anderes datetime -Format zurück. |
LOCAL_
TIMESTAMP
|
Die Funktion von Cloud SQL for MySQL gibt ein anderes datetime -Format als das Standardformat für Oracle zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
SELECT LOCAL_TIMESTAMP
FROM DUAL
= 2019-01-01 10:01:01.0
|
CURRENT_DATE |
Gibt das aktuelle Datum zurück:
SELECT CURRENT_DATE
FROM DUAL
= 31-JAN-19
|
Gibt ein anderes datetime -Format zurück. |
CURRENT_
DATE
|
Die Funktion von Cloud SQL for MySQL gibt ein anderes datetime -Format zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
SELECT CURRENT_DATE
FROM DUAL
= 2019-01-31
|
CURRENT_
TIMESTAMP
|
Gibt das aktuelle Datum und die aktuelle Uhrzeit zurück:
SELECT CURRENT_TIMESTAMP
FROM DUAL
= 31-JAN-19 06.54.35.543146 AM +00:00
|
Gibt ein anderes datetime -Format zurück. |
CURRENT_
TIMESTAMP
|
Die Funktion von Cloud SQL for MySQL gibt ein anderes datetime -Format zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
SELECT CURRENT_TIMESTAMP
FROM DUAL
= 2019-01-31 06:55:07
|
ADD_MONTHS |
Gibt das Datum plus ganzzahlige Monate zurück:
ADD_MONTHS(SYSDATE, 1)
= 31-JAN-19
|
Erfordert einen anderen Funktionsnamen. | ADDDATE |
Die Funktion von Cloud SQL for MySQL gibt ein anderes datetime -Format zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
ADDDATE(SYSDATE(), 1)
= 2019-08-01 06:42:49.0
|
EXTRACT (Datumsteil) |
Gibt den Wert eines datetime -Felds basierend auf einem Intervallausdruck zurück:
EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
|
Ja | EXTRACT (Datumsteil) |
EXTRACT(YEAR FROM DATE '2019-01-31')
= 2019
|
LAST_DAY |
Gibt den letzten Tag des Monats für ein bestimmtes Datum zurück:
LAST_DAY('01-JAN-2019')
= 31-JAN-19
|
Teilweise | LAST_DAY |
Die Funktion von Cloud SQL for MySQL gibt ein anderes datetime -Format als das Standardformat für Oracle zurück. Verwenden Sie die Funktion DATE_FORMAT() , um die Ausgabe neu zu formatieren.
LAST_DAY('2019-01-01')
= 2019-01-31
|
MONTH_
BETWEEN
|
Gibt die Anzahl der Monate zwischen den angegebenen Daten date1 und date2 :
MONTHS_BETWEEN(
SYSDATE, SYSDATE-60)
= 1.96
zurück: |
Teilweise |
PERIOD_DIFF
|
Die PERIOD_DIFF -Funktion von Cloud SQL for MySQL gibt die Differenz in Monaten zwischen zwei Zeitpunkten im Format YYMM oder YYYYMM als Ganzzahl zurück:
PERIOD_DIFF(
'201903', '201901')
= 2
|
TO_CHAR (Datetime) |
Wandelt eine Zahl, datetime , oder einen Zeitstempeltyp in einen String-Typ um:
TO_CHAR(
SYSDATE,'DD-MM-YYYY HH24:MI:SS')
= 01-01-2019 10:01:01
|
Erfordert einen anderen Funktionsnamen. | DATE_FORMAT |
Die DATE_FORMAT -Funktion von Cloud SQL for MySQL formatiert einen Datumswert gemäß einem Formatstring:
DATE_FORMAT(
SYSDATE(),'%d-%m-%Y %H:%i:%s')
01-01-2019 10:01:01
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen Codierungs- und Decodierungsfunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
DECODE |
Vergleicht den Ausdruck anhand der Funktionalität einer IF-THEN-ELSE -Anweisung einzeln mit jedem Suchwert. |
Nein | CASE |
Verwenden Sie für eine ähnliche Funktionalität die CASE -Anweisung von Cloud SQL for MySQL. |
DUMP |
Gibt einen VARCHAR2 -Wert zurück, der den Datentypcode, die Länge in Byte und die interne Darstellung des Ausdrucks enthält. |
Nein | – | Nicht unterstützt |
ORA_HASH |
Berechnet einen Hash-Wert für einen bestimmten Ausdruck. | Nein | MD5 or SHA |
Verwenden Sie die Funktion MD5 für 128-Bit-Prüfsummen oder die Funktion SHA für 160-Bit-Prüfsummen. |
In der folgenden Tabelle wird beschrieben, in welchen Fällen Konvertierungsfunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
CAST |
Konvertiert einen integrierten Datentyp oder Sammlungstypwert in einen anderen integrierten Datentyp oder Sammlungstypwert:
CAST('1' as int) + 1
= 2
|
Teilweise | CAST |
Je nachdem, ob eine explizite oder implizite Konvertierung erforderlich ist, muss eine Anpassung erfolgen:
CAST('1' AS SIGNED) + 1
= 2
|
CONVERT |
Wandelt einen Zeichenstring von einem Zeichensatz in einen anderen um:
CONVERT (
'Ä Ê Í Õ Ø A B C D E ', 'US7ASCII', 'WE8ISO8859P1')
= ?? ?? ?? A B C
|
Teilweise | CONVERT |
Die CONVERT -Funktion von Cloud SQL for MySQL erfordert einige Anpassungen der Syntax und der Parameter:
CONVERT(
'Ä Ê Í A B C ' USING utf8)
= Ä Ê Í A B C
|
TO_CHAR (String/Zahl) |
Die Funktion konvertiert eine Zahl oder ein Datum in einen String:
TO_CHAR(22.73,'$99.9')
= $22.7
|
Nein | FORMAT |
Die FORMAT -Funktion von Cloud SQL for MySQL konvertiert eine Zahl in ein Format wie #,###,###.## , rundet sie auf eine Dezimalstelle und gibt dann das Ergebnis als String zurück:
CONCAT('$',
FORMAT(22.73, 1))
= $22.7
|
TO_DATE |
Die TO_DATE -Funktion von Oracle wandelt einen String basierend auf dem datetimecode -Format in ein Datum um:
TO_DATE(
'2019/01/01', 'yyyy-mm-dd')
= 01-JAN-2019
|
Erfordert einen anderen Funktionsnamen. | STR_TO_DATE |
Die STR_TO_DATE -Funktion von Cloud SQL for MySQL nimmt einen String und gibt ein Datum basierend auf dem datetime -Format zurück:
STR_TO_DATE(
'2019/01/01', '%Y/%m/%d')
= 2019-01-01
|
TO_NUMBER |
Wandelt den Ausdruck in einen Wert des Datentyps NUMBER um:
TO_NUMBER('01234')
= 1234
|
Erfordert einen anderen Funktionsnamen. | CAST |
Verwenden Sie die CAST -Funktion von Cloud SQL for MySQL, um dasselbe Ergebnis wie bei der TO_NUMBER -Funktion von Oracle zurückzugeben:
CAST('01234' as SIGNED)
= 1234
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen bedingte SELECT
-Funktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
CASE |
Bei der Anweisung CASE wird aus einer Reihe von Bedingungen eine Auswahl getroffen und eine entsprechende Anweisung mit der folgenden Syntax ausgeführt:
CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
Ja | CASE |
Zusätzlich zur Funktion CASE unterstützt Cloud SQL for MySQL die Verwendung der bedingten IF/ELSE -Verarbeitung in der Anweisung SELECT :
CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen Nullfunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
COALESCE |
Gibt den ersten Nicht-Null-Ausdruck in der Ausdrucksliste zurück:
COALESCE(
null, '1', 'a')
= a
|
Ja | COALESCE |
COALESCE(
null, '1', 'a')
= 1
|
NULLIF |
Führt einen Vergleich zwischen expression1 und expression2 durch. Wenn die Werte gleich sind, gibt die Funktion null zurück.
Wenn sie nicht gleich sind, gibt die Funktion expression1 zurück:
NULLIF('1', '2')
= a
|
Ja | NULLIF |
NULLIF('1', '2')
= a
|
NVL |
Ersetzt einen null -Wert in den Ergebnissen einer Abfrage durch einen String:
NVL(null, 'a')
= a
|
Nein | IFNULL |
IFNULL(null, 'a')
= a
|
NVL2 |
Bestimmt den von einer Abfrage zurückgegebenen Wert basierend darauf, ob ein Ausdruck null ist oder nicht. | Nein | CASE |
Bei der Anweisung CASE wird aus einer Reihe von Bedingungen eine Auswahl getroffen und eine entsprechende Anweisung ausgeführt:
CASE WHEN condition THEN result
[WHEN ...] [ELSE result]
END
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen Umgebungs- und Kennungsfunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
SYS_GUID |
Generiert eine global eindeutige Kennung (RAW -Wert), die aus 16 Byte besteht:
SELECT SYS_GUID()
FROM DUAL
=
8EFA4A31468B4C6DE05011AC0200009E
|
Nein | REPLACE und UUID |
Verwenden Sie als Behelfslösung die Funktionen REPLACE und UUID , um die Funktion SYS_GUID zu simulieren:
REPLACE(
UUID(), '-', '')
|
UID |
Gibt eine Ganzzahl zurück, mit der der Sitzungsnutzer (der angemeldete Nutzer) eindeutig identifiziert werden kann:
SELECT UID FROM DUAL
= 43
|
Nein | – | – |
USER |
Gibt den Nutzernamen des Nutzers zurück, der mit der aktuellen Sitzung verbunden ist:
SELECT USER FROM DUAL
= username
|
Ja | USER + INSTR + SUBSTR |
Die USER -Funktion von Cloud SQL for MySQL gibt den Nutzernamen und den Hostnamen (root@IP_ADDRESS ) für die Verbindung zurück. Wenn Sie nur den Nutzernamen abrufen möchten, verwenden Sie die zusätzlichen unterstützenden Funktionen:
SELECT
SUBSTR(USER(), 1, INSTR(USER(), '@') -1) FROM DUAL
= root
|
USERENV |
Gibt Informationen zur aktuellen Oracle-Sitzung zurück, z. B. die Sprache der Sitzung:
SELECT USERENV('LANGUAGE')
FROM DUAL
= ENGLISH_AMERICA.
AL32UTF8
|
Nein |
SHOW SESSION
VARIABLES
|
Die SHOW SESSION VARIABLES -Anweisung von Cloud SQL for MySQL gibt die Einstellungen für die aktuelle Sitzung zurück:
SHOW SESSION VARIABLES LIKE '%collation%';
= utf8_general_ci
|
ROWID |
Oracle weist jeder Zeile einer Tabelle eine eindeutige ROWID zu, damit die Zeile in der Tabelle identifiziert werden kann. ROWID ist die Adresse der Zeile, die die Datenobjektnummer, den Datenblock der Zeile, die Zeilenposition und die Datendatei enthält. |
Teilweise | – |
ROW_NUMBER() ist ab MySQL 8.0 verfügbar. Wenn Sie eine frühere Version verwenden, emulieren Sie dieselbe Funktionalität mithilfe der Sitzungsvariablen @row_number . |
ROWNUM |
Gibt eine Zahl zurück, die die Reihenfolge darstellt, in der eine Zeile von einer Oracle-Tabelle zurückgegeben wird. | Teilweise | – | ROW_NUMBER() ist ab MySQL 8.0 verfügbar. Wenn Sie eine frühere Version verwenden, emulieren Sie dieselbe Funktionalität mithilfe der Sitzungsvariablen @row_number . |
In der folgenden Tabelle wird beschrieben, in welchen Fällen Aggregat-(Gruppen-)funktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechnung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
AVG |
Gibt den Durchschnittswert einer Spalte oder eines Ausdrucks zurück. | Ja | AVG |
Entsprechung zu Oracle |
COUNT
|
Gibt die Anzahl der von einer Abfrage zurückgegebenen Zeilen zurück. | Ja | COUNT |
Entsprechung zu Oracle |
COUNT
(DISTINCT)
|
Gibt die Anzahl der eindeutigen Werte in der Spalte oder im Ausdruck zurück. | Ja |
COUNT
(DISTINCT)
|
Entsprechung zu Oracle |
MAX |
Gibt den Höchstwert einer Spalte oder eines Ausdrucks zurück. | Ja | Entsprechung zu Oracle | |
MIN |
Gibt den Mindestwert einer Spalte oder eines Ausdrucks zurück. | Ja | MIN |
Entsprechung zu Oracle |
SUM |
Gibt die Summe eines Werts einer Spalte oder eines Ausdrucks zurück. | Ja | SUM |
Entsprechung zu Oracle |
LISTAGG |
Sortiert die Daten innerhalb jeder Gruppe, die in der ORDER BY -Klausel angegeben ist, und verkettet die Werte der Messwertspalte:
SELECT LISTAGG(
DEPARTMENT_NAME, ', ')
WITHIN GROUP
(ORDER BY DEPARTMENT_NAME) DEPT
FROM DEPARTMENTS;
-- Single line results
= Accounting, Administration, Benefits, Construction
|
Erfordert einen anderen Funktionsnamen und eine andere Syntax. |
GROUP_
CONCAT
|
Verwenden Sie die GROUP_CONCAT -Funktion von Cloud SQL for MySQL, um gleichwertige Ergebnisse zurückzugeben:
SELECT GROUP_CONCAT(
DEPARTMENT_NAME ORDER BY DEPARTMENT_NAME SEPARATOR ', ') DEPT
FROM DEPARTMENTS;
-- Single line results
= Accounting, Administration, Benefits, Construction
|
In der folgenden Tabelle wird beschrieben, in welchen Fällen die FETCH
-Funktion von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar ist.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion | Umsetzung in Cloud SQL for MySQL |
---|---|---|---|---|
FETCH |
Ruft eine bestimmte Anzahl von Zeilen aus der Ergebnismenge einer mehrzeiligen Abfrage ab:
SELECT * FROM
EMPLOYEES
FETCH FIRST 10 ROWS ONLY;
|
Ja | LIMIT |
Verwenden Sie die MySQL-Klausel LIMIT , um Zeilen aus einer Abfrage abzurufen:
SELECT * FROM
EMPLOYEES
LIMIT 10;
|
Grundlegende Filter, Operatoren und Unterabfragen
Grundlegende Filter, Operatorenfunktionen und Unterabfragen lassen sich relativ einfach umwandeln. Der Aufwand ist minimal. Der Großteil des Aufwands fällt bei der Konvertierung von Datumsformaten an, da Oracle und Cloud SQL for MySQL für das Datum unterschiedliche Standardformate verwenden:
- Die
SYSDATE
-Funktion von Oracle gibt standardmäßig dieses Format zurück:01-AUG-19
. - Die
SYSDATE()
-Funktion von Cloud SQL for MySQL gibt standardmäßig dieses Format zurück:2019-08-01 12:04:05
.
Verwenden Sie zum Festlegen von Datums- und Uhrzeitformaten die MySQL-Funktionen DATE_FORMAT
oder STR_TO_DATE
.
In der folgenden Tabelle wird beschrieben, in welchen Fällen grundlegende Filter-, Operatoren- und Unterabfragefunktionen von Oracle und Cloud SQL for MySQL nach Name und Funktionalität vergleichbar sind und wann eine Konvertierung empfohlen wird.
Oracle-Funktion | Umsetzung in Oracle | Cloud SQL for MySQL-Entsprechung | Cloud SQL for MySQL-Funktion |
---|---|---|---|
EXISTS/
NOT EXISTS
|
Ja |
EXISTS/
NOT EXISTS
|
SELECT * FROM DEPARTMENTS D
WHERE EXISTS (SELECT 1
FROM EMPLOYEES E
WHERE
E.DEPARTMENT_ID =
D.DEPARTMENT_ID);
|
IN/NOT IN |
Ja | IN/NOT IN |
SELECT * FROM DEPARTMENTS D
WHERE DEPARTMENT_ID IN
(SELECT DEPARTMENT_ID
FROM EMPLOYEES E);
-- OR
SELECT * FROM EMPLOYEES
WHERE (EMPLOYEE_ID, DEPARTMENT_ID)
IN((100, 90));
|
LIKE/NOT LIKE |
Ja | LIKE/NOT LIKE |
SELECT * FROM EMPLOYEES
WHERE FIRST_NAME LIKE '_e_n%';
|
BETWEEN/
NOT BETWEEN
|
Ja |
BETWEEN/
NOT BETWEEN
|
SELECT * FROM EMPLOYEES
WHERE EXTRACT(YEAR FROM HIRE_DATE)
NOT BETWEEN 2001 and 2004;
|
AND/OR |
Ja | AND/OR |
SELECT * FROM EMPLOYEES
WHERE DEPARTMENT_ID IN(100, 101)
AND (SALARY >= 1000 OR HIRE_DATE <= '2006-02-05');
|
SubQuery |
Ja | SubQuery |
Cloud SQL for MySQL unterstützt Unterabfragen in der Klausel SELECT , in der Klausel JOIN und zum Filtern in den WHERE/AND -Klauseln:
-- SELECT Subquery
SELECT D.DEPARTMENT_NAME,
(SELECT AVG(SALARY) AS AVG_SAL
FROM EMPLOYEES E
WHERE E.DEPARTMENT_ID =
D.DEPARTMENT_ID) AVG_SAL
FROM DEPARTMENTS D;
-- JOIN Subquery
SELECT FIRST_NAME, LAST_NAME, SALARY
FROM EMPLOYEES E JOIN
(SELECT *
FROM DEPARTMENTS
WHERE LOCATION_ID = 2700) D
ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
-- Filtering Subquery
SELECT FIRST_NAME,
LAST_NAME,
SALARY
FROM EMPLOYEES
WHERE SALARY < (SELECT AVG(SALARY)
FROM EMPLOYEES);
|
Operatoren | Ja | Operatoren | Cloud SQL for MySQL unterstützt alle grundlegenden Operatoren:> | >= | < | <= | = | <> | != |
Best Practices für Cloud SQL for MySQL-Abfragen
Damit die Leistung von Cloud SQL for MySQL und Oracle vergleichbar bleibt, müssen Sie möglicherweise Ihre Abfragen optimieren. Zu diesen Optimierungen gehören das Ändern der Indexstrukturen und das Anpassen des Datenbankschemas. Dieser Abschnitt enthält einige Richtlinien, mit denen Sie in Cloud SQL for MySQL eine vergleichbare Abfrageleistung erreichen können.
Einen geclusterten Index erstellen
Bei Verwendung des Speichermoduls InnoDB empfiehlt es sich, eine Tabelle mit einem Primärschlüssel zu definieren, da dieser Schlüssel einen geclusterten Index für diese Tabelle erstellt. Mit diesem Ansatz können Sie nicht nur die Abfrageleistung verbessern, sondern auch zusätzliche sekundäre Indexe erstellen. Sie sollten es jedoch vermeiden, zu viele Indexe zu erstellen. Sind redundante Indexe vorhanden, verbessert sich die Leistung nicht und die DML-Ausführung erfolgt langsamer. Diese Best Practice führt zu einer zweiten Best Practice: Suchen Sie regelmäßig nach redundanten Indexen. Sind redundante Indexe vorhanden, löschen Sie diese aus der Datenbank.
Verwenden Sie die folgende Abfrage, um Tabellen ohne Primärschlüssel zu identifizieren, sodass Sie Primärschlüssel für sie erstellen können:
mysql> SELECT t.table_schema, t.table_name
FROM information_schema.tables t LEFT JOIN
information_schema.statistics s
ON t.table_schema=s.table_schema AND t.table_name=s.table_name
AND s.non_unique=0
WHERE s.table_name IS NULL
AND t.table_schema NOT IN('sys', 'information_schema', 'mysql',
'performance_schema')
AND t.`TABLE_TYPE` <> 'VIEW';
Verwenden Sie die folgende Abfrage, um nach Tabellen ohne Indexe zu suchen, sodass Sie Indexe für sie erstellen können:
mysql> SELECT t.table_schema, t.table_name FROM INFORMATION_SCHEMA.tables t
WHERE table_name NOT IN
(SELECT table_name FROM (
SELECT table_name, index_name
FROM information_schema.statistics
GROUP BY table_name, index_name) tab_ind_cols
GROUP BY table_name)
AND table_schema NOT IN('sys', 'information_schema', 'mysql', 'performance_schema')
AND TABLE_TYPE <> 'VIEW';
Verwenden Sie die folgende Abfrage, um nach redundanten Indexen zu suchen, damit Sie die Redundanzen entfernen können:
mysql> SELECT * FROM sys.schema_redundant_indexes;
Suchparameter anpassen
Zum Optimieren der Abfrageleistung müssen Sie möglicherweise die Sitzungsparameter anpassen. Cloud SQL for MySQL verfügt über eine Reihe von Flags, die Sie zu diesem Zweck ändern können, einschließlich der folgenden Flags:
- InnoDB-bezogene Parameter
SORT
ParameterJOIN
Parameter- Parameter für die Cache-Verarbeitung
Abfragen beobachten
Abfragen mit langsamer Ausführung können dazu führen, dass das System nicht mehr reagiert oder andere Engpässe auftreten. Daher ist es wichtig, Abfragen regelmäßig zu beobachten.
Es gibt mehrere Möglichkeiten, langsam ausgeführte SQL-Anweisungen zu diagnostizieren:
- Verwenden Sie das Dashboard von Cloud SQL for MySQL, um Echtzeit- und Verlaufsinformationen zu langsam ausgeführten Abfragen zu erhalten.
- Verwenden Sie Cloud Monitoring, um das Log von Cloud SQL for MySQL für langsame Abfragen im Blick zu behalten.
Verwenden Sie die Ansicht
statement_analysis
von Cloud SQL for MySQL, um die Laufzeitstatistiken zu einer SQL-Anweisung aufzurufen:mysql> SELECT * FROM sys.statement_analysis;
Cloud SQL for MySQL-Abfragen analysieren
Das Tool zur Abfrageoptimierung in Cloud SQL for MySQL generiert einen Ausführungsplan für die Anweisungen SELECT
, INSERT
, UPDATE
und DELETE
. Diese Pläne sind hilfreich, wenn Sie eine langsam ausgeführte Abfrage anpassen. Dabei müssen einige Aspekte berücksichtigt werden:
- Ausführungspläne sind keine Datenbankobjekte, die migriert werden müssen. Sie sind vielmehr ein Tool zum Analysieren von Leistungsunterschieden zwischen Oracle und Cloud SQL for MySQL, die dieselbe Anweisung für identische Datasets ausführen.
- Cloud SQL for MySQL unterstützt nicht die gleiche Syntax, Funktionalität oder Ausgabe des Ausführungsplans wie Oracle.
Hier ist ein Beispielplan, der die Unterschiede zwischen einem Ausführungsplan von Oracle und einem Ausführungsplan von Cloud SQL for MySQL veranschaulicht:
SQL> EXPLAIN PLAN FOR
SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105;
SQL> SELECT * FROM TABLE(DBMS_XPLAN.DISPLAY (FORMAT=>'ALL +OUTLINE'));
Plan hash value: 1833546154
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
---------------------------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 1 | 69 | 1 (0)| 00:00:01 |
| 1 | TABLE ACCESS BY INDEX ROWID| EMPLOYEES | 1 | 69 | 1 (0)| 00:00:01 |
|* 2 | INDEX UNIQUE SCAN | EMP_EMP_ID_PK | 1 | | 0 (0)| 00:00:01 |
---------------------------------------------------------------------------------------------
mysql> EXPLAIN SELECT * FROM EMPLOYEES WHERE EMPLOYEE_ID = 105;
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | Extra |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
| 1 | SIMPLE | EMPLOYEES | NULL | const | PRIMARY | PRIMARY | 3 | const | 1 | 100.00 | NULL |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+
Gespeicherte Verfahren und Trigger optimieren
Im Gegensatz zu Oracle werden gespeicherte Verfahren und Funktionen von Cloud SQL for MySQL bei jeder Ausführung geparst. Ein hilfreiches Tool zum Benchmarking von gespeicherten Verfahren und Funktionen ist das BENCHMARK()
-Dienstprogramm von MySQL.
Dieses Tool nimmt zwei Parameter, einen Iterationszähler sowie einen Ausdruck und erstellt eine Schätzung der Laufzeit des angegebenen Ausdrucks (z. B. gespeicherte Verfahren, Funktionen und die Anweisung SELECT
). Die Ausgabe stellt die ungefähre Gesamtlaufzeit über alle Iterationen dar.
Das folgende Beispiel dient zur Veranschaulichung des BENCHMARK()
-Dienstprogramms:
-- SELECT Expression Example
mysql> select benchmark(10000000, 'select sysdate()');
+-----------------------------------------+
| benchmark(10000000, 'select sysdate()') |
+-----------------------------------------+
| 0 |
+-----------------------------------------+
1 row in set (0.12 sec)
-- Result: Run time of 0.12 sec for 1,0000,000 iterations
-- FUNCTION Example
mysql> select benchmark(1000000, func1());
+-----------------------------+
| benchmark(1000000, func1()) |
+-----------------------------+
| 0 |
+-----------------------------+
1 row in set (2.54 sec)
-- Result: Run time of 2.54 sec for 1,000,000 iterations
Wenn Sie während der Konvertierung einen Leistungsrückgang feststellen, können Sie mit dem MySQL-Befehl EXPLAIN
mögliche Faktoren ermitteln, die zu diesem Rückgang beitragen. Eine gängige Lösung für eine schwache Leistung besteht darin, die Struktur eines Tabellenindexes an das MySQL-Optimierungstool anzupassen. Eine weitere gängige Vorgehensweise besteht darin, einen konvertierten PL/SQL-Code zu optimieren, indem unnötige Datenabrufe reduziert oder im prozessualen MySQL-Code temporäre Tabellen verwendet werden.
Nächste Schritte
- Weitere Informationen zu MySQL-Nutzerkonten lesen.
- Referenzarchitekturen, Diagramme und Best Practices zu Google Cloud kennenlernen. Weitere Informationen zu Cloud Architecture Center