Category Archives: 1131

Com tanta performance bruta, a optimização ainda fará sentido?

A Red Gate publica uma newsletter chamada Simple Talk, que no geral, tal como as ferramentas da Red Gate, versam temas ligados à administração e utilização de bases de dados em SQL Server e ao profiling the aplicações .NET

Na última newsletter recebida esta semana, um tópico chamou a minha atenção…

A título de minha introdução e comentário à minha provocação no título deste post, numa altura em que o armazenamento ‘físico’, a memória RAM, a capacidade de processamento e o desempenho das redes deixaram de ser consideradas limitações, na fase de preparação e de desenvolvimento propriamente dito de soluções tendemos a esquecer-nos da optimização de processos. Há pouco tempo um amigo ligado a uma importante empresa portuguesa ligada ao desenvolvimento de software de gestão comentava que uma funcionalidade recentemente acrescentada ao software demorava demasiado tempo a ser executada nos seus clientes. Quando questionado o programador que a implementou, o comentário foi que nos testes que tinha feito, ‘aquilo’ era rápido, mas depressa se chegou à conclusão que o volume de informação testado era muito inferior ao volume que alguns clientes tinham nas suas bases de dados. O processo, muito intensivo em termos de operações de bases de dados provavelmente não teria sido optimizado, lembremo-nos que há pessoas que ainda não usam a preparação de comandos SQL com parâmetros quando têm de repetir a mesma acção um nº variável de vezes com valores diferentes. Na nossa empresa, seja por razões de performance na preparação de comandos, segurança para evitar SQL injection e confiança no tratamento de valores numéricos e datas, usamos sempre comandos com parâmetros, não embebemos os valores na string do .CommandText (a excepção é quando precisamos de utilizar o operador IN (…) ).

O tal tópico não tem a ver com a performance na óptica mencionada no ponto anterior, mas na óptica da execução de cada instrução SQL, mais precisamente explica detalhadamente o que é o Exectution Plan do SQL Server, como obtê-lo, formas de apresentação do mesmo e como o interpretar, para a partir dessa informação testar diferentes variantes de um comando e diferentes opções em termos da estrutura da base de dados em si, como índices, de modo a medir e determinar o melhor compromisso para a sua execução.

Fica o link directo para o artigo, que é o primeiro capítulo do mais recente livro do autor, dedicado às questões do Execution Plan:

Execution Plan Basics
Simple-talk: Grant Fritchey

http://www.simple-talk.com/sql/performance/execution-plan-basics/

Uma ressalva, apesar de eu geralmente apenas falar sobre questões ligadas ao desenvolvimento para a .NET Compact Framework e o SQL Server Compact, o artigo mencionado refere-se ao SQL Server para servidores, cujo ‘query processor’ difere daquele que encontramos no SQL Server Compact, pelo que o artigo sendo útil não é aplicável na sua totalidade a esta versão

.NET Compact Framework 3.5 e SSCE 3.5 disponíveis para instalação!

Está já disponível para download a versão ‘standalone’ ou ‘redistribituível’, como preferirem, da .NET Compact Framework 3.5, incluída igualmente no Visual Studio 2008 recentemente disponibilizado para subscritores MSDN.

Este download é imprescindível para poder correr aplicações .NET CF 3.5, não exisindo nenhum equipamento actualmente que já a inclua pré-instalada.

O seu download pode ser efectuado a partir de…

.NET Compact Framework 3.5 Redistributable
http://www.microsoft.com/downloads/details.aspx?FamilyID=e3821449-3c6b-42f1-9fd9-0041345b3385&displaylang=en

…e pode ser instalada em equipamentos Windows Mobile 2003 (PocketPC), Windows Mobile 5.0 (PocketPC e Smartphone), Windows Mobile 6 (todas as edições), Windows CE 5.0 e 6.0.

Com o VS2008 foi igualmente disponibilizado o SQL Server Compact Edition 3.5, cujos runtime podem ser instalados a partir de…

Microsoft SQL Server Compact 3.5 for Windows Mobile
http://www.microsoft.com/downloads/details.aspx?FamilyID=38ed2670-a70a-43b3-87f3-7ab67b56cbf2&DisplayLang=en

A lista de compatibilidades é idêntica à da .NET CF 3.5.

Instalação das ‘SQL Server CE Server Tools’ em Windows Server 2003 x64

Ao procedermos à reinstalação das ‘SQL Server CE 2000 Server Tools 2.0′ num servidor novo de um cliente, ao testarmos a DLL no Internet Explorer…

http://servidor/replicacao/sscesa20.dll

…obtíamos um daqueles erros genéricos do IE quando não consegue visualizar a página. Após desactivar a opção ‘Mostrar mensagens de erro amigáveis’ – ou similar – nas opções do IE, a mensagem passou a ser mais explícita:

