SQL Compact: Sim, a performance conta muito

Há tempos foi reportado que num dos nossos clientes da nossa solução de pré/auto-venda, o carregamento de uma lista com 60 a 70 registos demorava mais de 5 minutos, enquanto noutros clientes, com o mesmo volume de informação não demorava mais de uns breves segundos. A operação em causa dependia de uma consulta à base de dados no PDA que continha múltiplos JOIN, sobre um comando preparado, e a diferença entre clientes também poderia estar relacionada com os equipamentos utilizados, pois a tal operação de ‘5 minutos’ com a mesma base de dados demorava ‘apenas’ 40 segundos no meu emulador.

Para fazer o tunning à instrução, abri o SQL Server Management Studio, e estudei o Execution Plan da mesma, o que me foi dando ideias para índices a criar, mas sem que tal tivesse um impacto significativo em termos de performance. Aí vi que tinha que mudar a instrução e comecei a pensar como fazê-lo, pois era importante obter a informação das tais tabelas ligadas de uma só vez, mas identifiquei uma tabela de lookup, e tirei-a da instrução SQL, menos um JOIN portanto, e automaticamente o comando passou a ser executado quase instantaneamente. Como a tal tabela era importante, decidi pré-carregá-la numa colecção do tipo key, value, e a cada registo consultava essa colecção para recuperar o valor que necessitava.

Tudo embalado de novo (alteração ao comando, carregamento da lista e novos índexes), no PDA do cliente a tal operação que demorava mais de 5 minutos passou a ser executada em entre 1 e 2 segundos!

Hoje dei com esta pérola no fórum da MSDN dedicado ao SQL Compact, um tipo que tinha uma instrução tão simples como:

SELECT TOP(1) SysDate FROM Violator ORDER BY SysDate Desc

em que a tabela em causa tinha um index criado para a coluna em causa com ordem descendente. Ao executar a instrução no emulador demorava cerca de 35 segundos, o que para ele era inaceitável, e ao analisar o Execution Plan do comando no SQL Server Management Studio, concluíu que o SQL Compact estava a fazer um INDEX SCAN em vez de um INDEX SEEK, que se esperaria que fosse mais performante. O EricEJ, um MVP de SQL Server Compact, sugeriu-lhe uma pequena modificação à instrução, acrescentando-lhe um WHERE inócuo…

SELECT TOP(1) SysDate FROM Violator WHERE SysDate < GETDATE() ORDER BY SysDate Desc

… e automaticamente o comando passou a ser executado de forma muito mais rápida no emulador!

Conclusão

O Query Processor (QP) do SQL Compact tem o seu quê de feminino, é difícil compreender as suas decisões, e mesmo quando achamos que o conhecemos bem, lá aparece uma situação nova a mostrar-nos o contrário, e temos de usar de truques para o convencer a fazer o que queremos :)

TMN: Como não tratar os clientes, parte II

No seguimento de um post anterior, esta semana fui contactado pela TMN e informado que até hoje seria contactado no sentido de encontrar uma solução para a minha reclamação, e assim foi, há minutos fui contactado pela linha de apoio TMN, a informarem-me que em alternativa ao HTC TyTN II usado por 150€, poderia ter um TMN Bluebelt pelo mesmo preço, ou seja, uma magnífica redução de 19€ sobre o preço a que é vendido na loja virtual da TMN.

Passar de uma situação vantajosa de adquirir um equipamento reconhecidamente bom que novo custa(va) mais de 600€ por 150€, ou um equipamento quase desconhecido que custa 169€ por 150€, não é a mesma coisa, e, mais uma vez, ilustra a (pouca) consideração que a TMN tem pelos seus clientes.

Mais uma vez afirmo que não sei a que nível estas acções são tomadas dentro da empresa, mas na minha opinião, cliente da TMN há uns 11-12 anos, acho que merecia, tal como as outras pessoas que comentaram por aqui e pessoalmente situações idênticas, melhor e mais qualificada atenção.

Como associado da Deco/Proteste na próxima semana vou dirigir-lhes uma queixa à TMN. Se é um facto que financeiramente não sofri nenhum dano, não podemos no entanto deixar impunes estes comportamentos abusivos de grandes empresas, deixando assim o repto a que não se coibam de fazer valer os V/ direitos em situações idênticas.

Consultório: Como abstraír conceptualmente uma aplicação para prever um modelo offline de forma passiva?

No fórum da MSDN dedicado ao SQL Compact surgiu uma questão arquitectural que, de forma resumida, pretende que se debata um modelo sobre como abstraír uma aplicação da questão se está ou não online. A minha resposta, em inglês foi a seguinte:

I think we can break this in two parts: getting data from the server and putting data on the server.

To get data from the server, you have to think how much data you may need on the client side, and how often it may change on the server side. As app like a survey app is very different from an app where you can insert orders, getting the current stock level for each product you select and get the most up-to-date information about the customer credit balance.

So, depending on those details you should consider a simple model, where the app on startup get’s all up to date information it needs and stores it in objects in memory or cached locally, or a more complex model, where while connected the client app has to keep a local cache up to date, either with a polling mechanism (the client checks for updates) or a notification mechanism (the server notifies the client).

