1
resposta

Exemplo final: Qual seria o cálculo mais otimizado

Tentei reproduzir a atividade sozinho e cheguei em outra solução igualmente funcional, mas com um cálculo diferente do total de instrutores a partir de um select da tabela e não de um contator via loop. Estou em dúvida de qual seria a melhor opção em questão de desempenho entre o caminho que segui e a tratativa do professor

CREATE TABLE log2 (
    id SERIAL PRIMARY KEY,
    descricao VARCHAR(255),
    data_hora TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);

CREATE OR REPLACE FUNCTION adiciona_instrutor (nome_instrutor VARCHAR, salario_instrutor DECIMAL) RETURNS void AS $$
    DECLARE
    media_salarial DECIMAL;
    id_novo_instrutor INTEGER;
    instrutores_mal_pagos INTEGER;
    total_instrutores INTEGER;
    porcentagem DECIMAL;
    BEGIN
        SELECT AVG (instrutor.salario) FROM instrutor INTO media_salarial;

        INSERT INTO instrutor (nome, salario) VALUES (nome_instrutor, salario_instrutor) RETURNING id INTO id_novo_instrutor;

    /*Diferença a partir daqui, coloquei todas as ações dentro do if*/
        IF salario_instrutor > media_salarial THEN
            INSERT INTO log2 (descricao) VALUES (nome_instrutor || ' tem um salario muito alto');

            SELECT COUNT(*) FROM instrutor WHERE id <> id_novo_instrutor INTO total_instrutores;
            SELECT COUNT(*) FROM instrutor WHERE id <> id_novo_instrutor AND salario < salario_instrutor INTO instrutores_mal_pagos;
            SELECT instrutores_mal_pagos::DECIMAL / total_instrutores::DECIMAL *100 INTO porcentagem;

            INSERT INTO log2 (descricao) VALUES (nome_instrutor || ' recebe mais do que ' || ROUND(porcentagem, 2) || '% do quadro');
        END IF;
    END;
$$ LANGUAGE plpgsql;
1 resposta

Oi, Augusto, tudo bem?

Peço desculpas por demorar a te responder.

Desde já, é importante reforçar que a questão do desempenho depende de vários fatores e, portanto, pode variar de cenário para cenário.

A sua solução, que utiliza de um SELECT para realizar a contagem, é mais simples e direta, uma vez que usa menos código e menos operações. Isso pode resultar em uma melhoria de desempenho, especialmente quando lidamos com grandes volumes de dados.

Por outro lado, a solução do instrutor pode ser mais fácil de entender em um primeiro momento, pois utiliza uma abordagem mais "manual" para contar os registros em uma tabela. Além disso, o uso de um loop pode ser mais flexível em alguns casos, especialmente quando precisamos realizar operações mais complexas do que uma simples contagem.

Sendo assim, é interessante que, durante as nossas atividades, façamos testes para analisar quais são as maneiras mais eficientes e otimizadas de resolver um problema, sempre levando em consideração o contexto da tarefa.

Augusto, espero ter ajudado. Se surgirem outras dúvidas, fico à disposição para ajudar!

Um forte abraço!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓. Bons Estudos!