Imagen para determinar la altura de la cabecera

 

Untitled Page

Welcome to Solid Quality FanZone!


In our FanZone you can find the following resources:

-       Sessions that our mentors delivered at various conferences.

-       Articles discussing both technical issues and Solid Quality activities.

-       Blogs maintained by our mentors.

 


Since our mentors are based all around the world and speak various languages, we¹ve divided all these resources according to language. Please choose your preferred language by clicking the buttons above

 

 Last Blogs' Posts

Ken Spencer
1/28/2010 11:32 PM
Bing Me

So, recently i switched my home page to http://www.bing.com/.. I was going there a lot to search anyway so i just switched.

Wow, am i glad i did. Even the images MS puts up are wild. Today there's a wild NASA image of space. And accidently moving the mouse around i found hotspots. For instance, found a spot where there's a black hole. Click and i had all kinds of stuff on black holes.

And there's tons more. Looks like Bing has turned into a great portal.


Daniel Seara
1/28/2010 11:20 PM
Contactos de Empleos

Alguien que está muy en contacto con las comunidades en latino América en general, a quien a veces le piden gente que pueda cubrir tal o cual tarea, para evitar ser él mismo un cuello de botella (ya que sus tareas habituales son otras), ha creado un grupo en Linkedin para que quien necesite a alguien lo publique allí.

De lo que él mismo me escribió:

Algunas cosas que quiero dejar claras son:

  • No soy responsable de las ofertas, ni de los que se auto-postulen, cada quien es responsable de sus actos.
  • No hay promesa de conseguir trabajo ya que todo depende de ti (tu perfil, tu experiencia, etc) y de quien postule la oportunidad de empleo
  • La visión del grupo es que la misma comunidad genere la actividad alrededor del grupo y no yo.
  • Yo solo seré un miembro más del grupo.

Aquí esta el link al grupo Oportunidades de Empleo.

  • Si alguien quiere ayudar en algo dentro del grupo solo déjenme saber…
  • Compártanlo con sus contactos, entre mas registrados mas oportunidades.

El rincón del DBA
1/28/2010 5:18 PM
Utilizando Service Broker como SQL Server Agent

Seguramente ya lo conoces, pero por si acaso, ahí va…

El resumen corto del post sería algo así como “Con Service Broker se pueden agenda la frecuencia de las interacciones del procesamiento de mensajes”

Con esta consideración, podría resultar bastante sencillo crear una infraestructura de Service Broker que dispara la conversación periódicamente cada XX segundos para ejecutar un stored procedure.

Este es un escenario interesante para automatizar tareas de mantenimiento con SQL Server Express; como sabes, SQL Server Express no incluye SQL Agent, y normalmente estos procesos deben ejecutarse mediante tareas programadas de windows, otras herramientas de agendado, o incluso aplicaciones hechas para tal efecto; otro publico objetivo de este post serían clientes de MySQL que a la hora de migrar a SQL Server Express Edition se encuentran con que la funcionalidad de agendado no existe.

Por otra parte, si estás trabajando con MSDE 2000, y no quieres migrar a SQL Server 2005-8 Express Edition por la ausencia de SQL Server Agent, este sería un empujón más para la migración :)

En este post, te mostraré cómo crear esta infraestructura para realizar copias de seguridad periódicamente.

Nota: parte del código está excesivamente simplificado porque quiero enfocarlo en cómo usar Service Broker para la tarea.

1: Creación de la tabla donde se monitorizarán los resultados.

create table monitor_backups(
  bd sysname,
  fecha datetime default (getdate())
);

2: Creación de la cola y dos servicios: un servicio para la primera ejecución y el otro para las iteraciones.

create queue cola_copias
create service sb_inicio_copias 
    on queue cola_copias; 
create service sb_proceso_copias 
    on queue cola_copias ([DEFAULT]) ;

3: Creación del stored procedure que se lanzará para cada iteración: explicaré más adelante el código:

alter procedure lanzar_backup 
as

    declare @conversationhandle uniqueidentifier 
    declare @message_type_name sysname
    declare @dialog uniqueidentifier 

    waitfor (
        receive top(1)
            @message_type_name = message_type_name,  
            @dialog = conversation_handle    
            from cola_copias
    ), timeout 500
    
    if (@message_type_name = 
            'http://schemas.microsoft.com/sql/servicebroker/dialogtimer')
    begin    
        -- segundos en que se lanzará el siguiente backup
        begin conversation timer (@dialog) timeout = 60;
        
        -- cuidado todas las copias van al mismo fichero
        -- es decir se machaca en cada ejecución
        -- codificalo adecuadamente para tu necesidad
        begin try
            backup database accountsdb to disk = 'c:\temp\accountsdb.bak'
            with init, format
            -- registro de seguimiento
            insert into monitor_backups (bd) select 'accountsdb'
        end try
        begin catch
                declare @s sysname = ERROR_MESSAGE()
                raiserror ( @s, 10, 1) with log;            
        end catch
    end
go

Qué sucede en el procedimiento almacenado; aquí lo explico:

    if (@message_type_name = 
            'http://schemas.microsoft.com/sql/servicebroker/dialogtimer')

Si el mensaje es del tipo Dialog Timer, es el momento de ejecutar la operación de mantenimiento; en este caso, el tratamiento para otro tipo de mensajes lo he descartado porque no es el propósito de SB en este caso procesar mensajes, sino activarse para ejecutar la tarea de mantenimiento.

        -- segundos en que se lanzará el siguiente backup
        begin conversation timer (@dialog) timeout = 60;

Primero se agenda la ejecución para la siguiente vez; en este caso, la próxima ejecución será dentro de 60 segundos; cámbialo a tu gusto o necesidades.

        -- cuidado todas las copias van al mismo fichero
        -- es decir se machaca en cada ejecución
        -- codificalo adecuadamente para tu necesidad
        begin try
            backup database accountsdb to disk = 'c:\temp\accountsdb.bak'
            with init, format
            -- registro de seguimiento
            insert into monitor_backups (bd) select 'accountsdb'
        end try
        begin catch
                declare @s sysname = ERROR_MESSAGE()
                raiserror ( @s, 10, 1) with log;            
        end catch

