jueves, 9 de febrero de 2012

Comparaciones sin tener en cuenta los acentos en SqlServer

Es muy común que al realizar una consulta a nuestra base de datos, no tengamos en cuenta los acentos como foco de problemas.

Sobre todo, cuando es el propio usuario final el que define la búsqueda.

Como vemos en la imagen, busca comparando la cadena 'ó'.

Pero puedo interesarnos que no solo busque por más sino también por 'o'.

   

Las siglas de Modern_Spanish_CI_AI indican:
CI – Case Insensitive (no tendría en cuenta mayusculas y minusculas)
AI – Accent insensitive (sin tener en cuenta acentos)
Si quieres lo inverso serían poner:
CS – Case sensitive (tiene en cuenta mayusculas y minusculas)
AS – Accent sensitive (tienen en cuenta acentos)

Thanks!!

Enterprise Library Caching (I)

Bueno, continuo con mi andanza en Everis.

Ahora ya no continuo con BizTalk, una pena, pero la vida sigue y el trabajo también.

Estoy preparando un modulo de Cache para el Core de la arquitectura que estamos desarrollando, continuando con la tecnología de MicroSoft Enterprise Library.

Integrare un mini proyecto de prueba para demostrar la configuración y gestionar los archivos en cache, mostrando imágenes de la interfaz de Enterprise Linrary.

