Convertendo e otimizando consultas do Oracle Database para Cloud SQL para MySQL

Este documento discute as diferenças básicas de consulta entre Oracle® e Cloud SQL para MySQL e como os recursos do Oracle são mapeados para recursos do Cloud SQL para MySQL. Ele também descreve considerações de desempenho do Cloud SQL para MySQL e maneiras de analisar e otimizar o desempenho de consultas emGoogle Cloud. Embora este documento aborde técnicas para otimizar procedimentos armazenados e acionadores do Cloud SQL para MySQL, ele não aborda como traduzir o código PL/SQL em procedimentos e funções armazenados do MySQL.

Ao converter consultas do Oracle Database para Cloud SQL para MySQL, há certas diferenças de dialeto SQL a serem consideradas. Existem também várias funções integradas que são diferentes ou incompatíveis entre as duas plataformas de banco de dados.

Diferenças básicas de consulta

Embora o Oracle e o Cloud SQL para MySQL sejam compatíveis com ANSI SQL, há diversas diferenças fundamentais ao consultar dados, principalmente em relação ao uso de funções do sistema.

A tabela a seguir destaca as diferenças na sintaxe SELECT e FROM para Oracle e Cloud SQL para MySQL.

Nome do recurso Oracle Implementação Oracle Suporte do Cloud SQL para MySQL Equivalente do Cloud SQL para MySQL
Sintaxe básica SQL para recuperação de dados SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
Sim SELECT
FROM
WHERE
GROUP BY
HAVING
ORDER BY
SELECT para impressão de saída SELECT 1 FROM DUAL Sim SELECT 1
ou
SELECT 1 FROM DUAL
Aliases de coluna SELECT COL1 AS C1 Sim SELECT COL1 AS C1
ou
SELECT COL1 C1
Sensibilidade de maiúsculas e minúsculas no nome da tabela Sem distinção entre maiúsculas e minúsculas (por exemplo, o nome da tabela pode ser orders e ORDERS ) Não Diferencia maiúsculas de minúsculas de acordo com o nome da tabela definida (por exemplo, o nome da tabela pode ser apenas orders ou ORDERS )

Visualizações embutidas

As visualizações embutidas (também conhecidas como tabelas derivadas) são instruções SELECT , localizadas na cláusula FROM e usadas como uma subconsulta. As visualizações embutidas podem ajudar a simplificar consultas complexas, removendo cálculos compostos ou eliminando operações de junção, ao mesmo tempo em que condensam diversas consultas separadas em uma única consulta simplificada.

O exemplo a seguir descreve um exemplo de conversão do Oracle 11g/12c para Cloud SQL para MySQL para uma visualização in-line.

Uma visualização embutida no Oracle 11g/12c:

 SELECT FIRST_NAME,
            DEPARTMENT_ID,
            SALARY,
            DATE_COL
     FROM EMPLOYEES,
          (SELECT SYSDATE AS DATE_COL FROM DUAL);

Uma visualização funcional no Cloud SQL para MySQL 5.7 com um alias:

SELECT FIRST_NAME,
              DEPARTMENT_ID,
              SALARY,
              DATE_COL
       FROM EMPLOYEES, (SELECT SYSDATE() AS DATE_COL FROM DUAL) AS A1;

Junta-se

Os tipos de junção da Oracle são compatíveis com o Cloud SQL para MySQL, exceto FULL JOIN . As junções do Cloud SQL para MySQL são compatíveis com o uso de sintaxe alternativa, como a cláusula USING , a cláusula WHERE em vez da cláusula ON e o SUBQUERY na instrução JOIN .

A tabela a seguir mostra um exemplo de conversão JOIN .

Tipo de JOIN do Oracle Suporte do Cloud SQL para MySQL Sintaxe JOIN Cloud SQL para MySQL
INNER JOIN Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
CROSS JOIN Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E CROSS JOIN DEPARTMENTS D
FULL JOIN Não Considere usar UNION com LEFT e 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 ] Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E LEFT JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
RIGHT JOIN [ OUTER ] Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E RIGHT JOIN DEPARTMENTS D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;
SUBQUERY Sim SELECT E.FIRST_NAME, D.DEPARTMENT_NAME FROM EMPLOYEES E JOIN (SELECT * FROM DEPARTMENTS)D ON E.DEPARTMENT_ID = D.DEPARTMENT_ID;

