Emprestado de BI, fazer agrupamentos que mostre dados em dimensão de tempo é uma ferramenta
de grande ajuda.
São diversas as situações onde é aplicável dimensionamento de dados por tempo – melhor utilizar
exemplos:
Ex: Deseja saber qual dia da semana as vendas são mais concentradas – Seg, Ter, Qua, Qui, Sex,
Sab, Dom….

with CTE as
(
     select data,wdia,cdia from DIM_DATE('12/01/2015','12/31/2015')
)
Select d.wdia as dia, d.cdia as cdia, sum(valor) as Valor
from cte d join TAB_VENDAS a on (d.data=a.data)
group by d.wdia,d.cdia

Código para a procedure DIM_DATE:

SET TERM ^ ;
CREATE OR ALTER PROCEDURE DIM_DATE (
p_data_de date,
p_data_ate date)
returns (
   data date,
   dia integer,
   wdia integer,
   cdia varchar(1),
   mes integer,
   ano integer,
   semestre integer,
   trimestre integer,
   nsemana integer,
   inimes date,
   fimmes date)
as
declare variable dt date;
begin
   dt = :p_data_de;
   while (dt <= :p_data_ate ) do
   begin
     data = :dt;
     dia = extract(day from :dt);
     wdia = extract(weekday from :dt); -- cdia base
     cdia = substr('DSTQQSS',wdia+1,wdia+1);
     mes = extract(month from :dt);
     ano = extract(year from :dt);
     semestre = case when mes<=6 then 1 else 2 end;
     trimestre = trunc((mes-1) / 3)+1;
     inimes = :dt - dia +1;
     fimmes = dateadd(month, 1,:inimes) - 1;
     nsemana = extract(week from :data);
     suspend;
     dt = dt+1;
   end
end^
SET TERM ; ^
GRANT EXECUTE ON PROCEDURE DIM_DATE TO SYSDBA;

Com a implementação de recurso de criação de funções para o Firebird 3.0, abre-se novos horizontes de recursos no banco de dados.

Entender como criar utilizar funções será uma poderosa ferramenta para soluções do dia-a-dia.

Exemplo

SET TERM ^ ;
create or alter function StartOfMonth(PDate date) returns date...
  as -- retorna a data do primeiro dia do mes
  begin
      return PDate - extract(day from PDate)+1;
  end^
SET TERM ; ^

Utilizando a função

select StartOfMonth( cast(’01/10/2016′ as date) ) from RDB$Database

Complexas consultas em Firebird podem ser resolvidas utilizando CTE.
CTE é uma construção que monta uma tabela de memória a ser utilizada em um SELECT e é desmontado quando
termina a execução do SELECT.

1) Considerando uma tabela de vendas (existente no banco de dados):

CREATE TABLE vendas (codigo varchar(20), data date, qtde numeric(18,4), valor numeric(18,4) );

2) Inserir alguns dados na tabela que simule as vendas;
3) Executar a seguinte consulta no banco de dados:

with VendasDoMes as
       ( -- agrupa os dados de vendas
         select Codigo,
                extract(month from data) Mes,
                extract(year from data) Ano,
                sum(qtde) Qtde,
                sum(valor) Total
        from vendas
        group by 1,2,3 -- agrupa as colunas
       )
       select * from VendasDoMes --monta a consulta
       where ano=2015 and mes=12
       order by mes, ano

4) Conclusão:
O SELECT irá retornar a quantidade e total de vendas de todos os produto no mês de Dezembro de 2015.

O Firebird traz uma ferramenta de backup pouco falada – “nbackup” – que faz backup incremental.
Quando roda o backup deve indicar qual o nível deseja… Nível 0 – backup completo. Nível 1 –
somente a diferença entre o último nível 0 e o agora. Nível 2 – somente a diferença desde o último
nível….. Importante – ele não faz validação dos dados precisa de estratégia em paralelo para
validação – é muito bom para fazer cópia sem parar o banco “a quente”. É muito rápido, bom para
fazer cópias intermediárias durante a operação.
Exemplo Nivel 0:

