online - Funciones ocultas en Oracle
solidity español (21)
Disfruté las respuestas y preguntas sobre las funciones ocultas en el servidor sql
¿Qué puedes decirnos sobre Oracle?
Tablas ocultas, funcionamientos internos de ..., procs almacenados secretos, paquete que tiene buenos utils ...
Como Apex ahora es parte de cada base de datos Oracle, estas funciones de la utilidad Apex son útiles incluso si no está utilizando Apex:
SQL> declare
2 v_array apex_application_global.vc_arr2;
3 v_string varchar2(2000);
4 begin
5
6 -- Convert delimited string to array
7 v_array := apex_util.string_to_table(''alpha,beta,gamma,delta'', '','');
8 for i in 1..v_array.count
9 loop
10 dbms_output.put_line(v_array(i));
11 end loop;
12
13 -- Convert array to delimited string
14 v_string := apex_util.table_to_string(v_array,''|'');
15 dbms_output.put_line(v_string);
16 end;
17 /
alpha
beta
gamma
delta
alpha|beta|gamma|delta
PL/SQL procedure successfully completed.
El predicado OVERLAPS no está documentado.
http://oraclesponge.wordpress.com/2008/06/12/the-overlaps-predicate/
La pista de cardinalidad es en su mayor parte indocumentada.
explain plan for
select /*+ cardinality(@inner 5000) */ *
from (select /*+ qb_name(inner) */ * from dual)
/
select * from table(dbms_xplan.display)
/
--------------------------------------------------------------------------
| Id | Operation | Name | Rows | Bytes | Cost (%CPU)| Time |
--------------------------------------------------------------------------
| 0 | SELECT STATEMENT | | 5000 | 10000 | 2 (0)| 00:00:01 |
| 1 | TABLE ACCESS FULL| DUAL | 1 | 2 | 2 (0)| 00:00:01 |
--------------------------------------------------------------------------
Más material indocumentado en http://awads.net/wp/tag/undocumented/
Advertencia: utilizar bajo su propio riesgo.
Omita la memoria caché del búfer y lea directamente desde el disco usando lecturas de ruta directa.
alter session set "_serial_direct_read"=true;
Provoca un punto de control de espacio de tabla (9i) u objeto rápido (10g +), por lo que debe tener cuidado en los sistemas OLTP ocupados.
P: ¿Cómo llamar a un almacenado con un cursor desde TOAD?
A: Ejemplo, cambie su cursor, nombre del paquete y nombre de proc almacenado
declare cursor PCK_UTILS.typ_cursor;
begin
PCK_UTILS.spc_get_encodedstring(
''U'',
10000002,
null,
''none'',
cursor);
end;
Tablas de instantáneas También se encuentra en Oracle Lite y es extremadamente útil para implementar su propio mecanismo de replicación.
La relación de aciertos de la memoria tampón de almacenamiento intermedio es prácticamente insignificante como un predictor de la eficiencia del sistema
Puede ver los datos de la tabla como un tiempo anterior usando Flashback Query, con ciertas limitaciones.
Select *
from my_table as of timestamp(timestamp ''2008-12-01 15:21:13'')
11g tiene un nuevo conjunto de características para preservar los cambios históricos de forma más sólida.
Si obtiene el valor de la columna PASSWORD
en DBA_USERS
, puede hacer una copia de seguridad o restaurar contraseñas sin conocerlas:
ALTER USER xxx IDENTIFIED BY VALUES ''xxxx'';
No sé si esto cuenta como oculto, pero estaba muy contento cuando vi esta forma de ver rápidamente lo que sucedió con una declaración de SQL que estás sintonizando.
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL;
SELECT * FROM TABLE(dbms_xplan.display_cursor( NULL, NULL, ''RUNSTATS_LAST''))
;
PLAN_TABLE_OUTPUT
-----------------------------------------------------
SQL_ID 5z36y0tq909a8, child number 0
-------------------------------------
SELECT /*+ GATHER_PLAN_STATISTICS */ * FROM DUAL
Plan hash value: 272002086
---------------------------------------------------------------------------------------------
| Id | Operation | Name | Starts | E-Rows | A-Rows | A-Time | Buffers | Reads |
---------------------------------------------------------------------------------------------
| 1 | TABLE ACCESS FULL| DUAL | 1 | 1 | 1 |00:00:00.02 | 3 | 2 |
---------------------------------------------------------------------------------------------
12 rows selected.
Dónde:
- E-Filas es filas estimadas.
- A-Filas son filas reales.
- A-Time es el tiempo real.
- Buffers es buffers reales.
Cuando el plan estimado varía de la ejecución real en órdenes de magnitud, usted sabe que tiene problemas.
No es una función oculta, pero el control de acceso de gran precisión (FGAC), también conocido como seguridad de nivel de fila, es algo que he usado en el pasado y me impresionó la eficacia de su implementación. Si busca algo que le garantice que puede controlar la granularidad de cómo las filas están expuestas a usuarios con diferentes permisos, independientemente de la aplicación que se use para ver los datos (SQL * Plus y su aplicación web), entonces esta es una joya .
La indexación de texto completo integrada está más ampliamente documentada, pero aún se destaca por su estabilidad (simplemente intente ejecutar una reindexación completa de columnas indexadas de texto completo en muestras de datos similares en MS-SQL y Oracle y verá la diferencia de velocidad )
La cláusula modelo (disponible para Oracle 10g y superior)
wm_concat funciona como MySql group_concat pero no está documentado.
con datos:
-car- -maker-
Corvette Chevy
Taurus Ford
Impala Chevy
Aveo Chevy
select wm_concat(car) Cars, maker from cars
group by maker
te dio:
-Cars- -maker-
Corvette, Impala, Aveo Chevy
Taurus Ford
WM_CONCAT para la agregación de cadenas
El almacenamiento en caché de la subconsulta escalar es una de las características más sorprendentes de Oracle
-- my_function is NOT deterministic but it is cached!
select t.x, t.y, (select my_function(t.x) from dual)
from t
-- logically equivalent to this, uncached
select t.x, t.y, my_function(t.x) from t
La subconsulta "caché" anterior evalúa my_function(tx)
solo una vez por valor único de tx
. Si tiene particiones grandes del mismo valor tx
, esto acelerará enormemente sus consultas, incluso si my_function
no está declarada DETERMINISTIC
. Incluso si fuera DETERMINISTIC
, puede asegurarse un interruptor de contexto SQL -> PL / SQL posiblemente costoso.
Por supuesto, si my_function
no es una función determinista, entonces esto puede llevar a resultados incorrectos, ¡así que ten cuidado!
@ Peter
En realidad, puede vincular una variable de tipo "Cursor" en TOAD, luego usarla en su extracto y mostrará los resultados en la cuadrícula de resultados.
exec open :cur for select * from dual;
"Los escaneos completos de tablas no siempre son malos. Los índices no siempre son buenos".
Un método de acceso basado en índice es menos eficiente en la lectura de filas que un análisis completo cuando se mide en términos de filas accedidas por unidad de trabajo (generalmente por lectura lógica). Sin embargo, muchas herramientas interpretarán un escaneo de tabla completo como una señal de ineficiencia.
Tome un ejemplo en el que está leyendo unos cientos de facturas desde una tabla de facturas y buscando un método de pago en una pequeña tabla de búsqueda. Usar un índice para sondear la tabla de búsqueda para cada factura probablemente signifique tres o cuatro io lógicos por factura. Sin embargo, un escaneo completo de la tabla de búsqueda en preparación para una combinación de hash de los datos de la factura probablemente requeriría solo un par de lecturas lógicas, y la combinación de hash se completaría en la memoria casi sin costo alguno.
Sin embargo, muchas herramientas verían esto y verán "escaneo de tabla completa", y le indicarán que intente usar un índice. Si lo haces, entonces puedes haber desintonizado tu código.
Incidentalmente, la dependencia excesiva de los índices, como en el ejemplo anterior, hace que aumente la "Proporción de aciertos de la memoria caché del búfer". Esta es la razón por la cual el BCHR es en su mayoría sin sentido como un predictor de la eficiencia del sistema.
Acabo de enterarme de la pseudocolumna Ora_rowSCN. Si no configura su tabla para esto, esta columna le proporciona el bloque SCN. Esto podría ser muy útil para la emergencia, "Oh, mierda, no tengo ninguna auditoría en esta mesa y me pregunto si alguien ha cambiado los datos desde ayer".
Pero aún mejor es si crea la tabla con Rowdependecies ON. Eso pone el SCN del último cambio en cada fila. Esto te ayudará a evitar un problema de "Edición Perdida" sin tener que incluir cada columna en tu consulta.
IOW, cuando su aplicación toma una fila para la modificación del usuario, también seleccione Ora_rowscn. Luego, cuando publique las ediciones del usuario, incluya Ora_rowscn = v_rscn además de la clave única en la cláusula where. Si alguien ha tocado la fila desde que la agarró, también conocida como edición perdida, la actualización coincidirá con cero filas, ya que ora_rowscn habrá cambiado.
Muy guay.
La reconstrucción frecuente de índices es casi siempre una pérdida de tiempo.