Embora o Cloud SQL para MySQL seja compatível com as funções UNION e UNION ALL , ele não é compatível com as funções INTERSECT e MINUS da Oracle:

  • UNION anexa os conjuntos de resultados de duas instruções SELECT após eliminar registros duplicados.
  • UNION ALL anexa os conjuntos de resultados de duas instruções SELECT sem eliminar registros duplicados.
  • INTERSECT retorna a interseção de duas instruções SELECT , somente se existir um registro nos conjuntos de resultados de ambas as consultas.
  • MINUS compara duas ou mais instruções SELECT , retornando apenas linhas distintas da primeira consulta que não são retornadas pela segunda consulta.

A tabela a seguir mostra alguns exemplos de conversão de Oracle para Cloud SQL para MySQL.

Função Oráculo Implementação Oracle Suporte do Cloud SQL para MySQL Equivalente do Cloud SQL para MySQL
UNION SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
Sim SELECT COL1 FROM TBL1
UNION
SELECT COL1 FROM TBL2
UNION ALL SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
Sim SELECT COL1 FROM TBL1
UNION ALL
SELECT COL1 FROM TBL2
INTERSECT SELECT COL1 FROM TBL1
INTERSECT
SELECT COL1 FROM TBL2
Não SELECT COL1 FROM TBL1
WHERE COL1 IN
(SELECT COL1 FROM TBL2)
MINUS SELECT COL1 FROM TBL1
MINUS
SELECT COL1 FROM TBL2
Não SELECT A.COL1 FROM TBL1 A LEFT JOIN TBL2 B ON USING(COL1) WHERE B.COL1 IS NULL

Funções escalares e de grupo

O Cloud SQL para MySQL fornece uma lista extensa de funções escalares (linha única) e de agregação. Algumas funções do Cloud SQL para MySQL são semelhantes às funções equivalentes do Oracle (por nome e funcionalidade ou com um nome diferente, mas com funcionalidade semelhante). Embora algumas funções do Cloud SQL para MySQL possam ter nomes idênticos aos de suas contrapartes do Oracle, elas também podem exibir funcionalidades diferentes.