algunas consideraciones para la ejecución de la tarea: fíjate meterlo en try/catch para poder capturar y auditar el error en algún sitio; en mi caso, el error lo envío al Error Log de SQL Server; fíjate en la siguiente imagen cómo aparece en el error log

 

además, recuerda cambiar el código de la sentencia backup porque en este ejemplo, el backup se “re-escribe” continuamente; además fíjate que se ejecuta cada 60 segundos… como propósito didáctico está bien, nada más :)

4: Modificar el comportamiento de la cola para que se active el procedimiento almacenado:

alter queue cola_copias with activation (
  status = on, procedure_name = lanzar_backup,
  max_queue_readers = 1, execute as self) 

5: Disparar la primera ejecución:

-- primer lanzamiento
declare @conversationhandle uniqueidentifier 
begin dialog conversation @conversationhandle
  from service sb_inicio_copias
  to service 'sb_proceso_copias';
begin conversation timer (@conversationhandle) 
  timeout = 60;

Nota final: el siguiente código:

select conversation_handle, state_desc, far_service, dialog_timer 
    from sys.conversation_endpoints;
select * from monitor_backups;

la columna dialog_timer, indica cuando se activará la siguiente vez; la otra tablita muestra la bitacora de copias realizadas.

Conclusión: hemos usado Service Broker para agendar operaciones de mantenimiento sin tener que usar SQL Server Agent; para escenarios de agendado complejos, apóyate en tablas de configuración que mantengan frecuencias de ejecución, operaciones a realizar, etc.. etc..


Douglas McDowell
1/14/2010 1:29 AM
2010 Resolution: "To Blog"
Yes, it is 2010… to some it could not come soon enough, to others it is already here.  Every time you write the date do you have to scribble through “09” and replace it with a “10?”  Well, last week was the week to start keeping our New Year’s resolutions. And frankly I am not that big on New Year’s resolutions, I like the concept usually make a few resolutions on my birthday each year, but I just never have been one to participate each New Year.  But this year I have a resolution… To Blog.
 
It is really a little embarrassing. I have been active in the SQL Server and Microsoft BI technical community for over 10 years, have been a user group leader and technical author for a majority of that time and I have managed to survive without ever having a blog.  Of course I have done the easy stuff: LinkedIn, FaceBook, Plaxo… I even tried Twitter twice.  Amazingly these days I author hundreds of emails each week, many of them displaying immense forethought and possessing great readability… but for some reason I am not capturing those types of communication for a wider audience in the form of a blog.
 
Call me inspired or challenged, but one of my colleagues on the PASS Board of Directors is Andy Warren.  Andy is a prolific blogger and I enjoyed and appreciated his commentaries featured in the PASS Community Connector throughout 2009.  Andy is a tireless contributor to the technical community and when it comes to PASS and serving the community he is a strong advocate of transparency.  There is always lots of debate around how much transparency is desirable, but better overall communication is never a bad thing and the core of transparency is communication.  This year I am the PASS Director of Chapters and I have an increased responsibility for communication.  Those of you that know me know that I am very big on communication in general, I like to get on the phone with chapter leaders and community members, I like newsletters and discussion groups… but not all of those are scalable, accessible or durable.  So I will add blogging to my quiver…  I look forward to interacting with you more through this venue in 2010.

La Cueva de Desarrollo y Colaboración
12/11/2009 6:08 PM
Personalizar estilos en SharePoint 2010

Después de haber perdido algo de tiempo buscando como personalizar estilos en MOSS 2010, decidí ponerme a leer el coreV4.css y ver que es lo que tenemos por ahí.

Cuando digo “crear estilos personalizados” me refiero a esos estilos que vienen en el Ribbon cuando nos ponemos a editar texto en una página:

styles

 

En SharePoint 2007 se podían asociar al elemento RichHTLMField de esta forma: http://www.sharepointconfig.com/2007/05/customising-the-richhtmlfield-styles-menu/

 

Ahora en MOSS 2010 para mi gusto lo han mejorado porque estos estilos personalizados no van asociados a un elemento, sino a todos, es decir, que si definimos un estilo en nuestra página css estará disponible para todos los contenedores de texto de nuestro sitio.

Para definir un estilo basta con crearse una clase css con este formato:

.ms-rteStyle-Solid-Normal
{
    -ms-name:"Solid Normal";
    font-family: Arial, Segoe UI, Verdana, sans-serif;
    font-size: 10pt;
    color:black;   
    font-weight:normal;
}

.

- Es muy importante que el inicio de la clase sea “.ms-rteStyle” y luego lo demás ya como queramos, porque de lo contrario no aparecerá en la pestaña de estilos.

- También es importante la etiqueta –ms-name ya que ese nombre es el que se mostrará en el combo para elegirlo.

Si echamos un vistazo en el fichero corev4.css también vemos que existen otros estilos personalizados para componentes como DIVS, TABLAS, H1, H2, etc…:

DIV.ms-rteElement-Callout1
{
-ms-name:"Callout 1";
color:660000;
background-color:#fef4e4;
float:left;
width:25em;
padding:10px;
border:1px solid #FD9F08;
}

 

También podemos crearnos estilos personalizados para estos, pero recordad, siempre respetando el inicio de la clase “.ms-rteElement”, etc…

 

Y esto es todo!

 

Saludos!


Antonio Soto
10/22/2009 11:08 PM
Business Connectivity Services
Una de las características que seguro darán más que hablar en SharePoint 2010, son los denominados Business Connectivity Services, sucesores del Business Data Catalog. El equipo de desarrollo ha abierto un blog con una introducción a las novedades que podéis revisar aquí

