MTBASE / SYBASE DE COLOMBIA
 
Búsqueda avanzada...

ASE Quiz > ASE Quiz 2008

ASE Quiz – 2008

Preguntas y Respuestas sobre temas de administración, solución a problemas, rendimiento, afinamiento y monitoreo de Adaptive Server Enterprise.

Vea aquí preguntas y respuestas de otros años…


Noviembre

A usted, como DBA, se le pide llevar a cabo el afinamiento del rendimiento de una aplicación recientemente instalada, desarrollada por un tercero y para la cual usted no cuenta con la posibilidad de modificar ni visualizar el código fuente.

Pregunta: ¿Qué opción ofrece ASE 15.0 para llevar a cabo el afinamiento de una aplicación con tales características?

Respuesta:
En el boletín de diciembre.


Octubre

A parte de las tablas MDA, en la versión 15.0 de ASE se incorporó un nuevo mecanismo para la recolección de métricas de procemiento de consultas.

Pregunta: ¿Conoce usted de qué mecanismo se trata y cómo funciona?

Respuesta:
La versión 15.0 de ASE introdujo el mecanismo conocido como “Query Metrics Capture”. Este mecanismo permite capturar métricas sobre consultas ejecutadas, tales como tiempo transcurrido y número de operaciones de lectura / escritura. Las métricas capturadas son accesibles a través de la vista sysquerymetrics, ubicada en la base de datos en donde se ejecuta la consulta.

Para habilitar (o desahabilitar) la captura de métricas se utiliza el parámetro de configuración enable metrics capture; el valor 1 habilita la captura de métricas, mientras que el valor 0 (predeterminado) la deshabilita. Por ejemplo, el siguiente comando habilita la captura de métricas a nivel de servidor:

sp_configure "enable metrics capture", 1
go

Se debe tener cuidado de no habilitar la captura sin un filtrado adecuado, ya que en servidores muy congestionados se pueden generar grandes volúmenes de información. Los filtros se pueden establecer a través de los siguientes parámetros de configuración de ASE:

  • metrics elap max
  • metrics exec max
  • metrics lio max
  • metrics pio max

La captura también se puede habilitar a nivel de sesión con el comando set metrics_capture { on | off }. Por ejemplo, el siguiente comando habilita la captura de métricas para un usuario:

set metrics_capture on
go

Adicionalmente, el procedimiento almacenado sp_metrics permite gestionar las métricas capturadas.


Septiembre

Pregunta: En ASE 15.0, ¿cuál es el procedimiento almacenado del sistema que permite ver o cambiar la configuración de licenciamiento?

Respuesta:
En ASE 15.0 se incorporó el nuevo procedimiento almacenado del sistema sp_lmconfig. Este procedimiento permite visualizar y modificar atributos de la licencia, tales como el tipo de licencia y la edición del producto.

Para visualizar atributos de la licencia, use sp_lmconfig sin parámetros:

1> sp_lmconfig
2> go

 Parameter Name    Config Value
 ----------------- ------------
 edition           XE
 license type      CP
 smtp host         smtp
 email recipients 
 email severity    NONE
 smtp port         25
:

Este ejemplo muestra que la edición sobre la que se está corriendo es una “Express Edition” (o “XE”), y que el tipo de licenciamiento es por CPU (“CP”).

El siguiente ejemplo muestra cómo cambiar, por ejemplo, la edición del producto; esto puede ser útil si al momento de hacer la instalación inicial de ASE 15.0, usted especificó una edición incorrecta del producto:

1> sp_lmconfig "edition", "SB"
2> go

En éste ejemplo, se cambia la edición a “SB” o “Small Business Edition”; otros valores válidos son “EE” para “Enterprise Edition” o “DE para “Developers Edition”. Note, sin embargo, que para que éste cambio surta efecto, usted debe tener el archivo de licencia adecuado y debe reiniciar su servidor ASE.

En éste último ejemplo se hace un cambio del tipo de licenciamiento a “Enterprise Edition” o “SB”:

1> sp_lmconfig "license type", "EE"
2> go

Igual que con el ejemplo previo, para que el cambio surta efecto usted debe tener la licencia adecuada.

Es importante anotar que un cambio inadecaudo en la edición del producto o en el tipo de licencia puede tener como consecuencia que el servidor no arranque– siempre verifique que los valores especificados coinciden con los de su licencia.


Agosto

Continuando con el tema de las funciones, ¿qué función del sistema en ASE permite conocer estadísticas de una tabla, índice o partición?

Respuesta:
Una forma rápida de obtener estadísticas de un objeto de la base de datos (tabla, índice o partición) es a través de la función derived_stat(). La sintaxis de la función es la siguiente:

derived_stat( { object_name | object_id }, { index_name | index_id } [, ptn_name | ptn_id ], 'statistic' )

Por ejemplo, para obtener el “data page cluster ratio” (dpcr) de la tabla titles se puede usar un comando como el siguiente:

1> select derived_stat( 'titles', 'titleind', 'dpcr' )
2> go
---------------------------
1.000000

El parámetro statistic puede tomar cualquiera de los valores descritos en la siguiente tabla:

Nombre Completo Abreviación
data page cluster ratio dpcr
index page cluster ratio ipcr
data row cluster ratio drcr
large io efficiency lgio
space utilizaction sput

Esta función fue incorporada en la versión 12.5.0.3; el parámetro ptn_name (o ptn_id) fue incorporado en la versión 15.0.


Julio

Pregunta: En ASE, ciertas operaciones con mínimo registro de log evitan la ejecución del comando dump tran y obligan a realizar una copia de respaldo de la base de datos completa con dump database. En ASE 15, ¿cuál es la forma más fácil de determinar si es posible ejecutar el comando dump tran (sin necesidad de ejecutar el comando dump tran)?

Respuesta:
A parte de usar el comando dump tran mismo para validar si es posible respaldar el log de transacciones de una base de datos, en la versión 15.0 se incorporó la función del sistema tran_dumpable_status():

tran_dumpable_status( nombre_db )

Esta función arroja 0 cuando el log de transacciones de la base de datos especificada puede ser respaldado. De lo contrario, arroja un mapa de bits indicando las razones por las que esto no es posible:

Bit Razón
1 La base de datos especificada no existe
2 El log de transacciones no está en un dispositivo separado
4 La primera página del log está sobre un fragmento de datos
8 La opción 'trunc log on chkpt' está habilitada
16 Ocurrieron escrituras “non-logged” en la base de datos
32 Se ejecutó dump tran ... with truncate_only en la base de datos
64 La base de datos es nueva o actualizada; se requiere primero un dump database

Por ejemplo, si la función arroja el valor 106, quiere decir que los bits 64, 32, 8 y 2 están prendidos (select 64 | 32 | 8 | 2 = 106).

La función hace que sea más fácil programar scripts Transact-SQL, menos propensos a errores de ejecución; por ejemplo, el siguiente script respalda el log de la base de datos pubs3 sólo cuando es posible hacerlo:

if tran_dumpable_status( 'pubs3' ) = 0
dump tran pubs3 to 'C:\sybase\pubs3.dmp'
else
print 'No fue posible respaldar el log de transacciones'
go

Otro ejemplo, en el que se pregunta por un bit en particular:

if tran_dumpable_status( 'pubs3' ) & 8 = 8
print "Opcion 'trunc log on chkpt' prendida. No es posible respaldar el log."
go

Junio

Pregunta: ¿Es posible definir variables globales en Sybase ASE?

Respuesta:
Es frecuente que los DBAs pregunten si es posible crear sus propias variables globales en ASE. La respuesta a ésta pregunta es si y no, dependiendo del enfoque que se le de al problema. No, usted no puede definir sus propias variables globales como @@nombre_modulo, pero sí, existe una alternativa razonable: es posible implementar sus propias variables globales usando las “funciones de contexto de aplicación”, o “application context functions”.

Para definir una variable global use la función del sistema set_appcontext("nombre_contexto", "nombre_atributo", "value"); por ejemplo, para definir una variable global (o atributo) llamada “Nombre Modulo”, perteneciente a la aplicación (o contexto) “Contabilidad”, cuyo valor sea “presupuestos” ejecute una sentencia T-SQL como la siguiente:

select set_appcontext("Contabilidad","Nombre Modulo","presupuestos")

Una vez definido el atributo, usted puede consultar su valor usando la función del sistema get_appcontext("nombre contexto", "nombre atributo"); por ejemplo, para almacenar el valor del atributo en una variable local, puede hacerlo de la siguiente manera:

declare @modulo varchar(30)
select @modulo = get_appcontext("Contabilidad", "Nombre Modulo")
print @modulo

Así mismo, existen funciones que permiten eliminar un atributo (rm_appcontext) y listar los atributos definidos (list_appcontext).

Algunas restricciones:

  • Cada contexto de aplicación definido es accesible a nivel de una conexión de usuario, así que la sincronización de un cambio en un valor de un atributo entre diferentes conexiones, puede ser difícil.

  • Se debe otorgar permiso de ejecución sobre las funciones set_appcontext y get_appcontext a los logins que lo requieran.

  • Los contextos de aplicación se almacenan en el caché de procedimientos; entre más contextos se definan, mayor será el uso de dicha área de memoria. Para evitar errores 701, es posible que sea necesario ampliar el tamaño del caché de procedimientos.