A tabela a seguir descreve onde as funções de caracteres do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
CONCAT Retorna a primeira string concatenada com a segunda string:
CONCAT('A', 1) = A1
Sim CONCAT CONCAT('A', 1) = A1
CONCAT USING PIPE FNAME |' '| LNAME Não CONCAT CONCAT(FNAME, ' ', LNAME)
LOWER ou UPPER Retorna a string, com todas as letras em minúsculas ou maiúsculas:
LOWER('SQL') = sql
Sim LOWER ou UPPER LOWER('SQL') = sql
LPAD/RPAD Retorna expression1 , preenchido à esquerda ou à direita até comprimento n caracteres com a sequência de caracteres em expression2 :
LPAD('A',3,'*') = **A
Sim LPAD ou RPAD LPAD('A',3,'*') = **A
SUBSTR Retorna uma parte da string, começando na posição x (neste caso 3), com comprimento y . A primeira posição na string é 1.
SUBSTR('MySQL', 3, 3) = SQL
Sim SUBSTR SUBSTR('MySQL', 3, 3) = SQL
INSTR Retorna a posição (índice) de uma string de uma determinada string:
INSTR('MySQL', 'y') = 2
Sim INSTR INSTR('MySQL', 'y') = 2
REPLACE Retorna uma string com cada ocorrência de uma string de pesquisa substituída por uma string de substituição:
REPLACE('ORADB', 'ORA', 'MySQL') = MySQLDB
Sim REPLACE REPLACE('ORADB', 'ORA', 'MySQL') = MySQLDB
TRIM Corte os caracteres iniciais ou finais (ou ambos) de uma string:
TRIM(both '-' FROM '-MySQL-') = MySQL TRIM(' MySQL ') = MySQL
Sim TRIM TRIM(both '-' FROM '-MySQL-') = MySQL TRIM(' MySQL ') = MySQL
LTRIM/RTRIM Remove do lado esquerdo ou direito de uma string todos os caracteres que aparecem na pesquisa:
LTRIM(' MySQL', ' ') = MySQL
Parcialmente LTRIM or RTRIM As funções Oracle LTRIM e RTRIM usam um segundo parâmetro que especifica quais caracteres iniciais ou finais devem ser removidos da string. As funções do Cloud SQL para MySQL removem apenas os espaços em branco iniciais e finais da string fornecida:
LTRIM(' MySQL') = MySQL
ASCII Pega um único caractere e retorna seu código numérico ASCII:
ASCII('A') = 65
Sim ASCII ASCII('A') = 65
CHR Retorna o valor do código ASCII, que é um valor numérico de 0 a 225, para um caractere:
CHR(65) = A
Requer um nome de função diferente CHAR O Cloud SQL para MySQL usa a função CHAR para a mesma funcionalidade, portanto, é necessário alterar o nome da função:
CHAR(65) = A
LENGTH Retorna o comprimento de uma determinada string:
LENGTH('MySQL') = 5
Sim LENGTH LENGTH('MySQL') = 5
REGEXP_REPLACE Pesquisa uma string em busca de um padrão de expressão regular:
REGEXP_REPLACE('John', '[hn].', 'e') = Joe
Não N / D Suportado a partir do MySQL versão 8. Como solução alternativa, use a função REPLACE se possível ou mova a lógica para a camada de aplicação.
REGEXP_SUBSTR Estende a funcionalidade da função SUBSTR pesquisando em uma string um padrão de expressão regular:
REGEXP_SUBSTR('https://console.cloud.google.com/sql/instances','https://([[:alnum:]]+\.?){3,4}/?') = https://console.cloud.google.com/
Não N / D Suportado a partir do MySQL versão 8. Como solução alternativa, use a função SUBSTR se possível ou mova a lógica para a camada de aplicação
REGEXP_COUNT Retorna o número de vezes que um padrão ocorre em uma string de origem Não N / D Nenhuma função equivalente disponível para Cloud SQL para MySQL. Mova essa lógica para a camada de aplicação.
REGEXP_INSTR Pesquise uma posição de string (índice) para um padrão de expressão regular Não N / D Suportado a partir da versão 8 do MySQL. Se estiver em uma versão mais antiga, mova esta lógica para a camada de aplicação.
REVERSE Retorna a string invertida para uma determinada string:
REVERSE('MySQL') = LQSyM
Sim REVERSE REVERSE('MySQL') = LQSyM

A tabela a seguir descreve onde as funções numéricas do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
ABS Retorna o valor absoluto de um determinado número:
ABS(-4.6) = 4.6
Sim ABS ABS(-4.6) = 4.6
CEIL Retorna o menor número inteiro maior ou igual ao número fornecido:
CEIL(21.4) = 22
Sim CEIL CEIL(21.4) = 22
FLOOR Retorna o maior número inteiro igual ou menor que o número fornecido:
FLOOR(-23.7) = -24
Sim FLOOR FLOOR(-23.7) = -24
MOD Retorna o resto de m dividido por n :
MOD(10, 3) = 1
Sim MOD MOD(10, 3) = 1
ROUND Retorna n arredondado para casas inteiras à direita da vírgula decimal:
ROUND(1.39, 1) = 1.4
Sim ROUND ROUND(1.39, 1) = 1.4
TRUNC (número) Retorna n1 truncado em n2 casas decimais. O segundo parâmetro é opcional.
TRUNC(99.999) = 99 TRUNC(99.999, 0) = 99
Requer um nome de função diferente TRUNCATE (número) A função Cloud SQL para MySQL tem um nome diferente e o segundo parâmetro é obrigatório.
TRUNCATE(99.999, 0) = 99