%1 is not a valid Win32 application

A mensagem era um pouco estranha, até… ir às propriedades do computador e ver que estava a correr uma versão de 64 bits do Windows Server 2003.

Depois de algum tempo a investigar na Internet, nomeadamente na KB da Microsoft, encontrei algumas pistas: o IIS 6.0 estava a correr em ‘modo de 64 bits’ e como tal não reconhecia esta DLL de 32 bits. Não tendo encontrado nenhuma referência explícita a se este cenário é ou não suportado, ‘segui em frente’ nas minhas investigações, e encontrei um comando que permite colocar o IIS 6.0 x64 a correr aplicações de 32 bits, modificando a metabase do IIS:

cscript %SYSTEMDRIVE%\inetpub\adminscripts\adsutil.vbs SET W3SVC/AppPools/Enable32bitAppOnWin64 1

Depois de um iisreset, o teste ao sscesa20.dll devolveu a tão desejada string :)

SQL Server CE Agent

Nesta altura, constatei que as páginas ASP.net e os web services deixaram de funcionar, pelo que tive de ‘apontar’ o IIS para a versão 32 bits do ASP.net 2.0, com o ‘clássico’ aspnet_regiis -i.

Por agora está tudo a funcionar, mas se por ex. a máquina também tivesse o Exchange 2007 instalado, o cenário podia (do que me lembro de ter visto numa qualquer página que me apareceu à frente dos olhos) ser diferente. Aliás, a empresa que gere a rede e a infraestrutura do cliente pode amanhã chegar à conclusão que esta ‘abordagem’ levou a que algo deixasse de funcionar, é que ao colocar o IIS 6.0 em ‘modo 32 bits’ o mesmo deixa de aceitar aplicações 64 bits a correr no IIS.

No meio de muitas outras páginas, as seguintes 2 da KB foram de extrema utilidade na resolução deste problema:

Windows Server 2003 SP1 enables WOW64 compatibility for 32-bit Web applications in IIS 6.0
http://support.microsoft.com/kb/895976

How to switch between the 32-bit versions of ASP.NET 1.1 and the 64-bit version of ASP.NET 2.0 on a 64-bit version of Windows
http://support.microsoft.com/default.aspx/kb/894435

Como podem ver pela hora a que este post foi colocado online, isto deu àgua pelas barbas… imagino que esta mensagem também possa ser útil para aqueles que pretendam instalar as ‘Server Tools’ do SQL Server CE 2.0 / 3.1 em Windows XP x64.

Novo livro sobre desenvolvimento para Windows Mobile

Do autor do excelente livro ‘.NET Compact Framework Core Reference’, o Andy Wigley, a par do Peter Foot e do Daniel Moth, foi agora lançado um novo livro que para além de fazer a necessária actualização de algumas questões para a .NET CompactFramework 2.0, desenvolve alguns outros temas pertinentes ao desenvolvimento para esta plataforma.

Microsoft® Mobile Development Handbook
Andy Wigley; Daniel Moth; Peter Foot

O livro destina-se principalmente aqueles que já desenvolvem para .NET CF, ou que conhecendo a .NET Framework, querem aventurar-se neste novo mundo.

Pela seguinte lista de capítulos, podem ficar com uma ideia mais aproximada dos temas cobertos pelo livro:

1. .NET Compact Framework—a Platform on the Move
2. Building a Microsoft Windows Forms GUI
3. Using SQL Server 2005 Compact Edition and Other Data Stores
4. Catching Errors, Testing, and Debugging
5. Understanding and Optimizing .NET Compact Framework Performance
6. Completing the Application: Packaging and Deployment
7. Exchanging Data with Backend Servers
8. Networking
9. Getting Connected
10. Security Programming for Mobile Applications
11. Threading
12. Graphics Programming
13. Direct3D Mobile
14. Interoperating with the Platform
15. Building Custom Controls
16. Internationalization
17. Developing with Windows Mobile
18. Introducing .NET Compact Framework Version 3.5 and Visual Studio “Orcas”

É improvável que o encontrem já por cá, por isso a melhor opção para já será encomendá-lo, por ex. da Amazon UK:

http://www.amazon.co.uk/Microsoft-Mobile-Development-Handbook-Pro/dp/0735623589

Eu vou já encomendar um para mim :)

Diferenças de performance entre SSCE 2.0 e 3.1 para a mesma instrução

Ao converter uma aplicação de .NET CF 1.0 com base de dados em SQL CE 2.0 para .NET CF 2.0 com SQL CE 3.1, constatei que uma instrução SQL que demorava poucos segundos, passou a demorar quase 30 segundos a ser executada!