Mayo

Uno de los problemas que tiene la herramienta isql que acompaña a ASE es que, en algunos casos, la salida es poco legible, por ejemplo, cuando hay columnas muy anchas.

Pregunta: ¿Cómo puede usted “dar formato” a la salida del isql para que ésta sea más legible?

Respuesta:
Para muchos el tema de dar formato a la salida del isql puede ser muy importante. Es por esto que ASE en la versión 15 incorporó el procedimiento almacenado del sistema sp_autoformat. Este procedimiento toma la salida de una consulta, elimina los espacios innecesarios y genera una salida mucho más legible. Veamos un ejemplo:

Al ejecutar la siguiente consulta desde isql:

1> select id, colid, name from syscolumns where id=3
2> go

Se puede producir un resultado como el siguiente:

 id colid
name
----------- ------
-------------------------------------------------------------------------------------
3 1
id
3 2
number
3 3
colid
:
:

el cual, obviamente, es poco legible. Usando sp_autoformat podemos hacer algo así:

1> sp_autoformat "syscolumns","id, colid, name","where id=3"
2> go

Esto produce un resultado como el siguiente:

id colid name
---- ---------- ----------------------
3 1 id
3 2 number
3 3 colid
3 4 status
:
:

el cual, claramente, es mucho más organizado y legible.

El primer parámetro de sp_autoformat es el nombre completo de la tabla, el segundo es la lista de columnas y el tercero es la cláusula where. El sp_autoformat permite, también, especificar una cláusula order by y renombrar columnas, entre otros.

Otra ventaja del sp_autoformat es que el resultado es completamente tabular. De hecho, este procedimiento es usado dentro del código de otros procedimientos almacenados del sistema para mejorar la claridad de los resultados.

Consulte la documentación de ASE para mayor información y más ejemplos.


Abril

Pregunta: ¿Qué son en ASE los “procedimientos almacenados de catálogo” o “catalog stored procedures”?

Respuesta:
Poco conocidos, los “procedimientos almacenados de catálogo” o “catalog stored procedures” son un grupo de procedimientos almacenados usados por las aplicaciones (típicamente las basadas en ODBC) para consultar la información de los objetos de la base de datos. Al contrario de otros procedimientos almacenados del sistema, estos procedimientos arrojan un único conjunto resultado. Aquí algunos ejemplos:

  • sp_tables – Muestra información sobre tablas de usuario, tablas del sistema, vistas, etc.

sp_tables

  • sp_databases – Lista todas la bases de datos del servidor.

sp_databases

Estos procedimientos, en algunos casos, podrían servir de alternativa a los procedimientos almacenados del sistema normales, sobre todo cuando se trata de consultar la información de objetos del servidor desde una aplicación; esto se debe, como se mencionó antes, a que la información se muestra a través de un único conjunto resultado, al contrario de procedimientos almacenados del sistema, como sp_helpdb, que pueden combinar varios conjuntos resultados e incluso sentencias print, lo que hace más difícil su procesamiento.

Otros procedimientos incluidos en éste grupo son sp_columns, sp_fkeys, sp_server_info, sp_stored_procedures, etc. Para mayor información sobre los “procedimientos almacenados de catálogo” y su sintaxis completa, consulte la documentación de ASE.


Marzo

Pregunta: ¿Cuántas variables globales de ASE nos proporcionan información sobre la versión del producto? Si hay más de una, ¿qué diferencia hay entre ellas?

Respuesta:
La variable global más frecuentemente usada para obtener la versión de ASE es @@version:

1> select @@version
2> go
----------------------------------------------------------
---------------------------------------------------------------------------
Adaptive Server Enterprise/15.0.2/EBF 14331/P/Linux Intel/Linux 2.4.21-47.ELsmp
i686/ase1502/2486/32-bit/FBO/Thu May 24 08:15:50 2007

La variable @@version es la que nos da la información más completa sobre la versión de ASE: versión mayor y menor, EBF, ESD, plataforma, etc.

Sin embargo, existen otras dos variables, poco conocidas, que también nos dan información sobre la versión de ASE. La primera de ellas es la variable @@version_as_integer, incorporada en ASE 12.5:

1> select @@version_as_integer
2> go
-----------
15000

Esta variable almacena un número entero que representa la versión mayor (en algunos casos menor) del servidor ASE. Es decir, para las versiones 15.0, 15.0.1 y 15.0.2 siempre arrojará el valor 15000. Para las versiones 12.5, 12.5.1 y 12.5.4 arrojará el valor 12500.