A tabela a seguir descreve onde as funções datetime do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
SYSDATE Retorna a data e hora atuais definidas para o sistema operacional no qual reside o servidor de banco de dados:
SELECT SYSDATE FROM DUAL; = 31-JUL-2019
Sim SYSDATE()

SYSDATE() do Cloud SQL para MySQL precisa incluir parênteses e retornar por padrão um formato datetime diferente da função SYSDATE do Oracle:

SELECT SYSDATE() FROM DUAL; = 2019-01-31 10:01:01.0

Você pode alterar o formato datetime no nível da sessão

SYSTIMESTAMP Retorna a data do sistema, incluindo segundos fracionários e fuso horário:
SELECT SYSTIMESTAMP FROM DUAL = 01-JAN-19 07.37.11.622187000 AM +00:00
Requer um nome de função diferente CURRENT_ TIMESTAMP A função Cloud SQL para MySQL retorna um formato datetime diferente por padrão. Para reformatar a saída, use a função DATE_FORMAT() .
SELECT CURRENT_TIMESTAMP FROM DUAL; = 2019-01-31 06:55:07
LOCAL_ TIMESTAMP Retorna a data e hora atuais como um tipo TIMESTAMP :
SELECT LOCALTIMESTAMP FROM DUAL = 01-JAN-19 10.01.10.123456 PM
Retorna um formato datetime diferente LOCAL_ TIMESTAMP A função Cloud SQL para MySQL retorna um formato datetime diferente do formato padrão do Oracle. Para reformatar a saída, use a função DATE_FORMAT() .
SELECT LOCAL_TIMESTAMP FROM DUAL = 2019-01-01 10:01:01.0
CURRENT_DATE Retorna a data atual:
SELECT CURRENT_DATE FROM DUAL = 31-JAN-19
Retorna um formato datetime diferente CURRENT_ DATE A função Cloud SQL para MySQL retorna um formato datetime diferente. Para reformatar a saída, use a função DATE_FORMAT() .
SELECT CURRENT_DATE FROM DUAL = 2019-01-31
CURRENT_ TIMESTAMP Retorna a data e hora atuais:
SELECT CURRENT_TIMESTAMP FROM DUAL = 31-JAN-19 06.54.35.543146 AM +00:00
Retorna um formato datetime diferente CURRENT_ TIMESTAMP A função Cloud SQL para MySQL retorna um formato datetime diferente. Para reformatar a saída, use a função DATE_FORMAT() .
SELECT CURRENT_TIMESTAMP FROM DUAL = 2019-01-31 06:55:07
ADD_MONTHS Retorna a data mais meses inteiros:
ADD_MONTHS(SYSDATE, 1) = 31-JAN-19
Requer um nome de função diferente ADDDATE A função Cloud SQL para MySQL retorna um formato datetime diferente. Para reformatar a saída, use a função DATE_FORMAT() .
ADDDATE(SYSDATE(), 1) = 2019-08-01 06:42:49.0
EXTRACT (parte da data) Retorna o valor de um campo de datetime com base em uma expressão de intervalo:
EXTRACT(YEAR FROM DATE '2019-01-31') = 2019
Sim EXTRACT (parte da data) EXTRACT(YEAR FROM DATE '2019-01-31') = 2019
LAST_DAY Retorna o último dia do mês para uma determinada data:
LAST_DAY('01-JAN-2019') = 31-JAN-19
Parcialmente LAST_DAY A função Cloud SQL para MySQL retorna um formato datetime diferente do formato padrão do Oracle. Para reformatar a saída, use a função DATE_FORMAT() .
LAST_DAY('2019-01-01') = 2019-01-31
MONTH_ BETWEEN Retorna o número de meses entre as datas fornecidas date1 e date2 :
MONTHS_BETWEEN( SYSDATE, SYSDATE-60) = 1.96
Parcialmente PERIOD_DIFF A função PERIOD_DIFF do Cloud SQL para MySQL retorna a diferença em meses como um número inteiro entre dois períodos (formatado como YYMM ou YYYYMM ):
PERIOD_DIFF( '201903', '201901') = 2
TO_CHAR (Datetime) Converte um tipo number, datetime ou timestamp em um tipo string
TO_CHAR( SYSDATE,'DD-MM-YYYY HH24:MI:SS') = 01-01-2019 10:01:01
Requer um nome de função diferente DATE_FORMAT A função DATE_FORMAT do Cloud SQL para MySQL formata um valor de data de acordo com uma string de formato:
DATE_FORMAT( SYSDATE(),'%d-%m-%Y %H:%i:%s') 01-01-2019 10:01:01

