Entradas

Mostrando las entradas con la etiqueta Sql Server

Sentencias lentas en SQL Server 2008.

Imagen
Una aplicación GeneXus, tenia una sentencia SQL parecida a esta: SELECT T1.[SKMovId], T1.[SKMovFch], T2.[DepositoId], T2.[DepositoTipo], T1.[ProductoId], T1.[SKMovCantidad] FROM ([SKMovimientos] T1 WITH (NOLOCK) INNER JOIN [Depositos] T2 WITH (NOLOCK) ON T2.[DepositoId] = T1.[DepositoId]) WHERE (T1.[SKMovFch] >= @AV6cFechaInicial) AND (T1.[ProductoId] = @AV9cProductoId) AND (T2.[DepositoTipo] = @AV7cDepositoTipo) Hace un join entre dos tablas SKMovimientos que tiene cientos de miles de registros y Depositos que tiene menos de 10 registros . Demoraba 24 segundos y devolvía 17 registros. Extremadamente lenta. Viendo el plan de ejecución de la sentencia pudimos ver que utilizaba un índice incorrecto en la tabla SKMovimientos. Hacer un select en la tabla SKMovimientos sola, sacando la condicion que restringe por DepositoTipo y era instantánea y utilizaba el índice adecuado. Revisando las estadísticas y tenia la creación de estadísticas y su actualización e...

Resource Governor in SQL Server 2008.

Imagen
De casualidad conocí una funcionalidad que viene llamada Resource Governor con SQL Server 2008 (Enterprise y Developer) que permite limitar la cantidad de CPU y Memoria que utilicen un grupo de usuarios o aplicaciones.  Se establece un mínimo y un máximo que pueden usar un conjunto de usuarios o aplicaciones. Esta bueno para hacer que un conjunto de usuarios siempre tengan recursos disponibles (por ejemplo los que tienen que atender publico y necesitan muy buenos tiempos de respuesta) y no se vean afectados por consultas pesadas que puedan haber hecho otros usuarios (como pueden ser consultas del tipo OLAP). También es bueno para limitar que las tareas de administración de la base de datos (defragmentación, copia de datos, etc) no afecten demasiado en el rendimiento del sistema. Otro escenario posible, es cuando se pone en producción un nuevo modulo, el cual no se tiene dimensionado con exactitud cual puede ser...

COSTA RICA: Noticias del TICA (Tecnologia de Informacion para el Control Aduanero)

Algunas novedades del TICA (sistema aduanero que funciona en la Aduana de Costa Rica, desarrollado por Concepto y la Aduana de Costa Rica). Desde la semana pasada, estamos con SQL Server 2008 . Fue una migración con algunas dificultades y atrasos (estaba prevista para diciembre), pero la causa fue que no era posible parar el sistema durante una noche entera. El sistema desarrollado con GeneXus 9.0 reaccionó muy bien y tuvimos que cambiar pocos programas, que generaban sentencias lentas o problemáticas. En este momento, aunque el uso de CPU en el servidor es un poco mas alto que con SQL Server 2000, los tiempos de respuesta en la aplicación son mejores que antes. Esta semana, entra en producción un módulo de control de Zonas Francas, que va a permitir tener un registro mas detallado que el actual sobre las operaciones que se realizan en dicho régimen, que es muy importante en las exportaciones de Costa Rica. Por otro lado, el Ministerio de Hacienda frena avance de Tributación di...

Consultorio Tecnologico: SQL Server 2005 Data Partitioning

Imagen
En los comentarios del post anterior plantearon la siguiente pregunta:  ACOSTA : Le dejo una pregunta… ¿ha probado el partitioning del Sql Server 2005?  Andamos necesitando pasar varios millones de registros a una base histórica, y me han comentado que es una alternativa que nos puede dar la solución con poco trabajo… ¿funcionarán bien las reorg de gx?  ¿Será performante el correr las condiciones de la partición? Cualquier dato será bienvenido. Un abrazo y estaremos al alpiste de sus sabias palabras, a ver si nos puede dar una manito. Si bien no he probado esta característica en SQL Server 2005, si lo he utilizadon en otras bases de datos.  La funcionalidad básica, esta explicada aqui , por lo que no voy a entrar en demasiados detalles.  Lo fundamental, es que se puede partir una tabla y también los índices de una determinada tabla, en diversos pedazos. Por ejemplo, en el caso de datos de auditorías, se puede guardar informacion separada por MES.  Para la utilización de esta funcionali...

RML Utilities for SQL Server