Enterprise Library [http://msdn.microsoft.com/en-us/library/ff648951.aspx]. Para esta prueba voy a utilizar la última versión 5.0 de abril del 2010. Es un software gratuito, incluyendo el propio programa, una actualización y los documentos de ayuda.

Continuara ...

martes, 24 de enero de 2012

Mi nueva asignacion: BizTalk (I)

Bueno, hoy ha sido un día delicado, me acaban de asignar un nuevo proyecto por el cual debo aprender BizTalk.

Esta tecnología es muy poco utilizada en la empresa donde trabajo, donde hay miles de personas, pero solo hay una con conocimientos sobre BizTalk.

Esto me ofrece una oportunidad de poder buscar una especialización dentro de la empresa.

Toda la información que vaya recopilando de Webs, Blogs, libros e incluso cursos online e-Lerning de Microsoft.

Thanks!!


lunes, 23 de enero de 2012

DateTime.UtcNow VS DateTime.Now


todas las operaciones internas en las que intervenga una hora deberían hacerse con horas en Tiempo Universal Coordinado, más conocido como UTC. Aunque a algunos pueda parecerles un capricho o un formalismo innecesario, son varias las situaciones en que agradeceremos usar UTC, y no solamente por su invariabilidad, sino también por su eficiencia.

Menos operaciones, menos incertidumbre

Antes de ver los casos caóticos, conviene saber qué tiene de provechoso usar UTC en el día a día. Por ejemplo, en el típico caso en el que queremos medir un lapso de tiempo ocurrido entre dos eventos (normalmente el principio y el final de una operación cuya eficiencia nos interesa especialmente).
DateTime comienzo = DateTime.Now;
// Operaciones cuya duración queremos medir
DateTime fin = DateTime.Now;
TimeSpan duracion = fin - comienzo;
Nuestro objetivo debe ser introducir el menor ruido posible en la medición, por lo que toda operación que no sea parte del conjunto a medir, debería ser lo más rápida posible. Dependiendo de la precisión deseada, puede ser fundamental conocer el funcionamiento interno de DateTime.Now: en primer lugar llama a DateTime.UtcNow, a continuación calcula el desfase horario en función de la zona establecida, y por último verifica si hay que aplicar la corrección por horario de verano. En resumen, DateTime.UtcNow es un par de órdenes de magnitud más rápido que DateTime.Now.
De hecho, en C# es incluso más rápido que la clase Stopwatch, creada ex profeso para este tipo de mediciones de precisión, pero que obviamente aporta más herramientas destinadas a dicho fin. Podemos verlo en este gráfico, obtenido a partir de un benchmarking realizado por Keyvan Nayyeri:

Eficiencia comparada de DateTime.Now, Stopwatch y DateTime.UtcNow

Trabajar con usuarios de todo el mundo sin volverse loco

Si ganar algunos milisegundos no es tu finalidad, no te preocupes, hay más motivos para utilizar UTC. Uno bastante importante es que tu aplicación sea utilizada por usuarios de distintas zonas horarias. Y ni siquiera es necesario que sean de países distintos.
Imagina: tu base de datos tiene un registro del usuario A, que utilizó la aplicación en Las Palmas de Gran Canaria, con hora 09:10; mientras que hay otro registro del usuario B, que utilizó la aplicación en su PC de Córdoba, a las 10:05. Si no recuerdas si la hora guardada se tomó en los clientes o en el servidor, puedes dudar acerca de cuál de los dos es anterior.
Pero es más, puedes encontrarte con este mismo problema con usuarios de una misma zona horaria. Es tan simple como que tu servidor pase a alojarse en un hosting de otro país, y si lo tienes configurado conforme a su información regional, las horas guardadas en él pueden dejar de significar lo que tú crees que significan.

Fatalidad, ocurre lo que no debería ocurrir cuando no debería ocurrir

Pero cuando de verdad se ve lo necesario que es usar datos invariables es en las situaciones excepcionales, aquellas en las que nunca solemos pensar, entre las que cabe destacar los cambios de hora debidos al ahorro energético.
Cambio horario de verano
Y es que el destino caprichoso puede querer que uno de tus usuarios comience una operación a las 2:59 CET del último sábado de marzo… ¡y la termine a las 2:00 CEST de ese mismo día por culpa del cambio al horario de verano! Es poco probable, pero puede ocurrir y fastidiarte contadores con tiempos negativos (o enormes por culpa de un desbordamiento). O que te pase como en Samoa, donde el gobierno decidió suprimir el 30 de diciembre de 2011 para mejorar sus relaciones económicas internacionales.
En definitiva, más vale pensar que lo peor puede pasar, y que no nos pille desprevenidos.

domingo, 22 de enero de 2012

Efecto mostrar/desvanecer barra de navegación de blogger

El siguiente codigo debe ser pegado al final de la cabecera </HEAD>

<script src='http://www.google.com/jsapi'/><script>
google.load(&quot;prototype&quot;, &quot;1.6.0.2&quot;);
google.load(&quot;scriptaculous&quot;, &quot;1.8.1&quot;);
</script>
<script type='text/javascript'>
function navbarShow() {
new Effect.Opacity(&#39;navbar-iframe&#39;, {duration:0.5, from:0.0, to:1.0});
}
function navbarHide() {
new Effect.Opacity(&#39;navbar-iframe&#39;, {duration:0.5, from:1.0, to:0.0});
}
function navbarHack() {
Event.observe(&#39;navbar-iframe&#39;, &#39;mouseover&#39;, navbarShow, false); Event.observe(&#39;navbar-iframe&#39;, &#39;mouseout&#39;, navbarHide, false); navbarHide();
}
Event.observe(window, &#39;load&#39;, navbarHack, false);
</script>

Hay que comprobar si ya estamos importando las librerías de java prototype.js o scriptaculous.js.Si ya los tenemos debemos quitar el primer <script>..</script>

<script src='http://www.google.com/jsapi'/><script>
google.load(&quot;prototype&quot;, &quot;1.6.0.2&quot;);
google.load(&quot;scriptaculous&quot;, &quot;1.8.1&quot;);
</script>

Al incrustar este código al final del apartado <HEAD>, hace que durante unos segundos y hasta que procesa todo el código, la barra de navegación de blogger se vea activa, mostrando al usuario que existe tal opción que después desaparecerá,

 y subiendo el puntero hacia su posición, se hará visible.

jueves, 19 de enero de 2012

Monitorizacion y optimizacion de SQL Server Querys (II)

Para continuar con el post anterior, pero con un método distinto de optimización de Querys voy a comentaros como trabajar con los Tools que nos proporciona SQL Server desde la version 2005.

Utilizaremos el Sql Server Profiler. Dicha herramienta nos permitirá crear trazas de todo nuestro trabajo sobre el motor de la base de datos.

Sql Server también nos proporciona DataBase Engine Turing Advisor que nos definirá, entro otros, que indices podemos necesitar en nuestras consultas, basándose sobre el optimización de consultas de SQL Server.



El primer paso es arrancar el programa Sql Server Profiler, donde lo asociaremos a nuestra base de datos y definiremos los eventos que el Profiler deberá monitorizar, normalmente dejo los eventos del profiler predeterminados. Además es importante que guardemos la traza en un documento, aunque también da la opción de almacenar la traza en una tabla.

Una vez terminadas las consultas y el trabajo sobre nuestros datos, pararemos la traza y saldremos del Sql Server Profiler.

A continuación arrancaremos el programa DataBase Engine Turing Advisor, creamos una nueva sesión asociándola a nuestra base de datos y pulsamos sobre  la opción de cargar desde documento, seleccionando el mismo archivo que creamos desde el SqlServer Profiler.

Terminada la prueba, se nos mostrara una lista de elementos (índices, statics) que nos recomiendan crear para mejorar nuestra arquitectura de la base de datos.

En los próximos días iré puliendo el texto e incorporando imágenes de los procesos.

Thanks!!

Monitorizacion y optimizacion de SQL Server Querys (I)

El objetivo que me plantearon es optimizar una base de datos para un programa, que utilizaba en la capa de conexión con los datos la tecnología de Linq -> LinqToSql.
Esta es una tecnología impresionante, pero hace de la optimización del servicio algo complicada, porque casi todo el trabajo se esta haciendo a nivel de codigo, no se utilizan Store Procedure o funciones.
Así pues, durante un tiempo me dedique a monitorizar mediante querys las consultas, observando parámetros que el propio servicio mide durante la gestión de las consultas.
Este es un ejemplo de dichas consultas:
-- Caution!! Fechas en formato AMERICANO
Declare @fechaInicioBusqueda as SmallDatetime;
                set @fechaInicioBusqueda = '1/1/2012';
Declare @fechaFinBusqueda as SmallDatetime;
                set @fechaFinBusqueda  = '1/29/2012';

select * from (
select SUBSTRING(st.TEXT, (qs.statement_start_offset/2)+1 , ((CASE qs.statement_end_offset WHEN -1 THEN datalength(st.TEXT) ELSE qs.statement_end_offset END - qs.statement_start_offset)/2) + 1) AS txt,
                creation_time,
                total_worker_time/execution_count AS AvgCPU,
                total_elapsed_time/execution_count AS AvgDuration,
                total_worker_time,execution_count,total_logical_reads,total_physical_reads,
                max_elapsed_time,min_elapsed_time,last_elapsed_time
                from sys.dm_exec_query_stats qs
                               cross apply sys.dm_exec_sql_text(sql_handle) st) as [tablaP]
                where (txt like 'select%')
                               and (creation_time > @fechaInicioBusqueda)
                               and (creation_time < @fechaFinBusqueda)
                ORDER BY AvgCPU DESC

También analice parte de la arquitectura de la base de datos, sin entran en detalla sobre cada table y sus definiciones, sino partiendo de comprobaciones como buscar tablas que no tengan indices o claves primarias(PK)

SELECT SCHEMA_NAME(o.schema_id) AS [schema]
,object_name(i.object_id ) AS [table]
,p.rows
,user_seeks
,user_scans
,user_lookups
,user_updates
,last_user_seek
,last_user_scan
,last_user_lookup
FROM sys.indexes i
INNER JOIN sys.objects o ON i.object_id = o.object_id
INNER JOIN sys.partitions p ON i.object_id = p.object_id AND i.index_id = p.index_id
LEFT OUTER JOIN sys.dm_db_index_usage_stats ius ON i.object_id = ius.object_id AND i.index_id = ius.index_id
WHERE i.type_desc = 'HEAP'
ORDER BY rows desc


También hay comprobaciones en el lado de los indices como:

  1. Estudio de índices no declarados pero necesarios
  2. Encontrar índices sin uso
  3. Buscar consultas en la caché que les falta un Índice
  4. ...
Continuara ...

 
Design by Free WordPress Themes | Bloggerized by Lasantha - Premium Blogger Themes | Online Project management