A tabela a seguir descreve onde as funções de codificação e decodificação do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
DECODE Compara a expressão com cada valor de pesquisa, um por um, usando a funcionalidade de uma instrução IF-THEN-ELSE Não CASE Use a instrução CASE do Cloud SQL para MySQL para obter funcionalidades semelhantes
DUMP Retorna um valor VARCHAR2 contendo o código do tipo de dados, comprimento em bytes e representação interna da expressão Não N / D Não compatível
ORA_HASH Calcula um valor hash para uma determinada expressão Não MD5 or SHA Use a função MD5 para somas de verificação de 128 bits ou a função SHA para somas de verificação de 160 bits

A tabela a seguir descreve onde as funções de conversão do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
CAST Converte um tipo de dados integrado ou valor digitado em coleção em outro tipo de dados integrado ou valor digitado em coleção:
CAST('1' as int) + 1 = 2
Parcialmente CAST Ajuste dependendo se uma conversão explícita ou implícita é necessária:
CAST('1' AS SIGNED) + 1 = 2
CONVERT Converte uma sequência de caracteres de um conjunto de caracteres para outro:
CONVERT ( 'Ä Ê Í Õ Ø ABCDE ', 'US7ASCII', 'WE8ISO8859P1') = ?? ?? ?? ABC
Parcialmente CONVERT A função CONVERT do Cloud SQL para MySQL requer alguns ajustes na sintaxe e nos parâmetros:
CONVERT( 'Ä Ê Í ABC ' USING utf8) = Ä Ê Í ABC
TO_CHAR (string/numérico) A função converte um número ou data em uma string:
TO_CHAR(22.73,'$99.9') = $22.7
Não FORMAT A função FORMAT do Cloud SQL para MySQL converte um número em um formato como #,###,###.## , arredondando-o para uma casa decimal e retornando o resultado como uma string:
CONCAT('$', FORMAT(22.73, 1)) = $22.7
TO_DATE A função TO_DATE do Oracle converte uma string em uma data com base em um formato datetimecode :
TO_DATE( '2019/01/01', 'yyyy-mm-dd') = 01-JAN-2019
Requer um nome de função diferente STR_TO_DATE A função STR_TO_DATE do Cloud SQL para MySQL usa uma string e retorna uma data com base em um formato datetime :
STR_TO_DATE( '2019/01/01', '%Y/%m/%d') = 2019-01-01
TO_NUMBER Converte a expressão em um valor de um tipo de dados NUMBER :
TO_NUMBER('01234') = 1234
Requer um nome de função diferente CAST Use a função CAST Cloud SQL para MySQL para retornar o mesmo resultado que a função TO_NUMBER do Oracle:
CAST('01234' as SIGNED) = 1234

A tabela a seguir descreve onde as funções SELECT condicionais do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
CASE A instrução CASE escolhe uma sequência de condições e executa uma instrução correspondente com a seguinte sintaxe:
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END
Sim CASE Além da função CASE , o Cloud SQL para MySQL é compatível com o uso do tratamento condicional IF/ELSE dentro da instrução SELECT :
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END