Brian Moran
10/14/2009 8:29 PM
What's worse than spending 6 or 7 figures on a SAN that doesn't meet your need?
Being the person in your company who makes the recommendation to buy that really big heather for your server room. :)
 
Not a great move for your carerr. Do your homework. Educate yourself. Don't be afraid to tell your boss that you need more time to make the decision. Even more important, don't be afraid to tell your boss that you need a brilliant, but super expesive SQL expert to help yuo make the right decision. I can help you find someone like that if you want. :)
 

BICorner
10/14/2009 9:52 AM
Democratizando BI (3/3)

Hay una serie de nuevas fórmulas que se han incorporado a Excel 2007 que nos permiten acceder a valores almacenados en el cubo directamente y mostrarlos en la celda. Lo que simplifica el acceso a valores concretos del cubo sin la necesidad de conocer el lenguaje MDX.

 

Funciones de cubo:

  • CUBEKPIMEMBER (MIEMBROKPICUBO)
  • CUBEMEMBER (MIEMBROCUBO)
  • CUBEMEMBERPROPERTY (PROPIEDADMIEMBROCUBO)
  • CUBERANKEDMEMBER (MIEMBRORANGOCUBO)
  • CUBESET (CONJUNTOCUBO)
  • CUBESETCOUNT (RECUENTOCONJUNTOCUBO)
  • CUBEVALUE (VALORCUBO)

    Hay que tener en cuenta, que como con cualquier fórmula de Excel, el propio nombre de la función ha sido traducido al idioma en el que tengamos el producto, en la relación anterior aparece tanto el nombre en español como el nombre en inglés.

Además, como en cualquier otra fórmula, le podemos pasar como parámetros referencias a otras celdas, para que puedan ser usadas de una forma más flexible.

Veamos un ejemplo, supongamos que queremos obtener un informe de las ventas realizadas en Francia y Alemania, para ello necesitaremos acceder al cubo, a la dimensión Geografía, a obtener los miembros Francia y Alemania, y la medida Cantidad de Ventas por Internet, tal y como se ve en la figura 4.

En la figura se puede apreciar que utilizamos la fórmula VALORCUBO para acceder a la medida indicada. Para acceder a los miembros utilizaremos, en las celdas donde aparece el país, la función MIEMBROCUBO

=MIEMBROCUBO("Adventureworsk UDM";"[Customer].[Customer Geography].[Country].&[France]")

Otra posibilidad es crear una tabla dinámica y posteriormente convertirla en fórmulas utilizando las herramientas OLAP, en concreto, la opción Convertir en fórmulas, mostrada en la figura 5.

Con ello habremos generado una serie de fórmulas sin necesidad de haberlas escrito directamente, y podremos aplicar todo lo visto anteriormente sobre su uso.

Y por último, no nos podemos olvidar de las posibilidades que nos ofrece Excel en cuanto a gráficos dinámicos. Todo el dinamismo que hemos visto, también es aplicable en la creación de gráficos.

Como hemos podido comprobar, disponemos de una potente herramienta analítica, totalmente integrada con nuestro servidor de Analysis Services, con la que además ya estamos familiarizados desde hace años, que ahora dispone de una gran flexibilidad para gestionar y analizar la información.


BiztalkCorner
7/27/2009 11:48 AM
Bem Vindo ao Blog do Guilaz

Olá Pessoal, bem vindo ao blog de Guilherme Azevedo, o Guilaz. Aqui você vai encontrar bastante material sobre SQL Server e principalmente sobre Biztalk Server. Sou consultor há algum tempo nestas tecnologias e durante este período acumulei recursos e conhecimentos que procuro compartilhar com vocês agora. Espero que aproveitem, curtam e utilizem o material.

 

Qualquer dúvida, sugestão, reclamação... enfim, enviem e-mail para gazevedo@solidq.com


El blog de Fernando G. Guerrero
4/30/2009 6:29 PM
El Profesor Manuel Chueca Pazos: un excelente mentor de mentores