Imagen
En RML Utilities for SQL Server hay un conjunto de utilitarios para el procesamiento de archivos de trace (generado con el SQL Server Profiler) para SQL Server 2000, 2005 y 2008. En la pagina que los explican dice: You can use the RML Utilities for SQL Server to perform the following tasks: • You can determine the application, the database, the SQL Server login, or the query that is using the most resources. • You can determine whether the execution plan for a batch is changed when you capture the trace for the batch. Additionally, you can use the RML Utilities for SQL Server to determine how SQL Server performs each of these execution plans. • You can determine the queries that are running slower than before. Hay un utilitario que se llama ReadTrace, que permite cargar los trace y hacer unos lindos reportes. Tambien hay otros utilitarios, que permiten ejecutar sentencias muchas veces y simular muchos usuarios, que puede ser muy bueno para hacer teste de cargas. Links interesantes. R...

Ejecutar comandos para todas las bases SQL server de un servidor

Imagen
Ahora que GeneXus guarda las KB en bases de datos SQL Server, se me multiplicaron la cantidad de bases que tengo que "administrar".  Hoy tengo 38 KB y algunas de ellas tienen la base de datos correspondiente al modelo. En total, tengo 62 bases de datos SQL Server.  Mis tareas mas habituales de administración son :  Backup Chequear que no tengan problemas de integridad Defragmentar los indices Recuperar el espacio no utilizado dentro de los archivos de la base de datos.  Aunque ultimamente me ha tocado enfrentarme a la tareas de DBA, no son mi especialidad ni me atraen demasiado. Encontre este stored procedure (no documentado) que no conocía que permite ejecutar un comando para todas las bases existentes.  --Comprueba la integridad física y lógica de todos los objetos de la base de datos especificada EXEC sp_msforeachdb 'DBCC CHECKDB("?")' --recupera espacio no utilizado en las base de datos EXEC sp_msforeachdb 'DBCC SHRINKDATABASE ("?")' -...

To bind or not to bind: that is the question

Imagen
Tenemos un programa que hace en GeneXus:  for each       where ATT1=&Var1 .or. &Var1='TODOS'   //Los puntos en el or son para darle olor a viejo            where ATT2=&Var2 .or. &Var2='TODOS'          Msg('Cuantos registros tiene esta tabla!!!' +  Clave) endfor Esto va a generar una sentencia mas o menos asi: SELECT CLAVE, ATT1, ATT2 FROM TABLAGRANDE WHERE (ATT1= @AV6969VAR1 OR @Av6969Var1 ='TODOS') AND (ATT2= @AV6968VAR2 OR @AV6968VAR2 ='TODOS') ORDER BY CLAVE En la base de datos, las sentencia tiene una parte fija, y las variables, cambian en cada corrida, de form que el DBMS puede reutilizar la navegación y no necesita recompilar la sentencia, cuando cambian los valores de la variable. Esto deja a los DBA contentos.  Que inconvenientes trae esto? Generalmente estas sentencias, aparecen en la lista de sentencias que consumen mucho, pues los OR hacen que se consuman mas recursos que los necesarios.  Que opción tenemos para mejo...

SQL Server 2005 Profiler

Imagen
Estaba haciendo una prueba de carga de una aplicacion GeneXus, de la cual estamos por liberar una nueva versión.  Es una aplicación java y la base de datos es SQL Server 2005.  La idea de la prueba, era ver si los cambios que se habian hecho al modelo de datos, permitia ejecutar las consultas existentes, con un tiempo de respuesta razonable.  Para poder identificar los mayores problemas de performance tenemos una metodología bastante aceitada:  Capturar las sentencias que demoran en la base de datos. Capturar los locks en la base de datos.  Identificar que objetos GeneXus ejecutan dichas sentencias.  Tratar de optimizar los objetos GeneXus para mejorar la performance (cambiar los for each, poner when, mejorar la programacion, etc).  Tratar de optimizar la ejecucion de la sentencias (crear nuevos indices, estadisticas, planes de ejecucion, fragmentacion, etc) Minimizar los bloqueos (analizar la forma en que se bloquean las aplicaciones) Usando el SQL Server 2005 Profiler, para capturar ...

Como crear un script que haga inserts de los registros de una tabla (SQL Server)