Por otra parte, existe la variable @@version_number, introducida en ASE 12.5.2; el valor entero almacenado en ésta otra variable representa las versiones mayor y menor del servidor ASE:

1> select @@version_number
2> go
-----------
15020

Lo anterior quiere decir que la versión 15.0.2 arrojará el valor 15020, la versión 15.0.1 arrojará 15010, la versión 12.5.4 arrojará 12540, etc.

¿Cuál es la utilidad de éstas variables globales? Eventualmente podrían ser usadas dentro de un procedimiento almacenado, por ejemplo, para validar si el procedimiento aplica para determinada versión de ASE o no:

create procedure mi_procedimiento
as
if @@version_number < 15000
begin
raiserror 21000 "Este procedimiento no se puede ejecutar en versiones anteriores a la 15.0"
return -1
end
:
/* El resto del procedimiento */
:

Febrero

La versión 15 de ASE incluye la nueva herramienta Interactive SQL (o DBISQL) la cual permite, entre otras cosas, la ejecución de sentencias T-SQL. Pregunta: ¿Que opción ofrece el DBISQL para exportar rápidamente el contenido de una tabla de ASE hacia un archivo plano?

Respuesta:
El Interactive SQL (o DBISQL) incorpora, entre otros, el comando output, el cual permite exportar rápidamente el contenido de una tabla de ASE hacia un archivo plano, usando diferentes formatos; la sintaxis del comando es la siguiente:
output to filename
[ append ]
[ verbose ]
[ format output-format ]
[ escape character character ]
[ escapes { on | off}
[ delimited by string ]
[ quote string [ all ] ]
[ column widths (integer , . . . ) ]
[ hexidecimal { on | off | asis } ]
[ encoding encoding ]

donde:

output-format: ascii | dbase | dbasell| dbaselll | excel | fixed | foxpro | lotus | sql | xml
encoding: string o identifier

Lo primero que hay que tener en cuenta para usar el comando output es que éste debe ir precedido de una sentencia select, la cual define la cantidad de registros y columnas que se desean exportar. Por ejemplo, el siguiente comando exporta todas las filas de la tabla mi_tabla al archivo plano C:\mi_tabla.txt, usando formato ASCII:

select * from mi_tabla
go
output to 'c:\mi_tabla.txt'

Este otro ejemplo exporta los datos de la tabla, usando formato XML:

select * from mi_tabla
go
output to 'c:\mi_tabla.xml'
format xml

Otro punto que se debe tener en cuenta es que el archivo generado es local a la máquina en donde corre el DBISQL; esto podría tener implicaciones de rendimiento si usted exporta las filas de una tabla que se encuentra en un ASE remoto (por ejemplo, si el DBISQL corre en Windows, y ASE corre en un máquina Linux), ya que la red se puede convertir en un cuello de botella importante. Adicionalmente, es muy posible que el rendimiento del utilitario bcp de Sybase sea muy superior al  del comando output del DBISQL, así que no sería recomendable usar output para exportar grandes volúmenes de datos.

Por último, recuerde que el comando output es propio del DBISQL—NO es una sentencia T-SQL; lo anterior quiere decir que el comando output NO funcionará en herramientas como el isql o el SQL Advantage. Hay más información sobre el comando output, y de otros comandos, en la ayuda del DBISQL.


Enero

Pregunta: Continuando con el tema de la manipulación del log de errores de ASE, supongamos que usted desea agregar un mensaje o una línea de texto al log de errores de ASE. ¿Cuál sería la forma más fácil de hacerlo? (Pista: sólo se requiere un comando Transact-SQL).

Respuesta:
Básicamente existen en ASE dos maneras de agregar un mensaje o línea de texto al log de errores de ASE, a través de los siguientes comandos T-SQL:
  • dbcc logprint( 'texto' [ , 'texto' ]... )
  • dbcc printolog( 'texto' )

Estos comandos se podrían incluir dentro de scripts de mantenimiento (update statistics, dbcc, etc.) o de copia de respaldo, o sencillamente para documentar algún tipo de evento en el log de errores de ASE. Por ejemplo, un comando como el siguiente se podría usar para enviar un mensaje de error al log de errores, al producirse un error en la ejecución de un comando particular:

if @@error != 0
dbcc printolog('****** Hubo error en el comando CREATE TABLE... ******')

Si se cumple la condición (@@error es diferente a cero), se agrega una línea como la siguiente al log de errores de ASE:

01:00000:00122:2008/02/19 15:41:27.38 server ****** Hubo error en el comando CREATE TABLE... ******

 
 Inicio   Sobre MTBASE   Sobre Sybase   Empleos en MTBASE   Mapa del Sitio   Aspectos Legales y Políticas de Privacidad