A instrução em causa relacionava 3 tabelas, e estava ‘optimizada’ para SSCE 2.0, ou seja, em vez de JOINs explícitos, relacionava as tabelas na cláusula WHERE, algo como…

SELECT t1.c1, t1.c2
FROM t1, t2, t3
WHERE t1.c1 = t2.c1 AND t1.c1 = t3.c1

Bastou mudá-la para…

SELECT t1.c1, t1.c2
FROM t1 LEFT JOIN t2 ON t1.c1 = t2.c1 LEFT JOIN  t3 ON t2.c1 = t3.c1

…para que de quase 30 segundos passasse a ser executada em menos de 5 segundos!

Quem não utilizou SSCE 2.0, logo à partida escolheria esta segunda instrução, mas para os restantes, ao converterem aplicações em .NET CF 1.0 para .NET CF 2.0 vale a pena reverem as V/ instruções SELECT no sentido de procederem a esta modificação!

Artigos sobre Sybase ASA/Ultralite 10 no CodeProject

O motor de base de dados SQL Server 2005 Compact Edition (SQL CE), sendo um bom motor de BD para equipamentos com Windows CE/Mobile, não é o único, havendo igualmente versões por ex. da Oracle, da IBM, com o DB2, e da Sybase com o ASA e o UltraLite. Naturalmente, estes motores terão alguns pontos fortes, como o suporte a triggers e Stored Procedures nalguns deles, e pontos fracos, como todos se fazerem pagar pela sua utilização.

No entanto, no âmbito de alguns projectos, pode haver necessidade de recorrer a um motor de base de dados que não o SQL CE, seja pela necessidade de sincronizar informação com outro motor de BD em particular, imposição do cliente, compatibilidade com outras plataformas móveis ou por algum benefício técnico.

As versões da Sybase em particular foram actualizadas para a versão ’10’, quer na versão desktop, quer nas versões destinada a equipamentos móveis, contando com um produto denominado ‘Mobilink’ responsável pela sincronização entre os equipamentos móveis e o servidor, com a particularidade de – à semelhança do que acontece com o IBM DB2 – poder-se sincronizar uma BD Sybase num PDA – Ultralite ou ASA – com um servidor que não tem de ter necessariamente Sybase, ou seja, sincroniza com SQL Server, DB2 ou Oracle!

Infelizmente estas ferramentas não atingem o grau de ‘amigabilidade’ oferecido pelo SQL CE na preparação dos mecanismos de sincronização, e a documentação é escassa quando comparada com a MSDN, para além da comunidade não ser muito vasta… é por isso que artigos como aqueles que têm vindo a ser publicados no CodeProject pelo Liam Cavanagh dedicados à utilização destas tecnologias da Sybase com a .NET CompactFramework 2.0 podem revelar-se de grande utilidade

Ler e escrever imagens numa base de dados Ultralite 10 a partir de C#
http://www.codeproject.com/useritems/Windows_Mobile_Db_Images.asp

10 passos para criar uma aplicação para Windows Mobile usando .NET e UltraLite 10
http://www.codeproject.com/useritems/Win_Mobile5_Database_App.asp

10 passos para criar uma aplicação para Windows Mobile usando .NET e SQL Anywhere 10
http://www.codeproject.com/useritems/Windows_Mobile_Database.asp

5 passos para adicionar replicação de dados a uma aplicação Windows Mobile
http://www.codeproject.com/useritems/WM5_Database_Replication.asp

Transferência de ficheiros com o Mobilink 10
http://www.codeproject.com/useritems/Simple_File_Transfer_WM5.asp

Web Services utilizando o MobiLink 10
http://www.codeproject.com/useritems/Mobilizing_Web_Services.asp

Merge Replication – Resolução de conflitos

A sincronização de informação entre 2 processos é um processo potencialmente problemático pela possibilidade de, entre sincronizações, a mesma informação ser modificada em ambos. Quando tal ocorre, estamos na presença de um conflito.


Com a Merge Replication e o SQL Server CE 2.0, essa possibilidade é ainda maior, pois o ‘tracking’ é feito a nível da linha (registo) e não da coluna (campo), ou seja, se no registo de um cliente, numa máquina for actualizado o respectivo nº de telefone, enquanto noutra para o mesmo cliente for alterada a morada, o conflito é despoletado, apesar das informações modificadas não serem as mesmas.


Com um planeamento cuidado e a estrutura da base de dados adequada, pode conseguir-se prever a existência de conflitos, por ex., não tendo um campo de notas ‘único’ por cliente, mas guardando as notas introduzidas por cada utilizador em registos separados, mas sempre que tal não for possível, há que prever a priori o comportamento desejado sempre que um conflito ocorra de modo a evitar situações imprevisíveis.