|
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:


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... ******
|
|
|