PROBLEMA: Tengo una tabla con registros y quiero llevar estos registros a otra tabla con el mismo nombre en otra base de datos, en un servidor que no están conectados. En Creates a data insert script from a table , Nigel Rivett publica un script bueno para crear las sentencias insert, con los valores de tablas que ya existen. Es bueno para pasar los registros que me funcionan correctamente en el ambiente de desarrollo a produccion, a traves de un script. Copio el script para crear el stored procedure, que luego puede usarse para crear el script. Me resultó muy util. Tiene un problema con el formato de las fechas, pero es facilmente solucionable. if exists (select * from sysobjects where id = object_id(N'[dbo].[sp_CreateDataLoadScript]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[sp_CreateDataLoadScript] GO Create Procedure sp_CreateDataLoadScript @TblName varchar(128) as /* exec sp_CreateDataLoadScript 'MyTable' */ create table #a (id int ...

En busca de las reorganizaciones perdidas.

Imagen
Como contaba en el post anterior , uno de nuestros clientes tenia un problema pues habia perdido alguna reorganizacion. El escenario de trabajo es este: * KB centralizada, donde mas de una persona consolida los cambios y genera reorganizaciones. Esta en .NET y SQL Server 2000. * Base de datos de Pre-Produccion donde se realizan los cambios con las reorganizaciones Genexus * Base de datos de Producción, donde se ejecutan las mismas reorganizaciones que en pre-producción. El problema se daba porque se habían generado 2 reorganizaciones y no se había salvado la anterior. Por lo tanto, no se tenían todas las reorganizaciones para ejecutar en PRODUCCION. La situación empeoraba, porque la segunda reorganización necesitaba cambios realizados en la reorganización anterior. Para arreglar esto, teníamos varias opciones. La que me resulto mas sana, porque solucionaba varios problemas a la vez, era comparar la base de datos que GeneXus pensaba que tenia, con la base de datos real y sincronizar las...

Indices de la base de datos, una complejidad escondible.

Imagen
Desde hace unos días, una de las bases de datos SQL Sever mas grandes de nuestros clientes, está felizmente migrada a SQL Server 2005. En todas estas migraciones suceden algunos desajustes y cosas que andaban rápido pasan a demorar y otras que demoraban funcionan mucho mas rápido. Esto me dio la oportunidad de evaluar "en serio" las herramientas de tunning que vienen con esta versión de la base de datos, y realmente me dejó muy gratamente sorprendido. Las herramientas que existen en esta versión son mas o menos las mismas que las que existian en SQL Server 2000 aunque todas fueron re-bautizadas. Lo que si mejoró mucho fue la integración entre las mismas, y la usabilidad que tienen. Lo que antes implicaba un trabajo manual muy grande y muy propenso a errores, ahora se puede realizar mucho mas facilmente. Por ejemplo si se tiene una determinada aplicación que esta funcionando lento, se puede capturar con el Profiler las sentencias ejecutadas, luego dicha carga se lo pasa al En...

Plan Guides - Buena característica de SQL Server 2005

En este post anterior, contaba un problema que se nos estaba dando en una instalación con una consulta muy sencilla, por clave primaria en una tabla unos 300.000 únicamente y que ejecutaba en forma muy pobre. El problema se daba cuando se ejecutaba en servidores con 4 procesadores y Microsoft SQL Server 2000, con SP4. Buscando soluciones, encontré que para SQL Server 2005, existen los " Plan Guides ", que es una forma de agregar hints o forzar planes de ejecución en sentencias SQL sin tener que modificar la misma. Si bien deberían ser usados con precaución, son una bendición para cuando estamos optimizando programas de los cuales no disponemos los fuentes, o aplicaciones GeneXus (u otros generadores de código), donde no se pueden agregar hints en forma fácil. Si hubiésemos estado en SQL Server 2005, podríamos haber forzado la ejecución por indice de la clave primaria, sin tener que hacer otras modificaciones. Hay mas información en Understanding Plan Guides : "SQL Ser...

SQLServer 2000 me mantiene divertido...

Estaba analizando algunas sentencias que estaban lentas en un servidor de producción. Había una que era muy sencilla, pero que realizaba muchas lecturas, a pesar de tener la clave primaria instanciada, por lo que me puse a analizarla con un poco mas de detalle. La tabla es bien sencilla y tiene Tabla [TRVIAJE] *TrVjId N(16) //Numero del viaje TrVjSts C(3) //estado TrVjFch Date //fecha del viaje. En el Query Analyzer hago DECLARE @TRVJID DECIMAL(16, 0) SET @TRVJID=1000 SELECT TRVJID, TrVjSts FROM TRVIAJE (NOLOCK) WHERE TRVJID=@TRVJID ORDER BY TRVJID El plan de ejecución es (que es el adecuado) |--Clustered Index Seek(OBJECT:([Base].[dbo].[TRVIAJE].[PK__TRVIAJE__4AD81681]), SEEK:([TRVIAJE].[TRVJID]=[@TRVJID]) ORDERED FORWARD) Pero si hago DECLARE @TRVJID DECIMAL(18, 0) --Cambio de 16 a 18 el largo de la variable SET @TRVJID=1000 SELECT TRVJID, TrVjSts FROM TRVIAJE (NOLOCK) WHERE TRVJID=@TRVJID ORDER BY TRVJID el plan de ejecución elegido es: |--Bookmark Lookup(BOOKMARK:([Bmk1000]...

Costa Rica: Aduana de Limón entró sin problemas a sistema electrónico

Imagen
En Aduana de Limón entró sin problemas a sistema electrónico entre otras cosas dice: La aduana de Limón comenzó ayer sin problemas la implementación del Sistema de Tecnología de Información para el Control Aduanero (TICA). Autoridades de la aduana, así como trabajadores de distintas agencias aduanales, confirmaron que no hubo inconvenientes ni “percances” por el cambio al sistema tecnológico. Este sistema interconecta los puestos aduaneros por medios electrónicos y elimina los trámites en papel. Ayer por la tarde el movimiento en esa aduana fue normal y en el puerto Alemán la salida de contenedores no tuvo contratiempos, según lo confirmó La Nación. y Soporte. Por su parte, Guillermo Zuñiga, ministro de Hacienda, dijo que ayer se hizo una revisión de los sistemas con asistencia de los técnicos de Uruguay que vinieron a dar mantenimiento al TICA. Parece que el ministro sigue contento con la actuación nuestra, y el sistema no tuvo grandes inconvenientes (los hubieron, pero los pudimos s...

Diferencia increible entre Oracle y SQLserver

Gabriel me mostró un problema con una webtransaction generada con .NET. Era algo muy sencillo y que funcionaba bien en SQL Server y mal con Oracle, pues no estaba funcionando correctamente cuando habia uno de los elementos de la clave C(2) que tenia 2 blancos. Hicimos la prueba sencilla create table tabla (Campo Char(2)) insert into tabla values(' ') -- Inserto un registro con dos blancos. Oracle 9i SQL Server 2000 select * from tabla where campo=' ' --dos blancos 1 registro seleccionado 1 registro seleccionado select * from tabla where campo=' ' --un blanco 1 registro seleccionado 1 registro seleccionado select * from tabla where campo='' --sin blancos 0 registro seleccionado 1 registro seleccionado Es ent...

Como identificar indices que sobran en SQL Server

Cuando se programa con GeneXus es comun tener bases de conocimiento que subsisten muchos años, con algunas migraciones tecnologicas, como por ejemplo cambios de plataformas. Es comun tambien que en dichos procesos algunas tablas (generalmente las muy usadas) acumulen una cantidad de indices y algunos no siempre son utilizados por la aplicacion. El mantener dichos indices empeora la performance de los inserts y tambien hacen demorar mas al optimizador pues tiene mas opciones para analizar. Leyendo el libro Relational Database Index Design and the Optimizers pude ver cuantificado las demoras que puede ocasionar el tener indices de mas en tablas con millones de registros. Por suerte los muchachos de Microsoft, en SQL Server 2005, mejoraron muchisimo la metadata que se mantiene para ver que indices se utilizan y cuales no. Por ejemplo con la consulta --Indices no usados *** SELECT 'NOUsado',object_name(i.object_id) AS ObjectName , i.name as IndexName ...

SQLServer 64-bits en aduana de Costa Rica.

La semana pasada me toco instalar la primera aplicación desarrollada por Concepto, para una arquitectura en tres capas con .NET en la Aduana de Costa Rica. La plataforma de instalacion, incluye servidores Itanium (un cluster) para correr SQLServer 2000, en su versión de 64 bits. La performance fue muy buena, pero me lleve una desilución grande, cuando vi que no posee Enterprise Manager, por lo que toda la administración hay que hacerla en forma remota. Realmente me parece un paso atras. Por lo demas, la instalación fue todo un exito, pero nos encontramos con un problema, de Kerberos delegation, que necesitamos hacer llegar la identidad del cliente, pasando por el servidor de procesos, hasta la base de datos, y hasta el momento no lo hemos logrado. Contamos con el apoyo de la gente de Microsoft Costa Rica (Gracias!) pero aun no han podido resolverlo. Si alguien sabe como resolver el DOUBLE HOP O KERBEROS DELEGATION, se agradece. Todos los articulos que hemos encontrado en TechNet y MSDN...