Estaba buscando algo por Internet, cuando me encontré con una vieja noticia, del año 2006, pero completamente nueva para mí: El ingeniero cartográfico Manuel Chueca ingresa en la Real Acadèmia de Cultura Valenciana (http://www.lasprovincias.es/valencia/prensa/20061024/cultura/ingeniero-cartografico-manuel-chueca_20061024.html)

Mucho de lo que soy, mucho de mis principios vitales, de mi ética de trabajo y social, se debe a este gran ser humano. Aunque fui formalmente alumno suyo durante un curso académico, tuve el privilegio de trabajar en su departamento durante 6 años, durante los cuales aprendí lo que está y lo que no está escrito.

En tiempos en los que, quizá debido a mi juventud e impaciencia por volar independientemente, no encontraba el camino adecuado, en una encrucijada de caminos muy importante para mí, me ofreció una oportunidad que cambiaría mi vida para siempre.

Este hombre de inmensa cultura, y de asombrosa capacidad didáctica, ha sido un luchador imparable durante toda su vida. Con una inspiradora capacidad para fijarse objetivos imposibles, y lograrlos ante el asombro de todos.

Pero lo que más valoro en él es su capacidad para inyectar capacidad de superación en la gente que le rodea. Donde uno se ve impartiendo rutinariamente clases de prácticas, el veía un aclamado catedrático. Al que se ve ingeniero, él le ve como Doctor. Donde hay un par de despachos con unos pocos aparatos topográficos, el veía una Escuela de Ingeniería Cartográfica. Y el caso es que en la mayoría de estos casos, acertó de pleno.

No es fácil propagar ese espíritu de superación entre gente muy heterogénea, y menos aún en empleados de un organismo público, con tendencia a sentirse funcionarios, sin más ilusión que esperar tranquilamente la jubilación. Sin embargo, siempre supo involucrar a todos en una dinámica más propia de una empresa privada que la de un organismo público.

Por otro lado, siempre supo estar detrás de su gente, apoyándola sin excusas, dándoles la mano en los momentos malos, y sirviendo como parapeto de defensa ante ataques externos.

Con él aprendí a detectar talento temprano en la gente que me rodea, a confiar en sus criterios, a defenderles sin reservas, a ayudarles a descubrir su potencial futuro. Con él aprendí a fijarme metas difíciles, a creer en ellas y hacer todo lo posible por conseguirlas. Con él aprendí que nadie regala nada, y que hay que trabajar muy duro para conseguir lo que quieres.

Él creyó en mí cuando nadie más creía, soportó y sufrió mis errores, y me apoyó en la adversidad.

Ahora me llena de orgullo el ver que le han honrado con esta nueva distinción. Espero que podamos disfrutar muchos años de su lúcida mente y de su inmenso valor humano.

 


Dejan Sarka
3/10/2009 8:05 AM
Inside Microsoft SQL Server 2008: T-SQL Querying RTM

The book Inside Microsoft SQL Server 2008: T-SQL Querying RTM'd a few days ago. :-) The main author is Itzik Ben-Gan, and coauthors involved in the book besides myself are Steve Kass and Lubor Kollar. Steve Kass was also the main Technical Editor of the
book, and Umachandar Jayachandran helped by editing a couple of chapters. César Galindo-Legaria wrote the foreword.

The book is being printed these days and should be on the shelves in a matter of a few weeks. Info on the book can be found in the following website: www.InsideTSQL.com.


Javier Loría
1/28/2009 8:31 PM
Visita a Teotihuacán

La gente de Datavisión (partner de Microsoft con experticia en SQL) tuvo la gentileza de llevarme a Teotihuacán el pasado 10 de enero. Teotihuacán es uno de los lugares arqueológicos más importantes de América y lugar de visita obligatoria cuando se está en México. Durante esta visita finalmente pude cumplir mi sueño de subir tanto la pirámide del sol como la de la luna. Antes había estado en Teotihuacán pero siempre subía primero la pirámide del sol, y me quedaba sin fuerzas para subir la pirámide de la luna. Esta vez la hice a la inversa, y con duras penas, pero llegue.

En orden acostumbrado: Héctor Eugenio Jiménez, Javier Loria, Miguel Angel Granados y Jesús Gil Velasco.

Subiendo la pirámide de la Luna

Pirámide del Sol, vista desde la pirámide de la Luna

Arriba, en la pirámide del Sol.

Pirámide de la Luna vista desde la pirámide del Sol

 

 


Aaron Johal
10/25/2008 3:50 PM
Come meet some of our mentors at TechEd Barcelona

Have you ever gone to learn from a presentation, communicate at an ask the experts session or explored an environment through a hands on lab and felt that a little input from you could have turned the information provided into more contextual knowledge for you?

Have you ever felt too intimidated to ask the important question in front of a large crowd?

Well this year Solid Quality Mentors are offering you the chance to schedule a consultancy session with their mentors about anything that you intend to learn, communicate about or explore during the conference. Being Solid Quality Mentors this means that you can ask about just about anything SQL Server that you would like to find out more about.

Just pop over to our stand and book an available session that suits you, for a relaxed chat with one of our mentors present at TechEd.

Come and communicate with us, we can help you explore what you need and learn from what we know.

Look out for our mentors in the Exhibition Hall, B14 the first week and B21 the second week.

Look out for our mentors at ask the expert sessions.

Look out for our mentor' presentation sessions including :-

Maciej Pilecki: Where Is My Memory? Understanding Microsoft SQL Server Memory Usage and Management

 

SQL Server, like any other database, can be very memory-intensive but how is all that memory used. Is it just the data that is cached? What other objects can be chached to make the system more efficient? This session goes deep under the covers of SQL OS to see how SQL Server manages its memory. We will look at the dynamics of memory usage within SQL Server and the competition between different cache types. Special attention will be afforded to the procedure cache and how it is utilised. We will also examine how SQL OS interacts with the host operating system and other applications running on the same machine. After this session you will have a good understanding about the SQL Server memory architecture and how to optimise SQL Server by configuring memory usage optimally. You will also learn how to diagnose and troubleshoot memory related issues.

 

Greg Low: Answering the Queries your users really want to

ask, with Full-Text Search in SQL Server 2008

 

Business users today are less prepared to be constrained by technology than they may have been in the past. They don't want to hear that you cannot search on such and such because it is not in the right field or that it has not been isolated from other elements so it cannot be retrieved fast enough or will have a negative impact on other users. The full-text search capabilities in SQL Server 2008 will give you the power to deal with these loosely constrained queries.

 

This session will familiarise you with the full-text search subsystem. It will show you why it is important, what can be done with it and how to implement and manage it.

 

The subsystem is not new but it has been optimised for delivery within the latest version of SQL Server. The benefits will be communicated during the session as will issues that you may experience if you are upgrading a previous version of the subsystem.

 

Whether you are new to FullText search or you have tried it previously and were frustrated by the limitations of the earlier version, you will gain a full appreciation of why you should be considering it as a new flexible way of meeting your business users needs.

 

Greg Low: Using Dynamic Management Views To Improve Your Development

 

Although Dynamic Management Views have been available as objects in previous releases of SQL Server, they have been extended and made much more Functional in SQL Server 2008. However, it appears that the majority of developers have tended to ignore the fact that they are available.

 

In this session you will be introduced to these management object types, both views and functions, and aquainted with those that are considered most useful to the developer. You will learn how they can be valuable when monitoring and troubleshooting as well as general management of SQL Server, hands up if you have worked on a project without a DBA!. 

 

As well as showing you how you as a developer can benefit from these objects, you will also learn how you can help your team, those that perhaps don't manage to make it to TechEd. To this end you will learn how these objects can be used to develop customised reports which can be run from inside SQL Server Management Studio.

 

Greg Low: Avoiding Stored Procedure Recompiles in SQL Server 2008

 

In this session, Greg will describe the process by which SQL Server executes stored procedures and how it decides whether or not recompilations are necessary. He will discuss how to monitor recompilations and explain in detail the specific triggers that cause recompilation. Greg will then discuss techniques to be used when writing database code to help avoid the need for recompilations and to help keep systems performing well.

 

By the way, we will be giving away copies of Itzik Ben-Gan’s latest book, http://www.sql.co.il/books/tsqlfund2008/, to some of the lucky visitors to our booth within the exhibition hall..


Gustavo Larriera (aka Gux)
9/23/2008 2:09 PM
Bases de datos de ejemplo para SQL Server 2008

Las bases de datos de ejemplo AdventureWorks, en sus distintos sabores, están disponibles para descargar en el sitio Codeplex. Las bases de ejemplo Pubs y Northwind clásicas también pueden usarse en SQL Server 2008, para descargarlas ir al sitio de descargas de Microsoft en este otro link.

Recomiendo tener a mano la base Pubs pues ocupa poco lugar, es simple de entender y además mucha documentación de SQL Server (incluyendo libros y artículos famosos) ejemplifica usando dicha base.


Fernando G. Guerrero's blog
9/8/2008 1:27 PM
Crisis? Recession? Spending wisely to win against the global crisis

Do we or don’t we have a recession? Our politicians are debating largely about this topic since a year ago. In fact, it is interesting to know that the official technical determination of the term “recession” is different in Europe and the USA.

Are we living challenging times? No question about it. However, we see this time as an opportunity time as well. Excellent companies are going to survive this crisis (or recession, if you prefer this term), and they are becoming stronger and stronger. At the same time, weaker companies disappear, leaving market opportunities to the stronger ones, which in turn will make them even stronger.

This is the time to wisely invest in knowledge, analyzing processes, optimizing resources, and preparing each company to be ready by the time the market will get back on track again.

I already passed through this process before. International economy is a recurring wave that makes us going up and down every few years. And I’ve always seen the same type of companies survive and get stronger and the other type of companies disappear.

Is it the time of investing in training? Absolutely! Many of our customers understand that. Training gives them a technical edge that places them beyond the competition. Training encourages their employees to move forward technically, being more productive to their companies, and improving their own professional value (earning a personal market advantage as well).

Is it time to cut staff cost? Is it time to reduce the total cost of the tasks that our technical staff needs to perform? Well, I could not say that this would be the time to increase these costs, while companies are fighting for survival. However, cutting the total cost per task, and the total cost per project, does not mean cutting the hourly rate you pay for these services. Cutting the total cost per project means finishing the project with the minimum cost, using wisely all available resources, achieving or exceeding the expected and contractual quality level.

We see many times that employing the best available professionals, who typically charge the highest rates, results in shorter delivery times, higher quality, and higher benefits overall. Even more, adding just a handful of key professionals (in many cases just one is enough) to a project, can represent the difference between success or failure, between profitability or disaster.  

Because spending wisely just an extra 3%, might represent in many cases the chance to cut down the total cost in more than 20%. And that 20% might be the difference between success or failure of a project, which might mean the difference between life or death of a company, a division or department, in these challenging times.

Remembering the legendary Supertramp title… Crisis, What Crisis?


Erik Veerman
7/14/2008 3:46 PM
Virtual Conference and other happenings...

Here's a quick update on happenings!  I have some great things coming down the pipe for me and also its been a busy 12 months!  But yes, blogging hasn't been my forte, but it's not for a lack of interest.  I hope to catch up a little in the next few months.

 

Looking to the future

  • Check out the SSWUG Business Intelligence Virtual Conference… http://www.vconferenceonline.com/business-intelligence/speakers.asp It looks to be a *great* conference and is September 24-26.  I’m presenting 3 sessions on Designing, Architecting, and Tuning your BI solution.  Don’t miss out!
  • Our new WROX SSIS 2008 Pro book is finished! (http://www.amazon.com/Professional-Microsoft-Server-Integration-Services/dp/0470247959/ref=sr_1_2?ie=UTF8&s=books&qid=1216041624&sr=8-2) Expect it to be on the shelves in a couple months.  We’ve added a lot of great stuff in there… I wrote the Data Warehouse ETL chapter plus there is a new chapter on leveraging the SQL 2008 RDBMS with SSIS that Grant Dickinson from MS authored.
  • We (Solid Quality) has a new seminar series called SQL Directions… it’s like a pre-conference seminars, deep-dive, lots of material without labs.  I am doing a SQL Server 2008 BI seminar in Atlanta from Oct 1-2, http://learning.solidq.com/na/CourseDetail.aspx?CourseScheduleId=302. It’s a lot cheaper and less time than a class. 
  • PASS this year looks to be very exciting, and they are expecting 3000 people!  I was accepted as a pre-conference speaker and will be presenting on Designing, planning, and Tuning a BI solution, http://summit2008.sqlpass.org/precon-erik-veerman.html I’m really looking forward to this and I have some great content to share about overall BI solution architecture.
  • A new Training Kit is in process!  This is the SQL 2008 BI Implementation TK and we just started.  It’s for the 70-448 Exam and we are building upon the TK 70 445 material… as the lead author, I’ve made a lot of decisions on the chapter content and layout to make this TK better for anyone planning on using SQL 2008 BI.  No links yet, but I’ll keep you posted!

 

What I have been doing the last few months?

  • Well, for starters, my wife and I welcomed a new baby into the family in Feb (Caleb James Veerman).  He’s our 4th kid! It’s a little chaotic around the house, as you can imagine.
  • I did a series of SQL Mag road-shows in May… on high-performance BI.  In fact, one week, I was in NYC on Monday, LA on Tuesday, Chicago on Wednesday, and Boston on Thursday.  Look for some future ones this fall!
  • TK 70-445 was released last fall… http://www.amazon.com/MCTS-Self-Paced-Training-Exam-70-445/dp/0735623414/ref=pd_bbs_sr_1?ie=UTF8&s=books&qid=1216041624&sr=8-1 I was the lead author for the book…  this one really stretched me and boy what a relief it was to get it out the door.
  • Also, if you’ve read some of my earlier posts, I did some ground breaking work with the Many to Many relationships in SSAS and co-authored a White Paper with the SQL CAT team on how to optimize them.  Check out the paper here: http://sqlcat.com/whitepapers/archive/2008/05/03/analysis-services-many-to-many-dimensions-query-performance-optimization-techniques.aspx
  • Wow, last fall was full of conferences… SQL PASS, SQL Connections, and a series of SQL Mag road-shows on Project REAL.
  • Of course, project work and classes.  I’ve taught probably 8 classes in the last 8 months and have been working with a client in Atlanta implement SQL 2005 BI… they love it!  I always hear comments like “Wow, we’ve never had access to data like this before”

I’ve got some more things in the pipeline that I can’t share yet, but stay tuned!

 

Erik

...on practical BI


Randy Dyess
3/13/2008 6:48 AM
SQL Server 2008 Introduces Filtered Indexes

I have been playing around with the latest SQL Server 2008 CTP while trying to keep both my performance tuning and DBA classes updated with the latest changes. When I review new releases of SQL Server, I tend to evaluate the release by determining which features and functionalities that will help me solve problems that I could not solve or could not solve easily in earlier releases.

 

One of the problems that did not have easy solutions in earlier versions was the one faced when dealing with large amounts of data. Many times I have incorporated many different strategies to lessen the impact of large amounts of data on queries by trying to lessen the amount of data contained within the indexes on a table. This often involved partitioning the tables in SQL Server 2005 or archiving data in earlier versions. Any method that worked to create a smaller set of active data to be queried during each SELECT statement and a smaller index to be maintained during data modifications.

 

One of the great new performance improvements in SQL Server 2008 is the new filtered index. Filtered indexes basically allow you to create a filter on an index – think WHERE clause. The index B-Tree will only contain the rows of data that meet the filtering criteria. This allows you to reduce the amount of data contained in an index which means that you are also reducing the data affected in an index by data modifications.

 

I am going to walk through a very small and simple demo that illustrates the impact of filtered indexes.

 

First let’s create a demo table with some demo data

 

SET NOCOUNT ON

 

--Create demo table

IF OBJECT_ID('TestTable','table') IS NOT NULL

DROP TABLE TestTable

GO

 

--Create demo table

CREATE TABLE TestTable

(colID INT IDENTITY(1,1)

,colDate DATETIME

,colSession INT

,colDesc VARCHAR(100)

)

 

--Insert data into table

DECLARE @loop INT

SET @loop = 1000

 

WHILE @loop > 0

BEGIN

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070301',1,'20070301-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070401',1,'20070401-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070501',1,'20070501-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070601',1,'20070601-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070701',1,'20070701-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070801',1,'20070801-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070901',1,'20070901-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071001',1,'20071001-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071101',1,'20071101-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071201',1,'20071201-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080101',1,'20080101-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080201',1,'20080201-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080301',1,'20080301-1' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070301',2,'20070301-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070401',2,'20070401-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070501',2,'20070501-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070601',2,'20070601-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070701',2,'20070701-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070801',2,'20070801-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070901',2,'20070901-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071001',2,'20071001-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071101',2,'20071101-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071201',2,'20071201-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080101',2,'20080101-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080201',2,'20080201-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080301',2,'20080301-2' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070301',3,'20070301-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070401',3,'20070401-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070501',3,'20070501-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070601',3,'20070601-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070701',3,'20070701-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070801',3,'20070801-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20070901',3,'20070901-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071001',3,'20071001-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071101',3,'20071101-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071201',3,'20071201-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080101',3,'20080101-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080201',3,'20080201-3' )

      INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080301',3,'20080301-3' )

 

      SET @loop = @loop - 1

END

 

Next we will create a clustered Index and a non-filtered nonclustered index

 

--Create clustered index on table

CREATE CLUSTERED INDEX cl_TestTable_1 ON TestTable(colID)

 

--Create nonclustered index on table

CREATE NONCLUSTERED INDEX ncl_TestTable_1 ON TestTable(colDate) INCLUDE (colSession)

 

After creating the indexes, let’s take a look at the number of rows in the indexes

 

--View number of rows in indexes

SELECT name, i.index_id, [rows]

FROM sys.partitions p

INNER JOIN sys.indexes i

ON p.[object_id] = i.[object_id]

AND p.index_id = i.index_id

WHERE p.[object_id] = OBJECT_ID('TestTable')

 

You should get an output similar to the one below

/*

name              index_id    rows

cl_TestTable_1    1           39000

ncl_TestTable_1   2           39000

*/

 

Now let’s create a filtered index and look at the number of rows of data

 

--Create filtered index

CREATE NONCLUSTERED INDEX ncl_TestTable_2 ON TestTable(colDate) INCLUDE (colSession)

WHERE colDate > '12/31/2007 23:59:59'

 

--View number of rows in indexes

SELECT name, i.index_id, [rows]

FROM sys.partitions p

INNER JOIN sys.indexes i

ON p.[object_id] = i.[object_id]

AND p.index_id = i.index_id

WHERE p.[object_id] = OBJECT_ID('TestTable')

 

You should get an output similar to the one below

/*

name              index_id    rows

cl_TestTable_1    1           39000

ncl_TestTable_1   2           39000

ncl_TestTable_2   3           9000

*/

 

Once we are done with creating the infrastructure, let’s look at how they affect performance.

 

--How does a filter index help SELECTS

--Clear cache for demo

CHECKPOINT

DBCC DROPCLEANBUFFERS

 

--Get execution plan and IO statistics

SET STATISTICS PROFILE ON

SET STATISTICS IO ON

 

--Select by date

--This has a bookmark lookup

SELECT * FROM TestTable WITH (INDEX = 2) WHERE colDate > '12/31/2007 23:59:59'

--Table 'TestTable'. Scan count 1, logical reads 19692

--TotalSubtreeCost: 2.11023

 

--Use filtered index

--This has a bookmark lookup

SELECT * FROM TestTable WITH (INDEX = 3) WHERE colDate > '12/31/2007 23:59:59'

--Table 'TestTable'. Scan count 1, logical reads 18598

-- TotalSubtreeCost: 2.096156

 

--Select by date

--This does not have a bookmark lookup

SELECT colID, colDate, colSession FROM TestTable WITH (INDEX = 2) WHERE colDate > '12/31/2007 23:59:59'

--Table 'TestTable'. Scan count 1, logical reads 27

-- TotalSubtreeCost: 0.03095978

 

--Use filtered index

--This does not have a bookmark lookup

SELECT colID, colDate, colSession FROM TestTable WITH (INDEX = 3) WHERE colDate > '12/31/2007 23:59:59'

--Table 'TestTable'. Scan count 1, logical reads 27

-- TotalSubtreeCost: 0.0168857

 

--Turn off execution plans

SET STATISTICS PROFILE OFF

SET STATISTICS IO OFF

 

--Clear cache for demo

CHECKPOINT

DBCC DROPCLEANBUFFERS

 

--Insert new rows of data

--Will affect filtered index

INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20080301',3,'20080301-3')

 

--View number of rows in indexes

SELECT name, i.index_id, [rows]

FROM sys.partitions p

INNER JOIN sys.indexes i

ON p.[object_id] = i.[object_id]

AND p.index_id = i.index_id

WHERE p.[object_id] = OBJECT_ID('TestTable')

 

/*

name              index_id    rows

cl_TestTable_1    1           39001

ncl_TestTable_1   2           39001

ncl_TestTable_2   3           9001

*/

 

--Determine which pages have been changed

SELECT DB_NAME(bd.database_id) AS 'Database Name'

,dtab.object_name AS 'Object Name'

,dtab.index_id AS 'Index number with dirty page'

,bd.page_id AS 'Page ID of dirty page'

,bd.page_type AS 'Type of Page'

,bd.page_level AS 'Page Level'

FROM sys.dm_os_buffer_descriptors AS bd

    INNER JOIN

    (

        SELECT OBJECT_NAME([object_id]) AS object_name

            ,index_id ,allocation_unit_id

        FROM sys.allocation_units AS au

            INNER JOIN sys.partitions AS p

                ON au.container_id = p.hobt_id

                    AND (au.type = 1 OR au.type = 3)

        UNION ALL

        SELECT OBJECT_NAME([object_id]) AS object_name  

            ,index_id, allocation_unit_id

        FROM sys.allocation_units AS au

            INNER JOIN sys.partitions AS p

                ON au.container_id = p.partition_id

                    AND au.type = 2

    ) AS dtab

        ON bd.allocation_unit_id = dtab.allocation_unit_id

WHERE bd.is_modified = 1

AND bd.database_id = DB_ID()

AND [object_name]   = 'TestTable'

ORDER BY bd.database_id, [Object Name],index_id, page_type

 

/*

Database Name

Object Name

Index number with dirty page

Page ID of dirty page

Type of Page

Page Level

AdventureWorks2005

TestTable

1

19578

DATA_PAGE

0

AdventureWorks2005

TestTable

2

20033

INDEX_PAGE

0

AdventureWorks2005

TestTable

3

20120

INDEX_PAGE

0

*/

 

--Clear cache for demo

CHECKPOINT

DBCC DROPCLEANBUFFERS

 

--Will not affect filtered index

INSERT INTO TestTable (colDate,colSession,colDesc ) VALUES ('20071101',3,'20071101-3')

 

--View number of rows in indexes

SELECT name, i.index_id, [rows]

FROM sys.partitions p

INNER JOIN sys.indexes i

ON p.[object_id] = i.[object_id]

AND p.index_id = i.index_id

WHERE p.[object_id] = OBJECT_ID('TestTable')

 

/*

name              index_id    rows

cl_TestTable_1    1           39002

ncl_TestTable_1   2           39002

ncl_TestTable_2   3           9001

*/

 

--Determine which pages have been changed

SELECT DB_NAME(bd.database_id) AS 'Database Name'

,dtab.object_name AS 'Object Name'

,dtab.index_id AS 'Index number with dirty page'

,bd.page_id AS 'Page ID of dirty page'

,bd.page_type AS 'Type of Page'

,bd.page_level AS 'Page Level'

FROM sys.dm_os_buffer_descriptors AS bd

    INNER JOIN

    (

        SELECT OBJECT_NAME([object_id]) AS object_name

            ,index_id ,allocation_unit_id

        FROM sys.allocation_units AS au

            INNER JOIN sys.partitions AS p

                ON au.container_id = p.hobt_id

                    AND (au.type = 1 OR au.type = 3)

        UNION ALL

        SELECT OBJECT_NAME([object_id]) AS object_name  

            ,index_id, allocation_unit_id

        FROM sys.allocation_units AS au

            INNER JOIN sys.partitions AS p

                ON au.container_id = p.partition_id

                    AND au.type = 2

    ) AS dtab

        ON bd.allocation_unit_id = dtab.allocation_unit_id

WHERE bd.is_modified = 1

AND bd.database_id = DB_ID()

AND [object_name]   = 'TestTable'

ORDER BY bd.database_id, [Object Name],index_id, page_type

 

/*

Database Name

Object Name

Index number with dirty page

Page ID of dirty page

Type of Page

Page Level

AdventureWorks2005

TestTable

1

19578

DATA_PAGE

0

AdventureWorks2005

TestTable

2

3012

IAM_PAGE

0

AdventureWorks2005

TestTable

2

19928

INDEX_PAGE

1

AdventureWorks2005

TestTable

2

3398

INDEX_PAGE

0

AdventureWorks2005

TestTable

2

20002

INDEX_PAGE

0

AdventureWorks2005

TestTable

2

20001

INDEX_PAGE

0

*/

 

As you can see, having a filtered index makes a little difference in this small table. The difference you would see will grow as the size of the data grows and as the data distribution changes. Redo the demo but change the filtered index to only include the last month of data instead of the last three months. Redo the demo by adding 1,000,000 rows of data before 12/31/2007. How do these two tests differ from the one I created?

 

Randy Dyess

We still have spots left in our May SQL Server DBA Bootcamp being delivered in Dallas. Jump on over to our website as sign up today.

 

We still spots open for Solid Quality Mentor’s SQL Server Performance Tuning Bootcamp to be delivered in Dallas in April.

 

If you enjoyed this post and want to know more about SQL Server, make sure you sign up for one of Solid Quality Mentor’s SQL Server classes today.

 

Make sure you sign up for our newsletter.


Developer Cave
1/29/2008 11:58 AM
Performance & optimization tips for Visual Studio 2008
There's no development tool which cannot be optimized in performance. VS 2008 is not an exception, and the same is valid for the kind of applications you can build with it. Since we all have to make demos in our presentations, its interesting to review some of the most relevant performance & optimization tips, from both points of view: the tool itself, and the applications you can build with it. Besides, in order to let you dig into further research for each topic, I'll give some recommendations in the way of links to articles for different optimization and performance scenarios, or -otherwise- this could become a whole book, and not a "Developer Cave" article.
 
Under the point of view of VS 2008, I've seen several interesting tips:
 
About conditions of your hard-drives: Scott Guthrie suggests some interesting ones at: "Tip/Trick: Hard Drive Speed and Visual Studio Performance" and the Chief of Development at Ms-Redmond, Soma Somasegar, also suggests the following:
 

·      Rebuilding a Visual Basic project and running a background compiler is 3x faster and uses 3x less memory.  More about this topic here.

·      Scrolling large C# files in the Editor is 100% faster, while typing in new text is 50% faster

·      The response time of IntelliSense with large types in C# is up to 10 times faster

·      Incremental build time runs up to 90% faster on C++/CLI project solutions. More about this topic here.

·      Office Word and Excel files are processed 20x faster on the server

·       TFS Version Control command processing was re-written to support unlimited sized operations on key commands without being memory bound on the server. In our measurements, key Commands also run 10% - 60% faster, with the larger improvements associated with bigger projects.  More about the work to improve TFS scalability here and here.

 

Also, there are performance improvements that exploit multi-core hardware. For example,multi-threaded support to MSBuild. In addition, using the /MP switch, you can significantly improve C++ projects' build time – they claim improvements of up to 30% when building the C++ Frontend compiler on dual-core hardware-. Other significant performance improvements were also made in the .NET Framework 3.5 runtime to streamline the CLR thread pool to help multithreaded applications of all kinds. These architectural changes, when combined with socket API changes, improve asynchronous socket I/O throughput up to 70% when a 2nd processor core is available, for example.The full scope of this work is discussed in more detail here
 
On the other side, i.e, the application optimization side,
there numerous references of interest, depending of the kind of application to build. The very best I've seen on this topic is a page at dotnetslackers.com entitled "Performance". It's full of links (including some of the above), on many different optimization tips & techniques. 
 
Hope this helps.
 
Marino Posadas
Solid Quality Mentors' Development Division
(Spain & Portugal)
January 2008

Miguel Egea
11/21/2007 9:30 PM
Presentación en la I Microsoft Bussines Intelligence Conference en madrid
Buenas noches
 
Ya estoy de vuelta en casita, con un principio de gripe que he mitigado algo pegandole la mitad de los virus a mi compañero Antonio Soto e intentando cumplir con parte de la promesa que hice a los valientes que atendieron mi presentación en el día de hoy.
 
Espero que la presentación les gustase, yo desde luego disfruté dandola. Se me hizo algo corta, porque intenté contar en demasiado detalle alguna de las demos del principio, no quería dejar pasar ningún fundamento, pero bueno, solo me salté una demostración :)
 
Sobre las demos, tengo aún que ver como lo voy a resolver desde el punto de vista técnico, voy a consultar si podemos colgarlas como videos y si es así entre mi compañero Francisco Gonzalez y yo las grabaremos y las pondremos a disposición de todos (Por cierto muchas gracias Paco por ayudarme con las demos, no me habría dado tiempo tiempo a hacerlas si tí) y Gracias también a Rubén por que la que enseñe de Workload es de un post del blog del rincón del DBA que él mismo hizo
 
Bueno, sin más rollos, pinchad aquí para descargar la presentación.
 
Un abrazo
Miguel Egea

Dusan Zupancic
10/23/2007 1:58 PM
SmartCards technology for .NET developers (workshop)
Two weeks ago we (Bostjan Kolar, Marko Zdouc, Marko Dorn and Me) held first workshop "Smart cards for .NET Developers" in Varazdin (Croatia). We covered major types of Smart Cards and how to develop solutions in .NET environment. In practical part participant had an oportunity to put hands on solutions with GemClub Memo (Memory Smart card), FlashCOS (processor smart card), JCOP (Java Card) and Gemalto .NET Smartcard.
 
It was great experiemce to talk about this interresting subject so we will work also on simillar courses related to this subject.

Eladio Rincón Herrera
10/22/2007 7:11 PM
De mudanzas...
Hola,
 
que estoy de mudanzas... me cambio de blog; a partir de ahora, publicaré con Carlos Sacristán, Rubén Garrigós en:
 
 
Nada, nos vemos aquí al lado...
 
Eladio

Rubén Garrigós
10/20/2007 12:50 AM
De mudanzas...
Me mudo de blog por lo que a partir de ahora publicaré junto a Carlos Sacristán y Eladio Rincón en:

 

¿Problemas técnicos? Contáctenos en webmaster@solidq.com o al 800 300 800 (desde España) o al +34 91 414 8950 (desde fuera de España)