Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Notas de la versión de Firebird 5.0 Beta 1
Proyecto Firebird: desarrolladores principales, Mark Rotteveel
Versión 050002, 21 de marzo de 2023
Machine Translated by Google
Tabla de contenido
Tabla de contenido
1. Notas generales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
Más detalles relacionados con el cursor en la salida del plan . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
Extensiones a varios métodos getInfo() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
6. Adiciones y cambios de configuración. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
33
1
Machine Translated by Google
Tabla de contenido
Adiciones y cambios en la configuración de replicación . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 34
Privilegio del sistema PROFILE_ANY_ATTACHMENT. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
Compatibilidad con CUANDO NO COINCIDE CON LA FUENTE en la instrucción MERGE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Admite
múltiples filas para DML RETURNING . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Permitir expresiones de consulta entre paréntesis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41
Sintaxis literal completa de la cadena de caracteres estándar de SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Sintaxis literal de cadena binaria estándar SQL completa. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
Nuevas expresiones y funciones integradas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
43
10. Utilidades de supervisión y línea de comandos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . .
45
Unifique la visualización de los procedimientos y paquetes del sistema con otros objetos del sistema . . . . . . . . . . . . . . . . . . 46
. . . . . . . . . . . . . . . . . . . . . . . . . . . . .
paralelo . . . . . . . . . . . gfijo _ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
2
Machine Translated by Google
Tabla de contenido
Versión Firebird 5.0 Beta 1: Corrección de errores. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
3
Machine Translated by Google
Capítulo 1. Notas generales
Capítulo 1. Notas generales
Gracias por elegir Firebird 5.0. Le invitamos cordialmente a probarlo duro según sus expectativas y colaborar con nosotros para
identificar y corregir cualquier error que pueda encontrar.
Se presenta ODS (Estructura en disco) 13.1. Es una actualización menor de ODS, por lo que las bases de datos en ODS 13.0
(creadas por Firebird 4.0) aún se pueden abrir con un servidor Firebird 5.0 (con algunas características nuevas que no están
disponibles), pero las bases de datos en ODS más antiguas no se pueden abrir.
Las bases de datos creadas en versiones anteriores (preBeta) de Firebird 5.0 pueden ser inaccesibles en la
versión Beta 1 y deben volver a crearse. El ODS se modificó varias veces durante el ciclo de desarrollo y, por
lo general, el Proyecto Firebird no garantiza que el ODS sea estable antes de la etapa Beta.
La biblioteca del motor todavía se llama engine13.dll (Windows) y libEngine13.so (POSIX). La base de datos de seguridad se llama
security5.fdb. El diseño y la configuración de los binarios no han cambiado desde Firebird 4.
Dicho esto, puede copiar la biblioteca del motor Firebird del paquete de distribución Firebird 3.0 (llamado
engine12.dll (Windows) y libEngine12.so (POSIX), y ubicado dentro del subdirectorio /plugins) para continuar
trabajando con bases de datos en ODS12 sin necesita una copia de seguridad/restauración. Sin embargo, no
se podrá acceder a las nuevas funciones introducidas con Firebird 5.0.
Compatibilidad con versiones anteriores
Las incompatibilidades conocidas se detallan en el capítulo Problemas de compatibilidad .
Informe de errores
Los errores corregidos en esta versión se enumeran y describen en el capítulo titulado Errores corregidos.
• Si cree que ha descubierto un nuevo error en esta versión, asegúrese de leer las instrucciones para el informe de errores en el
artículo Cómo informar errores de manera efectiva, en el sitio web del Proyecto Firebird.
• Si cree que la corrección de un error no ha funcionado o ha causado una regresión, localice el error original
informe en el Rastreador, vuelva a abrirlo si es necesario y siga las instrucciones a continuación.
Siga estas pautas cuando intente analizar su error:
1. Escriba informes de errores detallados, proporcionando el número de compilación exacto de su kit Firebird. también proporcionar
detalles de la plataforma del sistema operativo.
2. Incluya datos de prueba reproducibles en su informe y publíquelo en nuestro Rastreador.
Documentación
Encontrará todos los documentos LÉAME a los que se hace referencia en estas notas, así como muchos otros que no
4
Machine Translated by Google
Capítulo 1. Notas generales
referido — en el subdirectorio doc de su instalación de Firebird 5.0.
— El Proyecto Pájaro de Fuego
5
Machine Translated by Google
Capítulo 2. Nuevo en Firebird 5.0
Capítulo 2. Nuevo en Firebird 5.0
Resumen de nuevas características
Firebird 5.0 introduce muchas mejoras sin ningún cambio en la arquitectura o la operación, las más importantes son:
• Operación paralela (multiproceso) para copia de seguridad/restauración, barrido y creación de índices;
• índices parciales;
• Cláusula SKIP LOCKED para sentencias SELECT WITH LOCK, UPDATE y DELETE;
• Actualización de ODS menor en línea;
• Caché de declaraciones compiladas;
• Perfilador de PSQL y SQL;
• Compatibilidad con CUANDO NO COINCIDE CON LA FUENTE para la instrucción MERGE;
• Soporta múltiples filas para DML DEVOLUCIÓN;
• Nuevas funciones y paquetes incorporados;
• Compresión a nivel de grabación más densa;
• Soporte de red para cursores desplazables;
La siguiente lista resume las características y los cambios, con enlaces a los capítulos y temas donde se puede encontrar información más
detallada.
Completar en Firebird 5.0 Beta 1
Operaciones paralelas (multiproceso)
Operaciones tales como la copia de seguridad/restauración lógica, el barrido y la ejecución de sentencias CREATE INDEX pueden ser
ejecutadas en paralelo por varios subprocesos, lo que reduce el tiempo total de la operación.
Referencias del rastreador: #1783, #3374, #7447
Consulte los capítulos Compatibilidad con operaciones en paralelo, copia de seguridad/restauración en paralelo y barrido en paralelo para
obtener más detalles.
Soporte para índices parciales
La declaración CREATE INDEX DDL se ha ampliado para admitir índices parciales, es decir, un índice ahora puede declarar una condición
que define el subconjunto de registros que se indexarán.
Referencia del rastreador: #7257
Cláusula SKIP LOCKED
Se introdujo la nueva cláusula SKIP LOCKED para las sentencias SELECT WITH LOCK, UPDATE y DELETE. Permite saltarse los registros
ya bloqueados mientras se lee la tabla.
Referencia del rastreador: #7350
6
Machine Translated by Google
Capítulo 2. Nuevo en Firebird 5.0
Actualización de ODS menor en línea
Se ha introducido la capacidad de actualizar la base de datos a la última versión de ODS menor, no requiere un ciclo de copia de
seguridad/restauración.
Referencia del rastreador: #7397
Caché de declaraciones compiladas
Se ha implementado la memoria caché por archivo adjunto de sentencias SQL compiladas .
Referencia del rastreador: #7144
Perfilador de PSQL y SQL
Se ha agregado una capacidad integrada para generar perfiles de declaraciones SQL y PSQL , lo que hace posible medir el tiempo de
ejecución en diferentes niveles.
Referencia del rastreador: #7086
Compatibilidad con CUANDO NO COINCIDE CON LA FUENTE en la instrucción MERGE
La declaración MERGE se ha ampliado para admitir la cláusula WHEN NOT MATCHED BY SOURCE.
Referencia del rastreador: #6681
Funciones integradas UNICODE_CHAR y UNICODE_VAL
Se agregaron nuevas funciones integradas UNICODE_CHAR y UNICODE_VAL para permitir la conversión entre punto de código
Unicode y carácter.
Referencia del rastreador: #6798
Nuevo paquete de sistema RDB$BLOB_UTIL Se
agregó el nuevo paquete de sistema RDB$BLOB_UTIL para permitir varias operaciones con BLOB en los módulos PSQL.
Referencia del rastreador: #281
Admite múltiples filas devueltas por DML con la cláusula RETURNING
La cláusula RETURNING, si se usa en consultas DSQL, ahora permite que se devuelvan varias filas.
Referencia del rastreador: #6815
Optimice el algoritmo RLE a nivel de registro para una compresión más densa de cadenas más cortas que las declaradas y conjuntos
de valores NULL posteriores
El algoritmo de compresión incorporado se ha mejorado para permitir una compresión más densa de los registros.
Referencia del rastreador: #4723
Más detalles relacionados con el cursor en la salida del plan
El plan de ejecución ahora contiene más información sobre los cursores.
Referencia del rastreador: #7441
7
Machine Translated by Google
Capítulo 2. Nuevo en Firebird 5.0
Otras mejoras se enumeran brevemente a continuación, siga las referencias del rastreador para obtener más información.
Unifique la visualización de los procedimientos y paquetes del sistema con otros objetos del sistema
Referencia del rastreador: #7411
Simplifique la compilación de la biblioteca del cliente
Referencia del rastreador: #7399
Mejora del rendimiento para la copia de BLOB
Referencia del rastreador: #7382
Elección basada en costos entre unión de bucle anidado y unión hash
Referencia del rastreador: #7331
Cree paquetes de Android con todos los archivos necesarios en todas las arquitecturas (x86, x64, arm32, arm64)
Referencia del rastreador: #7293
Unificar los nombres de archivo de lanzamiento
Referencia del rastreador: #7284
Mejorar los diagnósticos de discrepancia de versiones de la UCI
Referencia del rastreador: #7169
Proporcione la capacidad de ver en los eventos de registro de seguimiento relacionados con el contexto de seguridad faltante
Referencia del rastreador: #7165
ResultSet.getInfo() nuevo método API
Referencia del rastreador: #7083
Soporte de red para cursores desplazables
Referencia del rastreador: #7051
Agregue la tabla MON$COMPILED_STATEMENTS y también la columna MON$COMPILED_STATEMENT_ID a ambos
Tablas MON$STATEMENTS y MON$CALL_STACK
Referencia del rastreador: #7050
Hacer la capacidad de agregar comentarios al mapeo ("COMENTARIO SOBRE MAPEO ... ES ...")
Referencia del rastreador: #7046
Los resultados de la negación deben ser los mismos para cada tipo de datos (SMALLINT / INT / BIGINT / INT128) cuando el argumento es el
valor mínimo para este tipo
Referencia del rastreador: #7025
Transforme las uniones EXTERNAS en INNER si la condición WHERE viola las reglas de unión externa
Referencia del rastreador: #6992
8
Machine Translated by Google
Capítulo 2. Nuevo en Firebird 5.0
Agregue una forma de recuperar la declaración BLR con Statement.getInfo () y SET EXEC_PATH_DISPLAY de ISQL
BLR
Referencia del rastreador: #6910
SIMILAR TO debe usar el índice cuando el patrón comienza con un carácter no comodín (como lo hace LIKE)
Referencia del rastreador: #6873
Agregue la columna MON$SESSION_TIMEZONE a la tabla MON$ATTACHMENTS
Referencia del rastreador: #6794
Permitir expresión de consulta entre paréntesis para cumplimiento estándar
Referencia del rastreador: #6740
Tabla del sistema con palabras clave
Referencia del rastreador: #6713
Admite la sintaxis literal completa de la cadena de caracteres estándar de SQL
Referencia del rastreador: #5589
Admite la sintaxis literal de cadena binaria estándar de SQL completo
Referencia del rastreador: #5588
Permitir que las subrutinas accedan a variables/parámetros definidos en el nivel externo/principal
Referencia del rastreador: #4769
Evite la recuperación de datos si la cláusula WHERE siempre se evalúa como FALSO
Referencia del rastreador: #1708
9
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Capítulo 3. Cambios en el motor Firebird
enlaces rápidos
• Soporte para operaciones paralelas
• Actualización de ODS menor en línea
• Más detalles relacionados con el cursor en la salida del plan
• Caché de declaraciones compiladas
• Compresión más densa de registros
• Analizador de SQL y PSQL
• Paquete RDB$BLOB_UTIL
Soporte para operaciones paralelas
Vlad Khorsun
Boleto de rastreador: #7447
El motor de Firebird ahora puede ejecutar algunas tareas utilizando varios subprocesos en paralelo. Actualmente, se implementa la
ejecución paralela para las tareas de barrido y creación de índices. Se admite la ejecución en paralelo para el barrido automático y manual.
Para manejar una tarea con varios subprocesos, el motor ejecuta subprocesos de trabajo adicionales y crea adjuntos de trabajo internos.
De forma predeterminada, la ejecución en paralelo no está habilitada. Hay dos formas de habilitar el paralelismo en un archivo adjunto de
usuario:
1. establezca el número de trabajadores paralelos en DPB usando la nueva etiqueta isc_dpb_parallel_workers,
2. Establezca el número predeterminado de trabajadores paralelos utilizando la nueva configuración ParallelWorkers en firebird.conf.
La utilidad gfix tiene un nuevo interruptor de línea de comandos, parallel, que permite establecer el número de trabajadores paralelos para
la tarea de barrido. Por ejemplo:
gfix sweep parallel 4 <base de datos>
ejecutará el barrido en la base de datos dada y le pedirá al motor que use 4 trabajadores. gfix usa la etiqueta DPB isc_dpb_parallel_workers
cuando se adjunta a <base de datos>, si el interruptor parallel está presente.
La nueva configuración de firebird.conf ParallelWorkers establece el número predeterminado de trabajadores paralelos que puede usar
cualquier archivo adjunto de usuario que ejecute una tarea paralelizable. El valor predeterminado es 1 y significa que no se utilizan
trabajadores paralelos adicionales. El valor en el DPB tiene una prioridad más alta que la configuración en firebird.conf.
Para controlar la cantidad de trabajadores adicionales que puede crear el motor, hay dos configuraciones nuevas en firebird.conf:
10
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
ParallelWorkers
Establece el número predeterminado de trabajadores paralelos que utilizan los archivos adjuntos de usuario. Se puede anular
mediante un archivo adjunto con la etiqueta isc_dpb_parallel_workers en DPB.
MaxParallelWorkers
Limita el número de trabajadores utilizados simultáneamente para la base de datos dada y el proceso de Firebird.
Los archivos adjuntos de trabajadores internos son creados y administrados por el propio motor. El motor mantiene grupos por base de
datos de adjuntos de trabajadores. La cantidad de subprocesos en cada grupo está limitada por el valor de la configuración
MaxParallelWorkers . Los grupos son creados por cada proceso de Firebird de forma independiente.
En la arquitectura SuperServer, los archivos adjuntos de los trabajadores se implementan como archivos adjuntos de sistema livianos,
mientras que en Classic y SuperClassic parecen archivos adjuntos de usuario habituales. Todos los archivos adjuntos de los
trabajadores están integrados en la creación del proceso del servidor. Por lo tanto, en las arquitecturas clásicas no hay procesos de
servidor adicionales. Los archivos adjuntos de los trabajadores están presentes en las tablas de seguimiento. Los archivos adjuntos de
los trabajadores inactivos se destruyen después de 60 segundos de inactividad. Además, en las arquitecturas clásicas, los archivos
adjuntos de los trabajadores se destruyen inmediatamente después de que la última conexión del usuario se separe de la base de datos.
Ejemplos:
Configure en firebird.conf ParallelWorkers = 4, MaxParallelWorkers = 8 y reinicie el servidor Firebird.
1. Conéctese a la base de datos de prueba sin usar isc_dpb_parallel_workers en DPB y ejecute CREATE INDEX...
instrucción SQL. En la confirmación, el índice se creará realmente y el motor utilizará 3 archivos adjuntos de trabajo adicionales.
En total, 4 archivos adjuntos en 4 subprocesos funcionarán en la creación de índices.
2. Asegúrese de que el barrido automático esté habilitado para la base de datos de prueba. Cuando el barrido automático se ejecute en esa base de
datos, también utilizará 3 trabajadores adicionales (y se ejecutará dentro de 4 subprocesos).
3. Se puede paralelizar más de una sola tarea a la vez: hacer 2 archivos adjuntos y ejecutar CREAR ÍNDICE… en cada uno de ellos
(por supuesto, los índices a construir deben ser diferentes). Cada índice se creará utilizando 4 archivos adjuntos (1 usuario y 3
trabajadores) y 4 subprocesos.
4. Ejecute gfix sweep <base de datos> sin especificar switch parallel: el barrido se ejecutará usando 4
accesorios en 4 hilos.
5. Ejecute gfix sweep parallel 2 <base de datos>: el barrido se ejecutará utilizando 2 archivos adjuntos en 2 subprocesos. Esto
muestra que el valor en la etiqueta DPB isc_dpb_parallel_workers anula el valor de la configuración de ParallelWorkers.
Actualización de ODS menor en línea
dmitri yemanov
Boleto de rastreador: #7397
Esta función permite actualizar la base de datos existente a la versión más reciente de ODS sin realizar copias de seguridad/
restauración, siempre que la base de datos pertenezca a la misma versión principal de ODS.
Por ejemplo, una base de datos creada por Firebird 4.0 usa ODS 13.0 y, por lo tanto, puede actualizarse al ODS 13.1 que usa Firebird
5.0.
11
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Notas:
• La actualización debe hacerse manualmente, usando el comando gfix upgrade
• Requiere acceso exclusivo a la base de datos, de lo contrario se arroja error
• Se requiere el privilegio del sistema USE_GFIX_UTILITY
• La actualización es transaccional, todos los cambios se revierten si ocurre algún error
Uso:
gfix actualizar <base de datos>
Ver también actualización de ODS por gfix.
Esta es una modificación unidireccional, la degradación hacia atrás es imposible. Por lo tanto, haga una
copia de la base de datos antes de actualizar, solo para tener un punto de recuperación si algo sale mal
durante el proceso.
Más detalles relacionados con el cursor en la salida del plan
dmitri yemanov
Boleto de rastreador: #7441
La salida detallada del plan ahora distingue entre declaraciones SELECT especificadas por el usuario (informadas como
expresiones de selección), cursores declarados por PSQL y subconsultas. Tanto los planes heredados como los detallados
ahora también incluyen información sobre la posición del cursor (línea/columna) dentro de su módulo PSQL.
Ejemplos:
línea 23, columna 2
PLAN (ÍNDICE DE DISTRITO (DISTRICT_PK))
línea 28, columna 2
UNIRSE AL PLAN (ÍNDICE DE CLIENTE (CLIENTE_PK), ÍNDICE DE ALMACÉN (ALMACÉN_PK))
Seleccione Expresión (línea 23, columna 2)
> Comprobación de singularidad
> Filtrar
> Tabla "DISTRITO" Acceso por ID
> Mapa de bits
> Escaneo único del índice "DISTRICT_PK"
Seleccione Expresión (línea 28, columna 2)
> Comprobación de singularidad
> Unión de bucle anidado (interior)
> Filtrar
> Tabla "CLIENTE" Acceso Por ID
> Mapa de bits
12
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
> Escaneo único del índice "CUSTOMER_PK"
> Filtrar
> Tabla "ALMACÉN" Acceso Por DNI
> Mapa de bits
> Escaneo único del índice "WAREHOUSE_PK"
Los números de línea/columna (así como los cursores declarados por PSQL) no se pueden ver directamente en el plan para consultas
SQL especificadas por el usuario, excepto si la consulta es EXECUTE BLOCK. Sin embargo, se puede acceder a ellos en la columna
MON$EXPLAINED_PLAN en las tablas MON$STATEMENTS o MON$COMPILED_STATEMENTS.
Compresión más densa de registros
dmitri yemanov
Boleto de rastreador: #4723
A partir de ODS 13.1, el motor utiliza un método de compresión RLE avanzado (con contador de longitud variable) que almacena
secuencias de bytes repetitivas de manera más efectiva, lo que reduce la sobrecarga de almacenamiento. Esto mejora la compresión
para campos VARCHAR largos (especialmente codificados en UTF8) que se llenan solo parcialmente.
Caché de declaraciones compiladas
Adriano dos Santos Fernández
Boleto de rastreador: #7144
El motor ahora mantiene un caché por archivo adjunto de sentencias SQL compiladas. De forma predeterminada, el almacenamiento
en caché está habilitado, el umbral de almacenamiento en caché está definido por el parámetro MaxStatementCacheSize en
firebird.conf. Se puede deshabilitar estableciendo MaxStatementCacheSize en cero.
El caché se mantiene automáticamente; Las declaraciones almacenadas en caché se invalidan cuando es necesario (generalmente
cuando se ejecuta alguna declaración DDL).
Analizador de SQL y PSQL
Adriano dos Santos Fernández
Boleto de rastreador: #7086
El generador de perfiles permite a los usuarios medir el costo de rendimiento del código SQL y PSQL. Se implementa con un paquete
de sistema en el motor que pasa datos a un complemento de perfilador.
Esta documentación trata las partes del motor y del complemento como una sola cosa, en la forma en que se utilizará el generador
de perfiles predeterminado (Default_Profiler).
El paquete RDB$PROFILER puede perfilar la ejecución de código PSQL, recopilando estadísticas de cuántas veces se ejecutó cada
línea junto con sus tiempos de ejecución mínimos, máximos y acumulados (con precisión de nanosegundos), así como estadísticas
de apertura y obtención de SQL implícito y explícito.
13
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
cursores
Para recopilar datos de perfil, un usuario primero debe iniciar una sesión de perfil con RDB$PROFILER.START_SESSION. Esta función
devuelve un ID de sesión de perfil que luego se almacena en las tablas de instantáneas del generador de perfiles para que el usuario las
consulte y las analice. Una sesión de Profiler puede ser local (mismo archivo adjunto) o remota (otro archivo adjunto).
La creación de perfiles remotos solo reenvía comandos al archivo adjunto remoto. Por lo tanto, es posible que un cliente perfile varios
archivos adjuntos simultáneamente. También es posible que una sesión de perfil iniciada local o remotamente tenga comandos emitidos
por otro archivo adjunto.
Los comandos emitidos de forma remota requieren que el archivo adjunto de destino esté en un estado inactivo, es decir, que no esté
ejecutando otras solicitudes. Cuando el archivo adjunto de destino no está inactivo, la llamada se bloquea esperando ese estado.
Si el archivo adjunto remoto es de un usuario diferente, el usuario que llama debe tener el privilegio del sistema
PROFILE_ANY_ATTACHMENT.
Después de que se inicia una sesión, las estadísticas de las declaraciones de PSQL y SQL se recopilan en la memoria. Una sesión de
perfil recopila datos solo de declaraciones ejecutadas en el mismo archivo adjunto asociado con la sesión. Los datos se agregan y
almacenan por solicitudes (es decir, una ejecución de declaración). Al consultar tablas de instantáneas, el usuario puede realizar una
agregación adicional por declaración o usar las vistas auxiliares que lo hacen automáticamente.
Se puede pausar una sesión para deshabilitar temporalmente la recopilación de estadísticas. Se puede reanudar más tarde para devolver
la recopilación de estadísticas en la misma sesión.
Se puede iniciar una nueva sesión cuando ya hay una sesión activa. En ese caso, tiene la misma semántica de finalizar la sesión actual
con RDB$PROFILER.FINISH_SESSION(FALSE), por lo que las tablas de instantáneas no se actualizan.
Para analizar los datos recopilados, el usuario debe vaciar los datos en las tablas de instantáneas, lo que se puede hacer finalizando o
pausando una sesión (con el parámetro FLUSH establecido en TRUE) o llamando a RDB$PROFILER.FLUSH. Los datos se vacían
mediante una transacción autónoma (una transacción iniciada y finalizada con el propósito específico de actualizar los datos del
generador de perfiles).
A continuación se muestra una sesión de perfil de muestra y consultas para el análisis de datos.
1. Preparación: cree una tabla y rutinas que se analizarán
crear pestaña de
tabla (id entero no nulo, val
entero no nulo);
establecer plazo !;
crear o alterar la función mult(p1 entero, p2 entero) devuelve entero
como
*
empezar volver p1 p2;
14
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
¡fin!
crear o modificar procedimiento ins
como
declarar n entero = 1; comenzar
mientras (n <= 1000)
comenzar
si (mod (n, 2) = 1) entonces
insertar en valores de tabulación (:n, mult(:n, 2));
n = n + 1;
fin
¡fin!
establecer plazo ;!
2. Empezar a perfilar
seleccione rdb$profiler.start_session('Profile Session 1') de rdb$database;
establecer plazo !;
ejecutar bloque
como
comenzar a ejecutar el
procedimiento ins;
eliminar de la pestaña; ¡fin!
establecer plazo ;!
ejecutar el procedimiento rdb$profiler.finish_session(true);
ejecutar procedimiento ins;
seleccione rdb$profiler.start_session('Profile Session 2') de rdb$database;
seleccione mod (id, 5),
sum (val)
de la pestaña
donde id <= 50
agrupar por mod(id, 5)
ordenar por sum(val);
ejecutar el procedimiento rdb$profiler.finish_session(true);
3. Análisis de datos
15
Machine Translated by Google Capítulo 3. Cambios en el motor Firebird
establecer transacción de lectura confirmada;
seleccione * de plg$prof_sessions;
seleccione * de plg$prof_psql_stats_view;
seleccione * de plg$prof_record_source_stats_view;
seleccionar preq.*
from plg$prof_requests preq unirse a
plg$prof_sessions pses en pses.profile_id
= preq.profile_id y
pses.description = 'Sesión de perfil 1';
seleccione pstat.*
de plg$prof_psql_stats pstat únase a
plg$prof_sessions pses en pses.profile_id
= pstat.profile_id y pses.description = 'Sesión de perfil 1' ordene
por pstat.profile_id, pstat.request_id, pstat.line_num,
pstat.column_num;
seleccione pstat.*
de plg$prof_record_source_stats pstat únase a
plg$prof_sessions pses en pses.profile_id
= pstat.profile_id y pses.description = 'Sesión de perfil 2' ordene
por pstat.profile_id, pstat.request_id, pstat.cursor_id,
pstat.record_source_id;
Paquete de rutinas
Función START_SESSION
RDB$PROFILER.START_SESSION inicia una nueva sesión del generador de perfiles, la convierte en la sesión actual (del
ATTACHMENT_ID dado) y devuelve su identificador.
Si FLUSH_INTERVAL es diferente de NULL, la descarga automática se configura de la misma manera que se llama manualmente a
RDB$PROFILER.SET_FLUSH_INTERVAL.
Si PLUGIN_NAME es NULL (el valor predeterminado), utiliza la configuración de la base de datos DefaultProfilerPlugin.
PLUGIN_OPTIONS son opciones específicas del complemento y actualmente deben ser NULL para el complemento Default_Profiler.
Parámetros de entrada):
dieciséis
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
• DESCRIPCIÓN tipo VARCHAR(255) CONJUNTO DE CARACTERES UTF8 predeterminado NULL
• FLUSH_INTERVAL tipo INTEGER por defecto NULL
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
• PLUGIN_NAME tipo VARCHAR(255) CONJUNTO DE CARACTERES UTF8 predeterminado NULL
• PLUGIN_OPTIONS tipo VARCHAR(255) CONJUNTO DE CARACTERES UTF8 predeterminado NULL
Tipo de valor devuelto: BIGINT NOT NULL.
Procedimiento PAUSE_SESSION
RDB$PROFILER.PAUSE_SESSION detiene la sesión actual del generador de perfiles (del ATTACHMENT_ID dado), por lo que no se recopilan las siguientes
estadísticas de declaraciones ejecutadas.
Si FLUSH es TRUE, las tablas de instantáneas se actualizan con datos hasta el momento actual; de lo contrario, los datos permanecen solo en la memoria para
una actualización posterior.
Llamar llamando aRDB$PERFILADOR.PAUSA_SESIÓN(VERDADERO) tiene la misma semántica
RDB$PROFILER.PAUSE_SESSION(FALSE) seguido de RDB$PROFILER.FLUSH de
(usando
el mismo ATTACHMENT_ID).
Parámetros de entrada):
• FLUSH tipo BOOLEAN NO NULO predeterminado FALSO
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
Procedimiento RESUME_SESSION
RDB$PROFILER.RESUME_SESSION reanuda la sesión actual del generador de perfiles (del ATTACHMENT_ID dado), si estaba en pausa, por lo que las
próximas estadísticas de declaraciones ejecutadas se recopilan nuevamente.
Parámetros de entrada):
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
Procedimiento FINISH_SESSION
RDB$PROFILER.FINISH_SESSION finaliza la sesión actual del generador de perfiles (del ATTACHMENT_ID proporcionado).
Si FLUSH es TRUE, las tablas de instantáneas se actualizan con los datos de la sesión finalizada (y las sesiones anteriores terminadas que aún no están
presentes en la instantánea); de lo contrario, los datos permanecen solo en la memoria para una actualización posterior.
Llamar a RDB$PROFILER.FINISH_SESSION(TRUE) tiene la misma semántica que llamar a RDB$PROFILER.FINISH_SESSION(FALSE) seguido de
RDB$PROFILER.FLUSH (usando el mismo ATTACHMENT_ID).
Parámetros de entrada):
• FLUSH tipo BOOLEAN NO NULO predeterminado VERDADERO
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
17
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Procedimiento CANCEL_SESSION
RDB$PROFILER.CANCEL_SESSION cancela la sesión actual del generador de perfiles (del ATTACHMENT_ID dado).
Todos los datos de sesión presentes en el complemento del generador de perfiles se descartan y no se eliminarán.
Los datos ya vaciados no se eliminan automáticamente.
Parámetros de entrada):
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
Procedimiento DESECHAR
RDB$PROFILER.DISCARD elimina todas las sesiones (del ATTACHMENT_ID dado) de la memoria, sin vaciarlas.
Si hay una sesión activa, se cancela.
Parámetros de entrada):
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
Procedimiento LAVADO
RDB$PROFILER.FLUSH actualiza las tablas de instantáneas con datos de las sesiones de perfil (del ATTACHMENT_ID dado) en la memoria.
Después del vaciado, los datos se almacenan en las tablas PLG$PROF_SESSIONS, PLG$PROF_STATEMENTS, PLG$PROF_RECORD_SOURCES,
PLG$PROF_REQUESTS, PLG$PROF_PSQL_STATS y PLG$PROF_RECORD_SOURCE_STATS y pueden ser leídos y analizados por el usuario.
Los datos se actualizan mediante una transacción autónoma, por lo que si se llama al procedimiento en una transacción instantánea, los datos no
se podrán leer directamente en la misma transacción.
Una vez que ocurre el vaciado, las sesiones finalizadas se eliminan de la memoria.
Parámetros de entrada):
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
Procedimiento SET_FLUSH_INTERVAL
RDB$PROFILER.SET_FLUSH_INTERVAL activa la descarga automática periódica (cuando FLUSH_INTERVAL es mayor que 0) o desactiva
(cuando FLUSH_INTERVAL es igual a 0).
FLUSH_INTERVAL se interpreta como número de segundos.
Parámetros de entrada):
• FLUSH_INTERVAL tipo INTEGER NOT NULL
• ATTACHMENT_ID tipo BIGINT NOT NULL predeterminado CURRENT_CONNECTION
18
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Tablas de instantáneas
Las tablas de instantáneas (así como las vistas y la secuencia) se crean automáticamente en el primer uso del generador de perfiles. Son propiedad del
propietario de la base de datos, con permisos de lectura/escritura para PÚBLICO.
Cuando se elimina una sesión, los datos relacionados en otras tablas de instantáneas del generador de perfiles también se eliminan automáticamente a través
de claves externas con la opción DELETE CASCADE.
A continuación se muestra la lista de tablas que almacenan datos de perfil.
Tabla PLG$PROF_SESSIONS
PROFILE_ID tipo BIGINT ID de sesión de perfil
ATTACHMENT_ID tipo BIGINT ID de archivo adjunto
NOMBRE_USUARIO tipo CHAR(63) CONJUNTO DE CARACTERES UTF8 Nombre de usuario
DESCRIPCIÓN tipo VARCHAR(255) CONJUNTO DE CARACTERES Descripción pasada en
UTF8
RDB$PROFILER.START_SESSION
START_TIMESTAMP tipo TIMESTAMP CON HORA Momento en que se inició la sesión de perfil
ZONA
FINISH_TIMESTAMP tipo TIMESTAMP CON HORA Momento en que finalizó la sesión de perfil
ZONA
(NULL cuando no ha terminado)
Clave primaria PERFIL ID
Tabla PLG$PROF_STATEMENTS
PROFILE_ID tipo BIGINT ID de sesión de perfil
STATEMENT_ID tipo BIGINT ID de estado de cuenta
PARENT_STATEMENT_ID tipo BIGINT Id. de declaración principal: relacionado con las subrutinas
STATEMENT_TYPE tipo VARCHAR(20) CARÁCTER BLOQUE, FUNCIÓN, PROCEDIMIENTO o DISPARADOR
CONJUNTO UTF8
PACKAGE_NAME tipo CHAR(63) CONJUNTO DE CARACTERES Paquete de FUNCIÓN o PROCEDIMIENTO
UTF8
ROUTINE_NAME tipo CHAR(63) CONJUNTO DE CARACTERES Rutina nombre de FUNCIÓN, PROCEDIMIENTO o
UTF8
DESENCADENAR
SQL_TEXT tipo BLOB subtipo TEXTO CARÁCTER Texto SQL para BLOCK
CONJUNTO UTF8
Clave primaria PERFIL_ID, DECLARACIÓN_ID
Tabla PLG$PROF_CURSORS
PROFILE_ID tipo BIGINT ID de sesión de perfil
STATEMENT_ID tipo BIGINT ID de estado de cuenta
19
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
CURSOR_ID tipo INTEGER Identificación del cursor
NOMBRE tipo CHAR(63) CONJUNTO DE CARACTERES UTF8 Nombre del cursor explícito
LINE_NUM tipo INTEGER Número de línea del cursor
COLUMN_NUM tipo INTEGER Número de columna del cursor
Clave primaria PERFIL_ID, DECLARACIÓN_ID, CURSOR_ID
Tabla PLG$PROF_RECORD_SOURCES
PROFILE_ID tipo BIGINT ID de sesión de perfil
STATEMENT_ID tipo BIGINT ID de estado de cuenta
CURSOR_ID tipo INTEGER Identificación del cursor
RECORD_SOURCE_ID tipo INTEGER ID de fuente de registro
PARENT_RECORD_SOURCE_ID tipo INTEGER ID de fuente de registro principal
ACCESS_PATH tipo VARCHAR(255) CONJUNTO DE CARACTERES Ruta de acceso a la fuente de registro
UTF8
Tabla PLG$PROF_REQUESTS
PROFILE_ID tipo BIGINT ID de sesión de perfil
SOLICITUD_ID tipo BIGINT Solicitar identificación
STATEMENT_ID tipo BIGINT ID de estado de cuenta
CALLER_REQUEST_ID tipo BIGINT ID de solicitud de llamada
START_TIMESTAMP tipo TIMESTAMP CON HORA Momento en que esta solicitud se recopiló por primera vez los datos del
ZONA
perfil
FINISH_TIMESTAMP tipo TIMESTAMP CON HORA Momento en que finalizó esta solicitud
ZONA
TOTAL_ELAPSED_TIME tipo BIGINT Tiempo transcurrido acumulado (en nanosegundos) de la solicitud
Clave primaria PERFIL_ID, SOLICITUD_ID
Tabla PLG$PROF_PSQL_STATS
PROFILE_ID tipo BIGINT ID de sesión de perfil
SOLICITUD_ID tipo BIGINT Solicitar identificación
20
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
LINE_NUM tipo INTEGER Número de línea de la declaración
COLUMN_NUM tipo INTEGER Número de columna de la declaración
STATEMENT_ID tipo BIGINT ID de estado de cuenta
CONTADOR tipo BIGINT Número de veces ejecutadas de la línea/columna
MIN_ELAPSED_TIME tipo BIGINT Tiempo mínimo transcurrido (en nanosegundos) de ejecución de una línea/columna
MAX_ELAPSED_TIME tipo BIGINT Tiempo máximo transcurrido (en nanosegundos) de ejecución de una línea/columna
TOTAL_ELAPSED_TIME tipo BIGINT Tiempo transcurrido acumulado (en nanosegundos) del
ejecuciones de línea/columna
Clave primaria PERFIL_ID, SOLICITUD_ID, LINE_NUM, COLUMN_NUM
Tabla PLG$PROF_RECORD_SOURCE_STATS
PROFILE_ID tipo BIGINT ID de sesión de perfil
SOLICITUD_ID tipo BIGINT Solicitar identificación
CURSOR_ID tipo INTEGER Identificación del cursor
RECORD_SOURCE_ID tipo ̀INTEGER ID de fuente de registro
STATEMENT_ID tipo BIGINT ID de estado de cuenta
OPEN_COUNTER tipo BIGINT Número de horas abiertas de la fuente de registro
OPEN_MIN_ELAPSED_TIME tipo BIGINT Tiempo mínimo transcurrido (en nanosegundos) de un registro
fuente abierta
OPEN_MAX_ELAPSED_TIME tipo BIGINT Tiempo máximo transcurrido (en nanosegundos) de una fuente de registro
abierta
OPEN_TOTAL_ELAPSED_TIME tipo BIGINT Tiempo transcurrido acumulado (en nanosegundos) de las aperturas de la
fuente de registro
FETCH_COUNTER tipo BIGINT Número de tiempos de recuperación de la fuente de registro
FETCH_MIN_ELAPSED_TIME tipo BIGINT Tiempo mínimo transcurrido (en nanosegundos) de una búsqueda de
fuente de registro
FETCH_MAX_ELAPSED_TIME tipo BIGINT Tiempo máximo transcurrido (en nanosegundos) de una búsqueda de
fuente de registro
FETCH_TOTAL_ELAPSED_TIME tipo BIGINT Tiempo transcurrido acumulado (en nanosegundos) del
búsquedas de fuentes de registros
21
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Clave primaria PERFIL_ID, SOLICITUD_ID, CURSOR_ID, RECORD_SOURCE_ID
Vistas auxiliares
Estas vistas ayudan a perfilar la extracción de datos agregados a nivel de estado de cuenta.
Deben ser la forma preferida de analizar los datos recopilados. También se pueden usar junto con las tablas para obtener datos
adicionales que no están presentes en las vistas.
Una vez que se encuentran los puntos de acceso, se pueden desglosar los datos en el nivel de solicitud a través de las tablas.
Ver PLG$PROF_STATEMENT_STATS_VIEW
select req.profile_id,
req.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
sta.parent_statement_id,
sta_parent.statement_type parent_statement_type,
sta_parent.routine_name parent_routine_name,
(seleccione
sql_text de
plg$prof_statements donde profile_id = req.profile_id y
statement_id = coalesce(sta.parent_statement_id, req.statement_id) )
sql_text,
count(*) counter,
min(req.total_elapsed_time) min_elapsed_time,
max(req.total_elapsed_time) max_elapsed_time,
cast(sum(req.total_elapsed_time) as bigint) total_elapsed_time,
cast(sum(req.total_elapsed_time) / count(*) as bigint) avg_elapsed_time from
plg$prof_requests req join
plg$prof_statements sta on
sta.profile_id = req.profile_id and
sta.statement_id = req.statement_id
left join plg$prof_statements sta_parent on
sta_parent.profile_id = sta.profile_id y
sta_parent.statement_id = sta.parent_statement_id
agrupar por req.profile_id,
req.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
sta.parent_statement_id,
sta_parent.statement_type,
sta_parent.routine_name
ordenar por sum(req.total_elapsed_time) desc
22
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Ver PLG$PROF_PSQL_STATS_VIEW
seleccione pstat.profile_id,
pstat.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
sta.parent_statement_id,
sta_parent.statement_type parent_statement_type,
sta_parent.routine_name parent_routine_name,
(seleccione
sql_text de
plg$prof_statements donde profile_id =
pstat.profile_id y statement_id = coalesce(sta.parent_statement_id,
pstat.statement_id) )
sql_text, pstat.line_num, pstat.column_num,
cast(sum(pstat.counter) as bigint) counter,
min(pstat.min_elapsed_time) min_elapsed_time,
max(pstat.max_elapsed_time) max_elapsed_time ,
cast(sum(pstat.total_elapsed_time) as bigint) total_elapsed_time,
cast(sum(pstat.total_elapsed_time) /
nullif(sum(pstat.counter), 0) as
bigint) avg_elapsed_time from plg$prof_psql_stats
pstat join plg$prof_statements sta on sta .profile_id = pstat.profile_id y sta.statement_id = pstat.sta
combinación izquierda plg$prof_statements
sta_parent en sta_parent.profile_id = sta.profile_id y
sta_parent.statement_id = sta.parent_statement_id
grupo por pstat.profile_id,
pstat.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
sta.parent_statement_id,
sta_parent.statement_type,
sta_parent.routine_name,
pstat.line_num,
pstat.column_num
ordenar por sum(pstat.total_elapsed_time) desc
Ver PLG$PROF_RECORD_SOURCE_STATS_VIEW
seleccione rstat.profile_id,
rstat.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
23
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
sta.parent_statement_id,
sta_parent.statement_type parent_statement_type,
sta_parent.routine_name parent_routine_name,
(seleccione
sql_text from
plg$prof_statements where profile_id =
rstat.profile_id and statement_id = coalesce(sta.parent_statement_id,
rstat.statement_id) ) sql_text, rstat.cursor_id,
cur.name
nombre_cursor, cur.line_num
cursor_line_num, cur.column_num
cursor_column_num,
rstat.record_source_id,
recsrc.parent_record_source_id, recsrc.access_path,
cast(sum(rstat.open_counter) as bigint) open_counter,
min(rstat.open_min_elapsed_time) open_min_elapsed_time,
max( rstat.open_max_elapsed_time) open_max_elapsed_time,
cast(sum(rstat.open_total_elapsed_time) as bigint) open_total_elapsed_time,
cast(sum(rstat.open_total_elapsed_time) /
nullif(sum(rstat.open_counter), 0) as bigint)
open_avg_elapsed_time, cast(sum(rstat. fetch_counter) as
bigint) fetch_counter, min(rstat.fetch_min_elapsed_time) fetch_min_elapsed_time,
max(rstat.fetch_max_elapsed_time) fetch_max_elapsed_time,
cast(sum(rstat.fetch_total_elapsed_time)
as bigint) fetch_total_elapsed_time, cast(sum(rstat.fetch_total_elapsed_time(sum) / null .fetch_co
coalesce(sum(rstat.fetch_total_elapsed_time), 0) as bigint)
open_fetch_total_elapsed_time
from plg$prof_record_source_stats rstat join
plg$prof_cursors cur on
cur.profile_id = rstat.profile_id y
cur.statement_id = rstat.statement_id y
cur.cursor_id = rstat.cursor_id
unirse a plg$prof_record_sources recsrc
en recsrc.profile_id = rstat.profile_id y
recsrc.statement_id = rstat.statement_id y
recsrc.cursor_id = rstat.cursor_id y
recsrc.record_source_id = rstat.record_source_id
unirse a plg$prof_statements
sta on sta.profile_id = rstat.profile_id y
sta.statement_id = rstat.statement_id
combinación izquierda plg$prof_statements
sta_parent en sta_parent.profile_id = sta.profile_id y
sta_parent.statement_id = sta.parent_statement_id
grupo por rstat.profile_id,
rstat.statement_id,
sta.statement_type,
sta.package_name,
sta.routine_name,
24
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
sta.parent_statement_id,
sta_parent.statement_type,
sta_parent.routine_name,
rstat.cursor_id,
cur.name,
cur.line_num,
cur.column_num,
rstat.record_source_id,
recsrc.parent_record_source_id,
recsrc.access_path
ordenar por coalesce(sum(rstat.open_total_elapsed_time), 0) +
coalesce(sum(rstat.fetch_total_elapsed_time), 0) desc
Paquete RDB$BLOB_UTIL
Adriano dos Santos Fernández
Boleto de rastreador: #281
Este paquete proporciona procedimientos y funciones para manipular BLOB de una manera que las funciones estándar de Firebird,
como BLOB_APPEND y SUBSTRING, no pueden hacer o son muy lentas.
Estas rutinas operan en datos binarios directamente, incluso para BLOB de texto.
Paquete de rutinas
Función NUEVO_BLOB
RDB$BLOB_UTIL.NEW_BLOB se usa para crear un nuevo BLOB. Devuelve un BLOB adecuado para agregar datos, como lo hace
BLOB_APPEND.
La ventaja sobre BLOB_APPEND es que es posible establecer opciones personalizadas SEGMENTED y TEMP_STORAGE.
BLOB_APPEND siempre crea BLOB en almacenamiento temporal, lo que puede no ser siempre el mejor enfoque si el BLOB
creado se va a almacenar en una tabla permanente, ya que requerirá una copia.
El BLOB devuelto por esta función, incluso cuando TEMP_STORAGE = FALSE, puede usarse con BLOB_APPEND para agregar
datos.
Parámetros de entrada):
• Tipo SEGMENTADO BOOLEAN NO NULO
• TEMP_STORAGE tipo BOOLEAN NO NULO
Tipo de valor devuelto: BLOB NO NULO.
Función OPEN_BLOB
RDB$BLOB_UTIL.OPEN_BLOB se usa para abrir un BLOB existente para lectura. Devuelve un identificador (un número entero
25
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
vinculado a la transacción) adecuado para usar con otras funciones de este paquete, como SEEK, READ_DATA y CLOSE_HANDLE.
Parámetros de entrada):
• Tipo BLOB BLOB NO NULO
Tipo de retorno: ENTERO NO NULO.
Función IS_WRITABLE
RDB$BLOB_UTIL.IS_WRITABLE devuelve TRUE cuando BLOB es adecuado para agregar datos sin copiar usando BLOB_APPEND.
Parámetros de entrada):
• Tipo BLOB BLOB NO NULO
Tipo de retorno: BOOLEAN NOT NULL.
Función LEER_DATOS
RDB$BLOB_UTIL.READ_DATA se usa para leer fragmentos de datos de un identificador BLOB abierto con
RDB$BLOB_UTIL.OPEN_BLOB. Cuando el BLOB se lee por completo y no hay más datos, devuelve NULL.
Si se pasa LONGITUD con un número positivo, devuelve un VARBINARIO con su longitud máxima.
Si LENGTH es NULL, devuelve solo un segmento del BLOB con una longitud máxima de 32765.
Parámetros de entrada):
• MANEJO tipo ENTERO NO NULO
• LONGITUD tipo ENTERO
Tipo de valor devuelto: VARBINARIO(32767).
Función BUSCAR
RDB$BLOB_UTIL.SEEK se usa para establecer la posición para el próximo READ_DATA, devuelve la nueva posición.
MODE puede ser 0 (desde el inicio), 1 (desde la posición actual) o 2 (desde el final).
Cuando MODE es 2, OFFSET debe ser cero o negativo.
Parámetros de entrada):
• MANEJO tipo ENTERO NO NULO
• MODO tipo ENTERO NO NULO
• Tipo de DESPLAZAMIENTO ENTERO NO NULO
Tipo de retorno: ENTERO NO NULO.
26
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
Procedimiento CANCEL_BLOB
RDB$BLOB_UTIL.CANCEL_BLOB se usa para liberar inmediatamente un BLOB temporal, como uno creado con BLOB_APPEND.
Tenga en cuenta que si se usa el mismo BLOB después de cancelar, usando la misma variable u otra con la misma referencia de ID de
BLOB, se generará un error de ID de blob no válido.
Procedimiento CLOSE_HANDLE
RDB$BLOB_UTIL.CLOSE_HANDLE se usa para cerrar un identificador BLOB abierto con RDB$BLOB_UTIL.OPEN_BLOB.
Los identificadores que no se cierran explícitamente solo se cierran automáticamente cuando finaliza la transacción.
Parámetros de entrada):
• MANEJO tipo ENTERO NO NULO
Ejemplos
Cree un BLOB en el espacio temporal y devuélvalo en EJECUTAR BLOQUE
ejecutar devoluciones de bloque (b blob)
como
comenzar: crea un identificador BLOB en el espacio temporal.
b = rdb$blob_util.new_blob(falso, verdadero);
Agregar fragmentos de datos.
b = blob_append(b, '12345'); b =
blob_append(b, '67');
suspender; fin
Abra un BLOB y devuelva fragmentos con EXECUTE BLOCK
ejecutar devoluciones de bloque (s varchar(10))
como
declarar b blob = '1234567'; declarar bhandle
entero; begin Abra el BLOB y obtenga
un
identificador de BLOB.
bhandle = rdb$blob_util.open_blob(b);
Obtener fragmentos de datos como cadenas y devolverlos.
s = rdb$blob_util.read_data(bhandle, 3); suspender;
s = rdb$blob_util.read_data(bhandle, 3);
27
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
suspender;
s = rdb$blob_util.read_data(bhandle, 3); suspender;
Aquí se encuentra EOF, por lo que devuelve
NULL. s = rdb$blob_util.read_data(bhandle, 3); suspender;
Cierre el identificador BLOB.
ejecutar el procedimiento rdb$blob_util.close_handle(bhandle); fin
Buscar en un blob
establecer plazo !;
ejecutar devoluciones de bloque (s varchar(10))
como
declarar b blob; declarar
bhandle entero; comenzar: crea un
identificador BLOB de flujo. b =
rdb$blob_util.new_blob(falso, verdadero);
Agregar datos.
b = blob_append(b, '0123456789');
Abra el BLOB.
bhandle = rdb$blob_util.open_blob(b);
Buscar a 5 desde el inicio.
rdb$blob_util.seek(bhandle, 0, 5); s =
rdb$blob_util.read_data(bhandle, 3); suspender;
Buscar a 2 desde el inicio.
rdb$blob_util.seek(bhandle, 0, 2); s =
rdb$blob_util.read_data(bhandle, 3); suspender;
Avance 2.
rdb$blob_util.seek(bhandle, 1, 2); s =
rdb$blob_util.read_data(bhandle, 3); suspender;
Buscar a 1 desde el final.
rdb$blob_util.seek(bhandle, 2, 1); s =
rdb$blob_util.read_data(bhandle, 3); suspender;
28
Machine Translated by Google
Capítulo 3. Cambios en el motor Firebird
¡fin!
establecer plazo ;!
Comprobar si los blobs se pueden escribir
crear tabla t(b blob);
establecer plazo !;
ejecutar devoluciones de bloque (bool booleano)
como
declarar b blob; comenzar
b =
blob_append(null, 'escribible'); bool =
rdb$blob_util.is_writable(b); suspender;
insertar en t (b) valores ('no escribibles') que devuelven b en b; bool =
rdb$blob_util.is_writable(b); suspender; ¡fin!
establecer plazo ;!
29
Machine Translated by Google
Capítulo 4. Cambios en Firebird API y ODS
Capítulo 4. Cambios en Firebird API y ODS
desde el lanzamiento de Firebird 4.0
Cambios en ODS (estructura en disco)
Nuevo Número ODS Menor
Firebird 5.0 crea bases de datos con una versión ODS (Estructura en disco) de 13.1. También puede funcionar con bases de datos
creadas en ODS 13.0 (por Firebird 4.0), pero algunas características nuevas no estarán disponibles.
Nuevas tablas del sistema
Tablas del sistema añadidas en ODS 13.1:
RDB$ PALABRAS CLAVE
Tabla virtual que enumera las palabras clave utilizadas por el analizador SQL
MON$COMPILED_STATEMENTS Tabla virtual que informa declaraciones compiladas
Nuevas columnas en las tablas del sistema
Se agregaron las columnas RDB$CONDITION_SOURCE y RDB$CONDITION_BLR a la tabla del sistema RDB$INDICES, pertenecen
a la función de índices parciales.
La tabla virtual MON$ATTACHMENTS se amplió con la nueva columna MON$SESSION_TIMEZONE. Además, se agregó la columna
MON$COMPILED_STATEMENT_ID a las tablas del sistema MON$STATEMENTS y MON$CALL_STACK. La tabla virtual
SEC$GLOBAL_AUTH_MAPPING ahora tiene la nueva columna SEC$DESCRIPTION.
Interfaces de programación de aplicaciones
La versión del protocolo de conexión para la API de Firebird 5.0 es 18. Las adiciones y los cambios se describen en las secciones a
continuación.
Extensiones principales de la API
Se han agregado varios métodos nuevos a las siguientes interfaces.
Conjunto resultante
void getInfo(Status status, uint
itemsLength, const uchar* items, uint
bufferLength, uchar* buffer);
Permite consultar la información del cursor. Actualmente, solo se admite una solicitud de información, INF_RECORD_COUNT.
INF_RECORD_COUNT devuelve el número de registros almacenados en caché por el cursor desplazable,
30
Machine Translated by Google
Capítulo 4. Cambios en Firebird API y ODS
o 1 para un cursor unidireccional (solo hacia adelante).
Extensiones a varios métodos getInfo()
Declaración::getInfo()
Se agregaron las siguientes acciones:
isc_info_sql_exec_path_blr_bytes Ruta de ejecución como BLR (formato binario)
isc_info_sql_exec_path_blr_text Ruta de ejecución como BLR (formato textual)
Extensiones de API de servicios
Soporte para operaciones paralelas
Se agregó soporte para operaciones paralelas.
Se agregaron las siguientes opciones:
isc_spb_bkp_parallel_workers número de trabajadores paralelos para respaldo
isc_spb_res_parallel_workers número de trabajadores paralelos para la restauración
isc_spb_rpr_par_workers número de trabajadores paralelos para el barrido
Ejemplos de uso de nuevos parámetros en la utilidad fbsvcmgr (el inicio de sesión y la contraseña se omitieron por brevedad):
fbsvcmgr action_backup bkp_parallel_workers 4 <dbname> <backupname>
fbsvcmgr action_restore res_parallel_workers 4 <backupname> <dbname>
fbsvcmgr action_repair rpr_sweep_db rpr_par_workers 4 <dbname>
Soporte para gfix upgrade
Se agregó soporte para actualizaciones menores de ODS.
Se agregó la siguiente opción:
base de datos de actualización isc_spb_rpr_upgrade_db
Ejemplo de uso de un nuevo parámetro en la utilidad fbsvcmgr (el nombre de usuario y la contraseña se omitieron por brevedad):
fbsvcmgr action_repair rpr_upgrade_db <nombrebd>
31
Machine Translated by Google
Capítulo 5. Palabras reservadas y cambios
Capítulo 5. Palabras reservadas y cambios
Nuevas palabras clave en Firebird 5.0
no reservado
BLOQUEADO
OBJETIVO
TIMEZONE_NOMBRE
UNICODE_CHAR
UNICODE_VAL
32
Machine Translated by Google
Capítulo 6. Adiciones y cambios de configuración
Capítulo 6. Adiciones y cambios de
configuración
Nuevos parámetros de configuración:
Parámetros para operaciones paralelas
MaxParallelWorkers
Limita la cantidad total de trabajadores paralelos que se pueden crear dentro de un solo proceso de Firebird para cada base de datos adjunta. Se permiten
valores enteros en el rango entre 1 (sin paralelismo) y 64.
Todos los demás valores se ignoran silenciosamente y se usa el valor predeterminado de 1.
Los trabajadores se contabilizan para cada base de datos adjunta de forma independiente.
ParallelWorkers
Especifica el número predeterminado de trabajadores paralelos para una sola tarea. Se permiten valores enteros en el rango entre 1 (sin paralelismo) y
MaxParallelWorkers (ver arriba). Todos los demás valores se ignoran silenciosamente y se usa el valor predeterminado de 1.
Otros parámetros
MaxStatementCacheSize
Define la cantidad máxima de memoria utilizada para almacenar en caché las sentencias compiladas de DSQL no utilizadas. El valor de cero significa que
no se utiliza el almacenamiento en caché de sentencias. El valor predeterminado es de 2 megabytes.
OnDisconnectTriggerTimeout
Configura un tiempo de espera (en segundos) que se aplica a la ejecución del disparador ON DISCONNECT. El disparador será cancelado automáticamente
por el motor después de que haya pasado el tiempo especificado. El valor de cero ('0') significa que no se ha establecido ningún tiempo de espera. El valor
predeterminado es 180 segundos.
Complemento de perfil predeterminado
Especifica el complemento del generador de perfiles predeterminado que se usa para perfilar las conexiones mediante el paquete RDB$PROFILER.
Parámetros de configuración modificados
Complemento WireCrypt
Se agregó una nueva variante (que usa un contador interno de 64 bits en lugar de 32 bits) del complemento ChaCha#20.
El nuevo valor predeterminado de este parámetro ahora es ChaCha64, ChaCha, Arc4.
33
Machine Translated by Google
Capítulo 6. Adiciones y cambios de configuración
Parámetros de configuración eliminados:
RemotePipeName
Este parámetro se eliminó junto con la eliminación de la compatibilidad con el protocolo WNET (también conocido como canalizaciones con
nombre) para Windows.
TcpLoopbackFastPath
Este parámetro se eliminó porque Microsoft desaconseja el uso de la opción de socket SIO_LOOPBACK_FAST_PATH.
Cambios y adiciones a la configuración de replicación
cascada_replicación
Nuevo parámetro que especifica si los cambios aplicados a la base de datos de réplica también estarán sujetos a más replicaciones (si se
configura alguna). El valor predeterminado es falso (la cascada está deshabilitada).
Permitir macros en replication.conf
Las macros de archivos de configuración ahora también son compatibles con replication.conf.
34
Machine Translated by Google
Capítulo 7. Seguridad
Capítulo 7. Seguridad
Las mejoras de seguridad en Firebird 5 incluyen:
Privilegio del sistema PROFILE_ANY_ATTACHMENT
Se ha agregado el nuevo privilegio de sistema PROFILE_ANY_ATTACHMENT al motor.
Cuando se utiliza la generación de perfiles de SQL remoto y el archivo adjunto que se perfila es de un usuario diferente, el usuario
que llama debe tener este privilegio del sistema.
Vea más detalles en el capítulo del generador de perfiles SQL y PSQL .
35
Machine Translated by Google
Capítulo 8. Lenguaje de definición de datos (DDL)
Capítulo 8. Lenguaje de definición de datos (DDL)
enlaces rápidos
• Soporte para índices parciales
• COMENTARIO SOBRE EL MAPEO
Soporte para índices parciales
dmitri yemanov
Boleto de rastreador: #7257
Esta característica permite indexar solo un subconjunto de filas de tablas definidas por la condición de búsqueda especificada
durante la creación del índice.
Reglas de sintaxis:
CREAR [ÚNICO] [{ASC[FINAL] | DESC[ENDING]}] INDEX <nombre_índice> ON <nombre_tabla>
{ (<lista_columnas>) | COMPUTADO [POR] ( <valor_expresión> ) }
WHERE <condición_de_búsqueda>
Ejemplos:
1.
CREAR ÍNDICE IT1_COL EN T1 (COL) DONDE COL < 100;
SELECCIONE * DESDE T1 DONDE COL <
100; PLAN (ÍNDICE T1 (IT1_COL))
2.
CREAR ÍNDICE IT1_COL2 EN T1 (COL) DONDE COL NO ES NULO;
SELECCIONE * DESDE T1 DONDE COL >
100; PLAN (ÍNDICE T1 IT1_COL2)
3.
CREAR ÍNDICE IT1_COL3 EN T1 (COL) DONDE COL = 1 O COL = 2;
SELECCIONE * DESDE T1 DONDE COL = 2;
PLAN (ÍNDICE T1 IT1_COL3)
Notas:
1. Una definición de índice parcial puede incluir la especificación ÚNICA. En este caso, se requiere que cada clave en el índice
sea única. Esto permite imponer la unicidad en algún subconjunto de la tabla
filas
2. Un índice parcial solo se puede utilizar en los siguientes casos:
36
Machine Translated by Google
Capítulo 8. Lenguaje de definición de datos (DDL)
◦ La condición WHERE incluye exactamente la misma expresión booleana que la definida para
El índice;
◦ La condición de búsqueda definida para el índice contiene expresiones booleanas con OR y una de
ellos está explícitamente incluido en la condición WHERE;
◦ La condición de búsqueda definida para el índice especifica IS NOT NULL y la condición WHERE
incluye una expresión en el mismo campo que se sabe que ignora NULL.
COMENTARIO SOBRE EL MAPEO
alex peshkov
Boleto de rastreador: #7046
Se amplió la instrucción COMMENT ON para poder agregar un comentario a un MAPPING.
EL COMENTARIO SOBRE LA ASIGNACIÓN <nombre de la asignación> ES {<comentario> | NULO};
37
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
Capítulo 9. Lenguaje de manipulación de datos
(DML)
enlaces rápidos
• Cláusula SKIP LOCKED
• Compatibilidad con CUANDO NO COINCIDE CON LA FUENTE en la instrucción MERGE
• Admite múltiples filas para DML RETURNING
• Permitir expresiones de consulta entre paréntesis
• Cambios a los literales
• Nuevas expresiones y funciones integradas
Cláusula SKIP LOCKED
Adriano dos Santos Fernández
Boleto de rastreador: #7350
SKIP LOCKED se puede usar con declaraciones SELECT... WITH LOCK, UPDATE y DELETE. Hace que el motor omita los registros
bloqueados por otras transacciones en lugar de esperarlos o generar errores de conflicto.
Esto es muy útil para implementar colas de trabajo donde uno o más procesos publican trabajo en una tabla y emiten un evento, mientras que
los trabajadores escuchan eventos y leen/eliminan elementos de la tabla. Al usar SKIP LOCKED, varios trabajadores pueden obtener
elementos de trabajo exclusivos de la mesa sin conflictos.
Sintaxis:
SELECCIONAR
[PRIMERO ...]
[SALTAR ...]
DESDE <alguna tabla>
[DONDE...]
[PLAN ...]
[ORDENAR POR...]
[{ FILAS ... } | {DESPLAZAMIENTO...} | {BUSCAR ...}]
[PARA ACTUALIZAR [DE...]]
[CON BLOQUEO [SALIR BLOQUEADO]]
ACTUALIZAR <alguna
tabla> SET...
[DÓNDE ...]
[PLAN ...]
[ORDENAR POR...]
[FILAS...]
[SALTAR BLOQUEADO]
38
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
[VOLVIENDO...]
DELETE FROM <alguna tabla>
[DONDE...]
[PLAN ...]
[ORDENAR POR...]
[FILAS...]
[SALTAR BLOQUEADO]
[VOLVIENDO...]
Como sucede con las subcláusulas FIRST/SKIP/ROWS/OFFSET/FETCH, el bloqueo de registro (y la
verificación de "salto bloqueado") se realiza entre el salto (SKIP/ROWS/OFFSET/FETCH) y el límite
(FIRST /ROWS/OFFSET/FETCH ) cheques.
Ejemplos:
• Preparar metadatos
crear tabla emails_queue (asunto
varchar(60) no nulo, texto blob sub_tipo texto
no nulo);
establecer plazo !;
crear emails_queue_ins desencadenantes después de insertar en emails_queue
como
comenzar post_event('EMAILS_QUEUE');
¡fin!
establecer plazo ;!
• Aplicación o rutina del remitente
insertar en emails_queue (asunto, texto) valores
('Asunto del correo electrónico', 'Texto del correo electrónico...');
comprometerse;
• Aplicación de cliente
La aplicación cliente puede escuchar el evento ̀EMAILS_QUEUE` para enviar correos electrónicos con esta
consulta:
eliminar de emails_queue filas 10
omitir
bloqueado
39
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
sujeto recurrente, texto;
Es posible que se esté ejecutando más de una instancia de la aplicación, por ejemplo, para equilibrar la carga.
Compatibilidad con CUANDO NO COINCIDE CON LA FUENTE en la
instrucción MERGE
Adriano dos Santos Fernández
Boleto de rastreador: #6681
Sintaxis:
<combinar cuando> ::=
<combinar cuando coincida> |
<fusionar cuando no coincida> <fusionar
cuando no coincida con el destino> | <combinar cuando no
coincida con la fuente>
<combinar cuando no coincida con el objetivo> ::=
CUANDO NO COINCIDE [POR OBJETIVO] [Y <condición>] ENTONCES
INSERT [ <paréntesis izquierdo> <lista de columnas> <paréntesis derecho> ]
VALUES <paréntesis izquierdo> <lista de valores> <paréntesis derecho>
<combinar cuando no coincide con la fuente> ::=
CUANDO NO COINCIDE CON LA FUENTE [Y <condición>] ENTONCES
{ UPDATE SET <lista de tareas> | BORRAR }
Se llama a <merge when not matched by target> cuando un registro de origen no coincide con ningún registro en el destino.
INSERT cambiará la tabla de destino.
Se llama a <merge when not matched by source> cuando un registro de destino no coincide con ningún registro en el origen.
ACTUALIZAR o ELIMINAR cambiará la tabla de destino.
Ejemplo:
UNIR
EN clientes c
UTILIZANDO new_customers nc ON (c.id
= nc.id)
CUANDO EMPAREJADO ENTONCES
ACTUALIZAR CONJUNTO nombre = cd.nombre
CUANDO NO COINCIDE CON LA FUENTE ENTONCES
BORRAR
40
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
Admite múltiples filas para DML RETURNING
Adriano dos Santos Fernández
Boleto de rastreador: #6815
En DSQL, la cláusula RETURNING ahora puede devolver varias filas para declaraciones DML que pueden afectar a
varias filas.
Consulte las notas de compatibilidad en DEVOLUCIÓN para obtener más información.
Permitir expresiones de consulta entre paréntesis
Adriano dos Santos Fernández
Boleto de rastreador: #6740
La sintaxis DML se amplió para permitir una expresión de consulta entre paréntesis (seleccione incluyendo las
cláusulas order by, offset y fetch, pero sin la cláusula with) donde anteriormente solo se permitía una especificación
de consulta (seleccione sin las cláusulas with, order by, offset y fetch) .
Esto permite consultas más expresivas, especialmente en sentencias UNION, y ofrece más compatibilidad con
sentencias generadas por ciertos ORM.
El uso de expresiones de consulta entre paréntesis tiene un costo, ya que consumen un contexto
de consulta adicional en comparación con una especificación de consulta simple. El número
máximo de contextos de consulta en una declaración es 255.
Ejemplo:
(seleccione emp_no, salario, 'más bajo' como
tipo de orden de
empleado por salario
asc, obtenga solo la
primera
fila) union all (seleccione emp_no, salario, 'más
alto' como tipo
de orden de empleado
por salario desc, obtenga
solo la primera fila);
Cambios a los literales
41
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
Sintaxis literal completa de la cadena de caracteres estándar de SQL
Adriano dos Santos Fernández
Ticket de seguimiento: https://github.com/FirebirdSQL/firebird/issues/5589
La sintaxis de los literales de cadena de caracteres se cambió para admitir la sintaxis estándar de SQL completa. Esto
significa que un literal puede ser "interrumpido" por un espacio en blanco o un comentario. Esto se puede usar, por
ejemplo, para dividir un literal largo en varias líneas o proporcionar comentarios en línea.
<literal de cadena de caracteres> ::=
[ <presentador> <especificación de conjunto de
caracteres> ] <comilla> [ <representación de caracteres>... ]
<comilla> [ { <separador> <comilla> [ <representación de caracteres>... ] <cita> }... ]
<separador> ::=
{ <comentario> | <espacio en blanco> }...
— ISO/IEC 90752:2016 SQL Parte 2: Fundamentos
Ejemplos:
espacio en blanco entre
selección
literal 'ab' 'cd' de
RDB$DATABASE; salida: 'abcd'
comentario y espacio en blanco entre literal
select 'ab' /* comentario */ 'cd' from
RDB$DATABASE;
salida: 'abcd'
Sintaxis literal de cadena binaria estándar de SQL completo
Adriano dos Santos Fernández
Ticket de seguimiento: https://github.com/FirebirdSQL/firebird/issues/5588
La sintaxis de los literales de cadenas binarias se cambió para admitir la sintaxis estándar de SQL completa. Esto
significa que un literal puede contener espacios para separar caracteres hexadecimales y puede ser "interrumpido" por
espacios en blanco o un comentario. Esto se puede usar, por ejemplo, para hacer que la cadena hexadecimal sea más
legible agrupando caracteres, o para dividir un literal largo en varias líneas, o proporcionar comentarios en línea.
<literal de cadena binaria> ::=
X <comilla> [ <espacio>... ] [ { <hexágono> [ <espacio>... ] <hexágono> [ <espacio>... ] }... ] <
comilla>
[ { <separador> <comilla> [ <espacio>... ] [ { <hexit> [ <espacio>... ]
42
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
<hexit> [ <espacio>... ] }... ] <comilla> }... ]
— ISO/IEC 90752:2016 SQL Parte 2: Fundamentos
Ejemplos
Grupo por byte (espacio en blanco dentro del literal)
seleccione _win1252 x'42 49 4e 41 52 59' de
RDB$DATABASE;
salida: BINARIO
espacio en blanco entre selección
literal _win1252 x'42494e'
'415259'
de RDB$DATABASE;
salida: BINARIO
El uso del introductor _win1252 en el ejemplo anterior es una extensión no estándar y
equivalente a una conversión explícita a un CHAR de longitud adecuada con el juego de
caracteres WIN1252.
Nuevas expresiones y funciones integradas
UNICODE_CHAR y UNICODE_VAL
Adriano dos Santos Fernández
UNICODE_CHAR
Devuelve el carácter UNICODE con el punto de código especificado.
Sintaxis:
UNICODE_CHAR( <número> )
El argumento para UNICODE_CHAR debe ser un punto de código UNICODE válido y no estar
en el rango de suplentes alto/bajo (0xD800 a 0xDFFF), de lo contrario arroja un error.
Ejemplo:
seleccione unicode_char(x) de y;
UNICODE_VAL
Devuelve el punto de código UNICODE del primer carácter de la cadena especificada, o cero si la cadena es
43
Machine Translated by Google
Capítulo 9. Lenguaje de manipulación de datos (DML)
vacío.
Sintaxis:
UNICODE_VAL( <cadena> )
Ejemplo:
seleccione unicode_val(x) de y;
44
Machine Translated by Google
Capítulo 10. Utilidades de supervisión y línea de comandos
Capítulo 10. Utilidades de supervisión y línea de
comandos
Las mejoras y adiciones a los servicios públicos de Firebird continúan.
Supervisión
Nuevas mesas virtuales:
RDB$ PALABRAS CLAVE:
RDB$PALABRA CLAVE_NOMBRE
nombre de la palabra clave
RDB$KEYWORD_RESERVED Si la palabra clave es una palabra reservada
MON$COMPILED_STATEMENTS:
MON$COMPILED_STATEMENT_ID ID de extracto compilado
MON$SQL_TEXT Texto de la consulta SQL
MON$EXPLAINED_PLAN Plan (en la forma explicada) de la consulta SQL
MON$OBJECT_NAME Nombre del objeto PSQL
MON$OBJECT_TYPE tipo de objeto PSQL
MON$PAQUETE_NOMBRE Nombre del paquete del objeto PSQL
MON$STAT_ID ID de estadísticas de tiempo de ejecución (hace referencia a las tablas MON$*_STATS)
Nuevas columnas en las tablas:
En MON$ADJUNTOS:
MON$SESSION_TIMEZONE Zona horaria real de la sesión
En MON$DECLARACIONES:
MON$COMPILED_STATEMENT_ID ID de declaración compilada (referencias MON$COMPILED_STATEMENTS)
En MON$CALL_STACK:
MON$COMPILED_STATEMENT_ID ID de declaración compilada (referencias MON$COMPILED_STATEMENTS)
En SEC$GLOBAL_AUTH_MAPPING:
SEC$DESCRIPTION Descripción textual
45
Machine Translated by Google
Capítulo 10. Utilidades de supervisión y línea de comandos
isql
Unifique la visualización de los procedimientos y paquetes del sistema con otros objetos del sistema
alex peshkov
Boleto de rastreador: #7411
El comando SHOW SYSTEM de isql ahora enumera los paquetes del sistema y sus procedimientos.
Actualmente no se muestran las funciones de los paquetes del sistema. Esto es rastreado por #7475.
gbak
Copia de seguridad/restauración en paralelo
Vlad Khorsun
Boletos de seguimiento: #1783, #3374
Se ha agregado un nuevo modificador de línea de comandos a gbak: PAR[ALLEL] <N>.
Define cuántos trabajadores paralelos se utilizarán para la tarea solicitada.
Ejemplos de uso:
gbak b par 4 user <nombre de usuario> pass <contraseña> <nombre de base de datos> <nombre de copia de seguridad>
gbak r par 4 user <nombre de usuario> pass <contraseña> <nombre de copia de seguridad> <nombre de base de datos>
arreglar
barrido paralelo
Vlad Khorsun
Boletos de seguimiento: #7447
Se ha agregado un nuevo modificador de línea de comandos a gfix: PAR[ALLEL] <N>.
Define cuántos trabajadores paralelos se utilizarán para la tarea solicitada.
Ejemplo de uso:
gfix sweep par 4 user <nombre de usuario> pass <contraseña> <nombre de base de datos>
46
Machine Translated by Google
Capítulo 10. Utilidades de supervisión y línea de comandos
actualización SAO
dmitri yemanov
Boletos de seguimiento: #7397
Se ha agregado un nuevo modificador de línea de comandos a gfix: UP[GRADE].
Permite actualizar ODS de la base de datos a la última versión secundaria admitida (dentro de la versión principal admitida).
Ejemplo(s) de uso:
gfix upgrade <nombrebd> user <nombre de usuario> pass <contraseña>
47
Machine Translated by Google
Capítulo 11. Problemas de compatibilidad
Capítulo 11. Problemas de compatibilidad
Esta sección enumera las funciones y modificaciones que pueden afectar la forma en que ha instalado y utilizado Firebird en
versiones anteriores.
sql
Cambios que pueden afectar el código SQL existente:
Comportamiento de RETORNO de varias filas
INSERTAR del lado del cliente... Las consultas SELECCIONAR, ACTUALIZAR, ELIMINAR, COMBINAR y ACTUALIZAR O
INSERTAR que contienen la cláusula RETURNING ahora pueden devolver varios registros en lugar de generar el error
"múltiples filas en selección de singleton" como sucedió antes.
Estas consultas ahora se describen como isc_info_sql_stmt_select durante la preparación, mientras que en versiones anteriores
se describían como isc_info_sql_stmt_exec_procedure.
Las sentencias Singleton INSERT … VALUES, así como las sentencias UPDATE y DELETE posicionadas (es decir, las que
contienen la cláusula WHERE CURRENT OF) conservan el comportamiento existente y se describen como
isc_info_sql_stmt_exec_procedure. También conservan la capacidad de ejecutarse dentro de un solo protocolo de ida y vuelta
al servidor.
Sin embargo, todas estas consultas, si se usan en PSQL y se aplica la cláusula RETURNING, aún se tratan como singleton.
Eliminación del protocolo WNET
El protocolo de red WNET (también conocido como Named Pipes, también conocido como NetBEIU) que anteriormente era
compatible con la plataforma Windows se eliminó en Firebird 5.0. Aquellos usuarios de Windows que operaron con cualquier
cadena de conexión WNET (\\servidor\nombrebd o wnet://servidor/nombrebd) deberían cambiar al protocolo INET (TCP) en su
lugar (cadena de conexión servidor:nombrebd, servidor/puerto:nombrebd, inet:/ /servidor/nombrebd, o inet://servidor:puerto/
nombrebd).
Eliminación de QLI
La utilidad de línea de comandos QLI se eliminó en Firebird 5.0, de acuerdo con su anuncio de obsolescencia publicado en las
notas de la versión de Firebird 4.0.
48
Machine Translated by Google
Capítulo 12. Errores corregidos
Capítulo 12. Errores corregidos
Versión Firebird 5.0 Beta 1: Corrección de errores
Esta sección enumera solo las correcciones de errores que aún no se han solucionado en versiones anteriores de Firebird.
motor central
#7422 — Buscar en el nivel de blob temporal 0 hace que la lectura devuelva datos incorrectos
Arreglado por Adriano dos Santos Fernandes
#7388 — Optimización de diferentes invariantes entre vistas y CTE
Reparado por Dmitry Yemanov
#7304 — Los eventos en los archivos adjuntos del sistema (como el recolector de basura) no se rastrean
Reparado por Alex Peshkov
#7227 — Las dependencias de las subrutinas no se conservan después de la restauración de la copia de seguridad
Arreglado por Adriano dos Santos Fernandes
#7220 — Dependencia de TIPO DE COLUMNA no rastreada en el encabezado del paquete y rutinas externas
Arreglado por Adriano dos Santos Fernandes
#7183 — Regresión cuando la tabla derivada tiene una columna evaluada como resultado de una subconsulta con predicado IN, ANY o ALL: "BLR no
válido en el desplazamiento.../el contexto ya está en uso"
Arreglado por Adriano dos Santos Fernandes
#7164 — Las combinaciones multidireccionales hash/merge son imposibles para las claves basadas en expresiones
Reparado por Dmitry Yemanov
#7133 — ORDER BY para valores int128 grandes (>34 dígitos) se interrumpe cuando se usa el índice en ese campo
49
Machine Translated by Google
Capítulo 12. Errores corregidos
Reparado por Alex Peshkov
#7077 — EJECUTAR BLOQUE (sin DEVOLUCIONES) no funciona con lotes
Arreglado por Adriano dos Santos Fernandes
#7009 — IReplicatedTransaction recibe un evento de punto de guardado incorrecto
Reparado por Dimitry Sibiryakov, Dmitry Yemanov
#6942 — Error de singleton incorrecto con MERGE y RETURNING
Arreglado por Adriano dos Santos Fernandes
#6869 — La expresión CHECK del dominio se puede ignorar cuando DROP objetos que están involucrados en él
Arreglado por Adriano dos Santos Fernandes
#6807 — Regresión: error "Fin de comando inesperado" con información de línea/columna incorrecta
Arreglado por Adriano dos Santos Fernandes
#5749 — Error de "Token desconocido" en el formulario de la consulta
Arreglado por Adriano dos Santos Fernandes
#3812 — La consulta con un procedimiento almacenado no acepta un plan explícito
Reparado por Dmitry Yemanov
#3218 — Optimizer falla al aplicar predicados locales de flujo antes de la fusión
Reparado por Dmitry Yemanov
El servidor se bloquea/colga
#7195 — Bloqueo al acceder a la memoria ya borrada en el módulo de clasificación
50
Machine Translated by Google
Capítulo 12. Errores corregidos
Reparado por Andrey Kravchenko
Utilidades
gbak
#7436 — Error de copia de seguridad para tabla ancha
Reparado por Alex Peshkov
51
Machine Translated by Google
Capítulo 13. Equipos de proyecto Firebird 5.0
Capítulo 13. Equipos de proyecto Firebird 5.0
Tabla 1. Equipos de desarrollo de Firebird
implementador de características SQL
Marcos Rotteveel El implementador y cocoordinador de Jaybird;
Países Bajos Escritor de documentación
Martín Koeditz Alemania Desarrollador y coordinador del controlador PHP
Traductor de documentación
52
Machine Translated by Google
Apéndice A: Aviso de licencia
Apéndice A: Aviso de licencia
El contenido de esta Documentación está sujeto a la Licencia de Documentación Pública Versión 1.0 (la “Licencia”); solo puede
usar esta Documentación si cumple con los términos de esta Licencia.
Las copias de la Licencia están disponibles en https://www.firebirdsql.org/pdfmanual/pdl.pdf (PDF) y https://www.firebirdsql.org/
manual/pdl.html (HTML).
La documentación original se titula Firebird 5.0 Release Notes.
El escritor inicial de la documentación original es: Helen Borrie. Las personas nombradas en las atribuciones son Contribuyentes.
Derechos de autor © 20042023. Reservados todos los derechos. Contacto inicial del escritor: helebor at users punto sourceforge
punto net.
53