nbackup -B 0 localhost:c:\dados\meubanco.fdb c:\backup\backup.bak -U sysdba -P masterkey

Exemplo Nivel 1:

nbackup -B 1 localhost:c:\dados\meubanco.fdb c:\backup\backup1.bak -U sysdba -P masterkey

Como restaurar Nivel 0 +Nivel 1:

nbackup -R c:\dados\teste.fdb c:\backup\backup.bak c:\backup\backup1.bak

Interessante: permite fazer o backup de uma máquina remota.

O Firebird aceita usar o Order By indicando o nome da coluna (o mais conhecido), o número da coluna ou pelo apelido da coluna.

Exemplo usando o nome da coluna:
[code lang=”SQL”]
select
codigo, nome, preco, (preco * 1.05) precoPrazo
from fb_prod
order by nome Rows 10
[/code]

Exemplo usando o número da coluna
[code lang=”SQL”]
select
codigo, nome, preco, (preco * 1.05) precoPrazo
from fb_prod
order by 4 Rows 10
[/code]

Exemplo usando o apelido da coluna:
[code lang=”SQL”]
select
codigo, nome, preco, (preco * 1.05) precoPrazo
from fb_prod
order by precoPrazo Rows 10
[/code]

O Firebird tem duas formas diferentes de limitar o número de linhas:

First/Skip   ou

Rows/To    (mais nova)

Exemplo:

select codigo, nome from clientes Rows 10 To 15

Retorna as linhas de número 10 até a linha 15 (primeira linha=1)

Se rows>0 sem indicar o To retorna as N linhas a partir do primeiro registro.

Se rows=0 não retorna nenhuma linha.

Se rows <0 vai gerar uma exceção.

 

SWEEP é um recurso que limpa registros lixo do banco de dados. Quando um registro é excluído (DELETE) ou feito (UPDATE) o firebird mantem uma cópia antiga do registro no arquivo do banco de dados (MEUBANCO.FDB), ainda que esta cópia não seja visualizada ao fazer o SELECT no banco de dados.

Como a remoção de dados do arquivo consome tempo de processamento considerável, o Firebird não o faz constantemente, mas sim, de períodos em períodos. Se a instalação padrão do MEUBANCO.FDB for de 20.000 registro, ou seja, quando atinge este número de registro o banco executa automaticamente um SWEEP do banco de dados (limpa o lixo).

Como ele não escolhe a hora mais adequada para executar o SWEEP, muitas vezes o banco o executa exatamente quando o usuário mais esta precisando acessar o banco. Quando isto ocorre, o banco aumenta o tempo de resposta tornando perceptível ao usuário.

Em instalações de uso intenso, uma possibilidade é desabilitar este processo automático e passar a faze-lo em momento programados. Ex: quando liga a máquina, ou ainda, programada para executar fora do expediente.


*Como desabilitar o SWEEP

gfix -h 0 localhost:c:\dados\meubanco.fdb -user sysdba -password masterkey

Ao desabilitar o SWEEP o banco deixará de fazer limpeza dos registros inválidos, razão que é preciso montar um processo de execute o SWEEP manualmente (obrigatório). Se por o SWEEP deixar de ser feito por um período que acumule muitos registros inválidos, será afetado o desempenho do banco de dados, até que o SWEEP seja executa; Executar o SWEEP quando reinicia o banco de dados, pode ser uma opção bastante interessante.

*Para alterar o SWEEP para 1000

gfix -h 1000 localhost:c:\dados\meubanco.fdb -user sysdba -password masterkey

*Executar SWEEP Manual

gfix -sweep localhost:c:\dados\meubanco.fdb -user sysdba -password masterkey

Em uma estratégia de execução manual, pode gerar um script (uma bat) e registrar a execução no agendador de tarefas para fazer todos os dias a noite quando o uso do banco é baixo, assim irá manter melhor controle sobre a performance do banco durante os períodos de maior atividade.