Recibi este mail y lo quería compartir con ustedes:
|
Recibi este mail y lo quería compartir con ustedes:
|
Me llego este mail y quería compartirlo:
Las empresas modernas eligen Oracle Cloud Infrastructure (OCI) |
En este ebook te contamos las razones |
Conoce cómo las empresas crean y ejecutan aplicaciones seguras y escalables gracias a la nube de Oracle. |
Oracle JDK 17 es gratuita nuevamente para uso comercial, bajo la nueva licencia "Términos y condiciones sin cargo de Oracle" (NFTC). Este movimiento revierte la decisión de 2018 de cobrar por el uso en producción de Oracle JDK y no afecta la distribución de OpenJDK de Oracle. La NFTC se aplica a la versión 17 recientemente lanzada de Oracle JDK y versiones futuras.
En conclusión oracle revierte una mala decisión.
Dejo link: https://www.oracle.com/downloads/licenses/no-fee-license.html
Por lo tanto una tarea recomendada es chequear los indices cada tanto y reconstruirlos (cuando no esten utilizando la base)
Lo que hice es un script que inserta en la tabla INDEX_REBUILD los datos de los indices que deben ser reconstruidos. Y luego podemos reconstruirlos de forma automatica o manual.
Lo hice para base de datos oracle pero es interesante hacerlo para otros motores :
DROP TABLE INDEX_REBUILD CASCADE CONSTRAINTS;
CREATE TABLE INDEX_REBUILD AS (select *
from index_stats);
DECLARE
CURSOR INDEX_NAMES is
SELECT INDEX_NAME FROM all_indexes
where TABLE_OWNER = 'nombreDelEsquema'
-- AND TABLE_NAME = 'nombreDeLaTabla'; -- Si deseo correrlo para una tabla puedo descomentar esta linea.
BEGIN
FOR N IN INDEX_NAMES LOOP
EXECUTE IMMEDIATE 'analyze index ' || N.INDEX_NAME || ' validate structure';
dbms_output.put_line( N.INDEX_NAME );
END LOOP;
INSERT INTO INDEX_REBUILD select *
from index_stats
where round((del_lf_rows/lf_rows)*100,2) >= 20
OR height > 3
OR lf_rows > lf_blks;
COMMIT;
END;
Dado que tenemos los indices a reconstruir en una tabla, podemos hacer esto de forma automática :
CURSOR INDEX_NAMES is
SELECT NAME FROM INDEX_REBUILD;
BEGIN
FOR N IN INDEX_NAMES LOOP
EXECUTE IMMEDIATE 'ALTER index ' || N.NAME || ' REBUILD';
END LOOP;
END;
Pero tenemos que tener cuidado porque este proceso puede llevar mucho tiempo. Si se hace para una o dos tablas puede servir, pero para una base de datos grande o mediana, nunca terminaría. En ese caso es mejor hacerlo manual con un equipo de mate y bizcochitos.
Talvez tendría que hacer un post explicando un poco más la fragmentación y porque esos valores mágicos que pongo en la consulta, pero eso va llevar mucho tiempo...
begin
for i in (select constraint_name, table_name from user_constraints where table_name in ('tabla1', 'tabla2', 'tabla3')) LOOP
execute immediate 'alter table '||i.table_name||' disable constraint '||i.constraint_name||'';
end loop;
end;
/
Y para habilitarlas:
begin
for i in (select constraint_name, table_name from user_constraints where table_name in ('tabla1', 'tabla2', 'tabla3')) LOOP
execute immediate 'alter table '||i.table_name||' ENABLE constraint '||i.constraint_name||'';
end loop;
end;
/
Y Listo!
|
EXPLAIN PLAN FOR SELECT last_name FROM employees;
SELECT PLAN_TABLE_OUTPUT FROM TABLE(DBMS_XPLAN.DISPLAY());