A tabela a seguir descreve onde as funções nulas do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
COALESCE Retorna a primeira expressão não nula na lista de expressões:
COALESCE( null, '1', 'a') = a
Sim COALESCE COALESCE( null, '1', 'a') = 1
NULLIF Executa uma comparação entre expression1 e expression2 . Se forem iguais, a função retorna null . Se não forem iguais, a função retorna expression1 :
NULLIF('1', '2') = a
Sim NULLIF NULLIF('1', '2') = a
NVL Substitui um valor null por uma string nos resultados de uma consulta:
NVL(null, 'a') = a
Não IFNULL IFNULL(null, 'a') = a
NVL2 Determina o valor retornado por uma consulta com base no fato de uma expressão ser nula ou não nula Não CASE A instrução CASE escolhe uma sequência de condições e executa uma instrução correspondente:
CASE WHEN condition THEN result [WHEN ...] [ELSE result] END

A tabela a seguir descreve onde o ambiente Oracle e Cloud SQL para MySQL e as funções de identificador são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
SYS_GUID Gera e retorna um identificador globalmente exclusivo (valor RAW ) composto de 16 bytes:
SELECT SYS_GUID() FROM DUAL = 8EFA4A31468B4C6DE05011AC0200009E
Não REPLACE e UUID Como solução alternativa, use as funções REPLACE e UUID para simular a função SYS_GUID :
REPLACE( UUID(), '-', '')
UID Retorna um número inteiro que identifica exclusivamente o usuário da sessão (o usuário que está conectado):
SELECT UID FROM DUAL = 43
Não N / D N / D
USER Retorna o nome de usuário do usuário que está conectado à sessão atual:
SELECT USER FROM DUAL = username
Sim USER + INSTR + SUBSTR A função USER do Cloud SQL para MySQL retorna o nome de usuário e o nome do host ( root@ IP_ADDRESS ) da conexão. Para recuperar apenas o nome de usuário, use as funções de suporte adicionais:
SELECT SUBSTR(USER(), 1, INSTR(USER(), '@') -1) FROM DUAL = root
USERENV Retorna informações sobre a sessão Oracle atual, como o idioma da sessão:
SELECT USERENV('LANGUAGE') FROM DUAL = ENGLISH_AMERICA. AL32UTF8
Não SHOW SESSION VARIABLES A instrução SHOW SESSION VARIABLES do Cloud SQL para MySQL retorna as configurações da sessão atual:
SHOW SESSION VARIABLES LIKE '%collation%'; = utf8_general_ci
ROWID A Oracle atribui a cada linha de uma tabela um ROWID exclusivo para identificar a linha na tabela. O ROWID é o endereço da linha que contém o número do objeto de dados, o bloco de dados da linha, a posição da linha e o arquivo de dados. Parcialmente N / D ROW_NUMBER() está disponível a partir do MySQL 8.0. Se você estiver usando uma versão anterior, emule a mesma funcionalidade usando uma variável de sessão @row_number .
ROWNUM Retorna um número que representa a ordem em que uma linha é retornada por uma tabela Oracle Parcialmente N / D ROW_NUMBER() está disponível a partir do MySQL 8.0. Se você estiver usando uma versão anterior, emule a mesma funcionalidade usando uma variável de sessão @row_number .

A tabela a seguir descreve onde as funções agregadas (grupo) do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
AVG Retorna o valor médio de uma coluna ou expressão Sim AVG Equivalente ao Oráculo
COUNT Retorna o número de linhas retornadas por uma consulta Sim COUNT Equivalente ao Oráculo
COUNT (DISTINCT) Retorna o número de valores exclusivos na coluna ou expressão Sim COUNT (DISTINCT) Equivalente ao Oráculo
MAX Retorna o valor máximo de uma coluna ou expressão Sim MÁX. Equivalente ao Oráculo
MIN Retorna o valor mínimo de uma coluna ou expressão Sim MIN Equivalente ao Oráculo
SUM Retorna a soma de um valor de uma coluna ou expressão Sim SUM Equivalente ao Oráculo
LISTAGG Ordena os dados dentro de cada grupo especificado na cláusula ORDER BY e concatena os valores da coluna de medida:
SELECT LISTAGG( DEPARTMENT_NAME, ', ') WITHIN GROUP (ORDER BY DEPARTMENT_NAME) DEPT FROM DEPARTMENTS; -- Single line results = Accounting, Administration, Benefits, Construction
Requer um nome de função e sintaxe diferentes GROUP_ CONCAT Use a função GROUP_CONCAT do Cloud SQL para MySQL para retornar resultados equivalentes:
SELECT GROUP_CONCAT( DEPARTMENT_NAME ORDER BY DEPARTMENT_NAME SEPARATOR ', ') DEPT FROM DEPARTMENTS; -- Single line results = Accounting, Administration, Benefits, Construction