About putting the infomation created/updated/deleted back on the server, I would consider a permanent cache, like a SQL Compact database, and a flag mechanism per record. All operations on the client app would be done locally on the cache, updating the flag status accordingly and whenever the server was reachable, a differnent thread would be uploading those operations and reseting the flag.

The critical issue when you assume that your app has to work mostly online but also offline, is that in most scenarios you don’t know when you are going to offline, so no chance for a last breath to get up to date information.

About the technology to sync information, you may roll out your own, or if your client app is a desktop app, take a look athe the ADO.net Sync Services, namely the current v2 CTP, which is a very optimized mechanism based on rules to synchronize databases.

Se tiverem dificuldade em perceber alguma coisa, ou quiserem partilhar um comentário sobre o tema, estejam à vontade para usar os comentários do blog.

TMN: Como não tratar os clientes

A semana passada tive conhecimento que a TMN tinha disponível no seu site uma secção de usados, onde disponibilizava equipamentos que já tendo sido experimentados, estariam numa condição francamente boa, e devidamente testados pela TMN. Como ando para comprar um equipamento Windows Mobile para a minha mulher, e com o Windows Mobile 6.5 aí à porta (será apresentado a 6 de Outubro), achei que um HTC TyTN II por 150€ seria um negócio interessante. Concluí o processo da encomenda, sempre atento à questão da disponibilidade do artigo, e lá recebi a confirmação no site e por mail no próprio dia, 28 de Agosto, com a informação que receberia a encomenda no prazo de 3 dias.

Passaram-se os 3 dias, 4, uma semana e nada de telemóvel. Diariamente consultava o site da TMN, onde não via registada nenhuma evolução no estado da encomenda, e constatava que o produto encomendado ainda continou disponível online para encomenda durante mais alguns dias. Liguei para a linha de apoio ao cliente, 1696 que entretanto fiquei a saber que é paga mesmo quando se liga da própria rede TMN, e indicaram-me que receberia um ponto de situação mais tarde, o que aconteceu à noite via SMS, com a informação que o produto teria esgotado e que a encomenda não poderia ser satisfeita.

Ao contactar a loja virtual TMN por mail, sou informado que houve um erro técnico no site, que permitiu que fossem colocadas encomendas acima do nível de stock disponível, mas sem apresentar qualquer alternativa para resolução da questão.

Eu compreendo perfeitamente a questão do erro mencionado, mas… não foi minha responsabilidade! A minha responsabilidade ao confirmar a encomenda foi que levantaria o produto e o pagaria, enquanto a responsabilidade da TMN para comigo foi que enviaria o artigo, ou seja, uma encomenda pode ser equiparada a um contrato que duas entidades se comprometem entre si honrar.

É pena que algumas das mais importantes empresas portuguesas continuem a não aprender com as boas práticas que vão sendo praticadas por empresas estrangeiras quando fazemos encomendas online, em que o cliente é colocado num pedestal, todos os compromissos são honrados, inclusivamente quando isso representa um manifesto prejuízo para a empresa, como são os casos de atrasos na entrega em que empresas com a Amazon reenviam o produto numa modalidade expresso sem encargos para o cliente, entre outros exemplos que já tive.

A única atitude da TMN esperada por mim seria o envio de um equipamento igual, mas novo, pelo mesmo preço, ou de um equipamento de características semelhantes pelo valor da encomenda. Lamento ainda que estas reclamações não sejam escaladas internamente a pessoas na organização que compreendem uma das frases chave do marketing, ‘é muito mais barato manter um cliente do que reconquistá-lo’.

E por falar nisso, vou avaliar as ofertas na concorrência para migração dos números associados à minha conta.

Eventos MS: ReMIX & SQL Deep Dive

Terá lugar no próximo dia 2 de Outubro um evento de dia inteiro, com três tracks paralelos que se traduzem em 13 sessões dedicadas às questões emergentes ligadas às tecnologias Silverlight, Internet Explorer, Expression, ASP.NET e Windows Azure. O evento terá lugar em Lisboa, na Reitoria da Universidade Nova, e contará com um leque de renomeados oradores da Microsoft Portugal e da ‘casa-mãe’.

Destas tecnologias as que mais expectativas podem trazer a quem programa para dispositivos móveis serão o Silverlight, que tem visto o seu suporte em Windows Mobile ser adiado, e as tecnologias ligadas à ‘cloud’, nomeadamente os ‘ADO.NET Data Services’ e tecnologias relacionadas com sincronização de equipamentos com ‘a nuvem’, ainda que não tenha qualquer informação que a interligação destes temas com o desenvolvimento para Windows Mobile seja aflorado neste evento.

remix

O registo está aberto, o nº de lugares disponíveis é limitado e o custo de inscrição é de 50€ por participante.

 

Já no próximo dia 10 em Lisboa, e no dia 15 no Porto, decorrerá o SQL Server 2008 Deep Dive, evento dedicado como o próprio nome indica à exploração do SQL Server 2008 em diversas vertentes, como a escalabilidade, alta disponibilidade, oprimização, gestão de serviço, performance e virtualização.

sqlserverdd

Não tendo nada a ver em particular com o SQL Compact para dispositivos móveis, algumas das questões abordadas são de extrema importância em cenários de alta disponibilidade de servidores SQL Server que tenham de servir dispositivos móveis, seja via web services/WCF, seja por replicação.

Mais informações, agenda e registo no site do evento.