A tabela a seguir descreve onde a função FETCH do Oracle e Cloud SQL para MySQL é equivalente por nome e funcionalidade.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL Implementação do Cloud SQL para MySQL
FETCH Recupera um número especificado de linhas do conjunto de resultados de uma consulta de várias linhas:
SELECT * FROM EMPLOYEES FETCH FIRST 10 ROWS ONLY;
Sim LIMIT Use a cláusula LIMIT do MySQL para recuperar linhas de uma consulta:
SELECT * FROM EMPLOYEES LIMIT 10;

Filtragem básica, operadores e subconsultas

Filtragem básica, funções de operador e subconsultas são relativamente simples de converter, exigindo esforço nominal. A maior parte do esforço gira em torno da conversão de formatos de data porque o Oracle e o Cloud SQL para MySQL usam diferentes formatos de data padrão:

  • A função Oracle SYSDATE retorna este formato por padrão: 01-AUG-19 .
  • A função SYSDATE() do Cloud SQL para MySQL retorna este formato por padrão: 2019-08-01 12:04:05 .

Para definir formatos de data e hora, use as funções MySQL DATE_FORMAT ou STR_TO_DATE .

A tabela a seguir descreve onde a filtragem básica, os operadores e as funções de subconsulta do Oracle e do Cloud SQL para MySQL são equivalentes por nome e funcionalidade, e onde uma conversão é recomendada.

Função Oráculo Implementação Oracle Equivalente do Cloud SQL para MySQL Função Cloud SQL para MySQL
EXISTS/ NOT EXISTS Sim EXISTS/ NOT EXISTS SELECT * FROM DEPARTMENTS D WHERE EXISTS (SELECT 1 FROM EMPLOYEES E WHERE E.DEPARTMENT_ID = D.DEPARTMENT_ID);
IN/NOT IN Sim 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 Sim LIKE/NOT LIKE SELECT * FROM EMPLOYEES WHERE FIRST_NAME LIKE '_e_n%';
BETWEEN/ NOT BETWEEN Sim BETWEEN/ NOT BETWEEN SELECT * FROM EMPLOYEES WHERE EXTRACT(YEAR FROM HIRE_DATE) NOT BETWEEN 2001 and 2004;
AND/OR Sim AND/OR SELECT * FROM EMPLOYEES WHERE DEPARTMENT_ID IN(100, 101) AND (SALARY >= 1000 OR HIRE_DATE <= '2006-02-05');
SubQuery Sim SubQuery O Cloud SQL para MySQL oferece suporte a subconsultas na cláusula SELECT , na cláusula JOIN e para filtragem nas cláusulas WHERE/AND :
-- 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);
Operadores Sim Operadores O Cloud SQL para MySQL oferece suporte a todos os operadores básicos:
> | >= | < | <= | = | <> | !=

Práticas recomendadas para consultas do Cloud SQL para MySQL

Para manter níveis comparáveis ​​de desempenho entre o Cloud SQL para MySQL e o Oracle, talvez seja necessário otimizar suas consultas. Essas otimizações incluem a alteração das estruturas do índice e o ajuste do esquema do banco de dados. Esta seção fornece algumas diretrizes para ajudar você a alcançar um desempenho de consulta comparável no Cloud SQL para MySQL.

Crie um índice clusterizado

Ao usar o mecanismo de armazenamento InnoDB , uma prática recomendada é definir uma tabela com uma chave primária, porque essa chave cria um índice clusterizado nessa tabela. Além de melhorar o desempenho da consulta, essa abordagem também permite criar índices secundários adicionais. No entanto, você deseja evitar a criação de muitos índices. Ter índices redundantes não melhora o desempenho e pode retardar a execução do DML . Essa prática recomendada leva a uma segunda prática recomendada: monitorar regularmente índices redundantes e, se você tiver índices redundantes, eliminá-los do banco de dados.

Use a consulta a seguir para identificar tabelas sem chaves primárias para que você possa criar chaves primárias para elas:

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';

Use a seguinte consulta para encontrar tabelas que não possuem índices para que você possa criar índices para elas:

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';

Use a seguinte consulta para verificar índices redundantes para que você possa remover as redundâncias:

mysql> SELECT * FROM sys.schema_redundant_indexes;

Ajustar parâmetros de consulta

Para ajustar o desempenho da consulta, talvez seja necessário ajustar os parâmetros da sessão. O Cloud SQL para MySQL tem um conjunto de sinalizações que você pode alterar para essa finalidade, incluindo as seguintes sinalizações:

  • Parâmetros relacionados ao InnoDB
  • Parâmetros SORT
  • Parâmetros JOIN
  • Parâmetros de manipulação de cache

Monitorar consultas

Consultas lentas podem fazer com que o sistema pare de responder ou levar a outros gargalos, por isso é importante monitorar consultas regularmente.

Existem várias maneiras de diagnosticar instruções SQL de execução lenta:

  • Use o painel do Cloud SQL para MySQL para obter insights históricos e em tempo real sobre consultas de execução lenta.
  • Use o Cloud Monitoring para monitorar o registro de consultas lentas do Cloud SQL para MySQL.
  • Use a visualização statement_analysis do Cloud SQL para MySQL para ver as estatísticas de tempo de execução sobre uma instrução SQL:

    mysql> SELECT * FROM sys.statement_analysis;
    

Analisar consultas do Cloud SQL para MySQL

O otimizador de consulta no Cloud SQL para MySQL gera um plano de execução para instruções SELECT , INSERT , UPDATE e DELETE . Esses planos são úteis quando você ajusta uma consulta de execução lenta. Existem algumas considerações a serem lembradas:

  • Os planos de execução não são objetos de banco de dados que precisam ser migrados; em vez disso, eles são uma ferramenta para analisar diferenças de desempenho entre Oracle e Cloud SQL para MySQL executando a mesma instrução em conjuntos de dados idênticos.
  • O Cloud SQL para MySQL não é compatível com a mesma sintaxe, funcionalidade ou saída do plano de execução que o Oracle.

Aqui está um exemplo de plano para ilustrar as diferenças entre um plano de execução do Oracle e um plano de execução do Cloud SQL para MySQL:

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  |
+----+-------------+-----------+------------+-------+---------------+---------+---------+-------+------+----------+-------+

Otimize procedimentos armazenados e gatilhos

Ao contrário do Oracle, os procedimentos e funções armazenados do Cloud SQL para MySQL são analisados ​​em cada execução. Uma ferramenta útil para avaliar o desempenho de procedimentos armazenados e funções é o utilitário MySQL BENCHMARK() . Esta ferramenta utiliza dois parâmetros, uma contagem de iterações e uma expressão, e estima o tempo de execução da expressão fornecida (por exemplo, procedimento armazenado, função e instrução SELECT ). A saída representa o tempo de execução total aproximado em todas as iterações.

A seguir está um exemplo para ilustrar o utilitário BENCHMARK() :

-- 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

Se você notar uma regressão de desempenho durante a conversão, use o comando MySQL EXPLAIN para identificar possíveis fatores que contribuem para a regressão. Uma solução comum para desempenho lento é alterar uma estrutura de índice de tabela para acomodar o otimizador MySQL. Outra prática comum é otimizar um código PL/SQL convertido reduzindo a recuperação desnecessária de dados ou usando tabelas temporárias dentro do código MySQL processual.

O que vem a seguir

  • Explore mais sobre contas de usuário MySQL .
  • Explore arquiteturas de referência, diagramas e práticas recomendadas sobre o Google Cloud. Dê uma olhada em nosso Centro de Arquitetura de Nuvem .