Desmistificando o collation no SQL Server – Parte 2

Olá!

No último post eu comecei uma série sobre collations no SQL Server. Este post apresenta a segunda parte da série. Você pode conferir a agenda a seguir para se situar:

  • Introdução [Você está aqui]
  • O que são collations
  • Collations do Windows vs Collations do SQL
  • Precedência de Collations
  • Tertiary Weights
  • Query Optimizer e Collations!

Lembrando: Essa parte é muito importante para entender a necessidade do collation. Vamos nessa, fera!?

Como um breve resumo: no último post vimos o que são textos e como eles se diferenciam dos outros tipos de dados. Para resumir:

  • Textos dependem de regras culturais!
  • Textos são formados por elementos menores: O caractere
  • O caractere pode ser uma letra, um algarismo, um sinal de pontuação, um espaço, etc.
  • Computadores trabalham com números somente!
  • O seu monitor/impressora faz um desenho, com base no que algum software ordena… Eles não sabem a diferença entre um o ‘a’ de um texto em um site, e o ‘a’ de uma foto de um documento 😉
  • Em suma: O computador/software representa tudo internamente com números e ordena aos dispositivos que desenhem conforme nós entendemos!

Então, o que você vê na tela como sendo uma letra ‘a’ é na verdade um conjunto de pontinhos(pixels) no seu monitor acesos que formam isso que você chama de letra, ou de interrogação, ou de exclamação, ou a maiúsculo com acento…os softwares e o sistema operacional só trabalham com números, mas dão significados aos números dependendo do contexto em que estão usando eles. Imagine este caractere que está vendo na tela do seu computador: A. Olha o que ele é:

  • O seu navegador web/sistema operacional/computador: 65
  • Para o seu monitor/placa de vídeo: pintar o pixel que está na linha 1001 e coluna 5000, pintar o pixel que está na linha 1002, coluna 5002, etc…
  • Para você: letra A
Uma letra A desenhada no monitor, em um zoom!

Uma letra A desenhada no monitor, em um zoom!

Sacou!? Para o computador/software tudo são números e caracteres são números, e consequentemente, textos são números. Todo o texto que você digita e que você lê, está sendo na verdade representado por uma sequência de números (sequência de caracteres), e em qualquer lugar que ele for exibido, por um monitor e uma placa de vídeo, ou uma impressora, ele vai ser exibido conforme você entende: um conjunto de símbolos, de desenhos. Mas dentro do computador, eles são números, porque o computador é capaz de trabalhar somente com números!

Bom Rodrigo, então se caracteres são números, então qual número representa qual caractere?

E é aqui que você começa a se deparar com um dilema que começou lá no início da computação. Os primeiros computadores/softwares eram capazes de trabalhar somente com números de 256 valores diferentes: 0-255. Para entender melhor isso, precisaríamos de outro post, outra série e provavelmente ela despertaria muitas outras dúvidas… Existe um cara, muito foda extremamente expert neste assunto,  que escreveu uma série de artigos sobre como funciona um computador, mais especificamente, uma CPU, começando falando sobre o que são dados e informações até chegar em como o seu computador carrega o sistema operacional… É simplesmente sensacional, e ele aborda tudo o que você precisa saber para entender detalhes de como um computador consegue representar textos, imagens, fazer cálculos,o que quer dizer computador de 8-bits, de 32-bits, etc. Ele é o B. Piropo (http://www.bpiropo.com.br/). Lá tem muitos artigos excelentes, e eu ainda tenho muita fé que vou ler todos! A série de artigos que estou falando começa com o artigo “Mudança de Rumo” e depois com “Computadores I: Dados e Informações”, e estão na seção “Escritos”, “Colunas Fórum PC”. Você pode usar a busca para encontrar também. O B. Piropo sabe realmente como transformar assuntos complexos, com uma linguagem técnica difícil, em brincadeira de criança. Faça bom proveito!

Mas Rodrigo, espera um pouco… O que esse assunto tem a ver com SQL Server?

Bom, o SQL Server é um SGBD, isto é, um software que gerencia um banco de dados onde informações estão a todo tempo sendo armazenadas e recuperadas, e essas informações podem ser textos, ou melhor dizendo, caracteres :-).
Ele realmente não se preocupa em escrever nada na tela, ou imprimir algo… Porém, ele pode entregar e receber textos de outros softwares… Além disso, ele permite que você ordene, compare, conte caracteres, e muitas outras operações com textos…

Para o computador, um ‘a’ e um ‘A’ são representados por números diferentes, mas para nós, significam a mesma letra, porém uma é maiúscula e outra é minúscula. O mesmo vale quando temos um ‘á’ (para o computador é outro número diferente, mas para nós é um ‘a com acento agudo’). Dependendo como você quer trabalhar com texto, você irá querer ignorar essas diferenças, e mesmo sendo números diferentes, o software deverá ser capaz de lidar com isso. E todas essas operações podem ser afetadas conforme as regras culturais. No japão, por exemplo, os caracteres não são iguais ao que usamos aqui. Então é de suma importância entender toda essa base sobre textos! Os conceitos que irá aprender nessa parte, não vale apenas para o SQL Server, mas para qualquer software que necessite trabalhar com texto.

No próximo post, vamos continuar este assunto e descobrir como os caracteres são representandos por números!

Até lá!

[]’s

Desmistificando o Collation no SQL Server – Parte 1

Oi! Tudo certo!?

Já faz um bom tempo desde o último post, e estou devendo algumas coisas à vocês. Mas estou revendo alguns pontos e tem muita coisa e muito assunto que desejo postar aqui, então em breve creio que irei conseguir me desculpar! 🙂

Recentemente tive a oportunidade de falar de um assunto que parece não ser muito grande… Mas que pode causar muita dor de cabeça: COLLATIONS!

Pensando nisso, vou iniciar mais uma série “Desmitificando”, agora sobre collations. Espero que possa ser útil. A série “Desmitificando o SELECT” também será incrementada com posts novos!

Qual o meu objetivo com essa série?

Vocês já deve ter se deparado com aqueles erros de incompatibilidade de collations… Pois bem geralmente a ação é usar um comando “COLLATE” e está tudo certo.

  • Mas você sabia que existe uma precedência de collations?
  • Sabia que nem sempre collations diferentes vão resultar erros?
  • Sabia que você pode perder dados ao converter um collation para outro?
  • Sabia que o plano de execução gerado para sua query pode ser bem ruim, por conta do collation?

Muitas perguntas né!? E ainda tem  mais… Mas vamos direto ao ponto:

O objetivo desta série é que você domine o collation e saiba exatamente o que está fazendo e o que o SQL Server está fazendo por debaixo dos panos…

Mas, até lá, vamos precisar alinhar umas coisas antes sobre textos e computadores, pois se não fosse por isso, não havia necessidade de collations, ok!? Então senta aí, e vamos conversar um pouco…

Agenda da série (pode ser alterada a cada post)

  • Introdução [Você está aqui]
  • O que são collations
  • Collations do Windows vs Collations do SQL
  • Precedência de Collations
  • Tertiary Weights
  • Query Optimizer e Collations!

TEXTOS E COMPUTADORES

Um número em qualquer lugar do mundo significa a mesma coisa. O número 5 significa a mesma coisa, tanto no Brasil como no Japão, etc. O que pode mudar é a representação. O símbolo ‘5’ pra gente já é suficiente. Com datas, também não é diferente: Se você adicionar 1 dia à data ‘1 de janeiro de 2014’, você sempre vai ter ‘2 de janeiro de 2014’, independente do lugar em que você se encontra! Com textos isso já não é assim, tão simples…

Textos são como nós identificamos e representamos as coisas. As palavras e as letras são usadas por uma determinada cultura, povo, sociedade (chame do que quiser), mas o fato é que dependendo do lugar em que você se encontra no mundo, as regras de escrita podem mudar: Os símbolos para representar as letras (já ouviu falar em acento no S?) são o exemplo mais prático que você pode ter para ilustrar isso…

Computadores são capazes de representar textos e também lidar com essas diferenças. Mas precisam ser informados onde estão, qual o idioma, a região, etc. Sozinhos eles não conseguem sair do outro lado…

Mas os computadores não entendem textos. Apenas números. Um computador, em sua simplicidade é capaz de fazer somente algumas operações básicas, que envolvem números somente! Somar, multiplicar, subtrair… Também podem ler e gravar “dados” na memória… Mas tudo isso usando números somente! Tudo construído em volta de regras matemáticas e com ajuda da eletrônica, que fazem as coisas darem certo.

Também, os computadores são capazes de fazer algo interessante com uma pequena ajuda: Desenhar na tela! Na verdade, quem faz isso é um dispositivo ultra-moderno chamado “Monitor”. Esse cara recebe sinais de uma coisa chamada “placa de vídeo” e sai ativando pontos na tela que exibem a luz em uma determinada cor, conforme lhe é orientado. Mas, o monitor e a placa de vídeo não sabem que estão desenhando letra ‘a’ ou ‘b’… Eles sabem que estão ativando e desativando pixels (os pontinhos, que tem um monte deles)… Esses pixels juntos para nós tem algum significado… Para eles são meros pontinhos que podem ser ativados com uma determinada cor… Para eles, o ponteiro do mouse a letra ‘a’ não passam de pontos na tela!

Textos são compostos por elementos menores; Coisinhas chamadas “caractere”. Um caractere é a menor unidade que forma um texto:

  • A letra ‘A’
  • A letra ‘z’
  • O algarismo 6, o algarismo 1
  • Cada letra do alfabeto é um caractere diferente
  • Um “A” é um caractere, um “a” é outro caractere, um “á” outro, e um “Á” outro: Cada variação de uma mesma letra é um caractere diferente.
  • Os sinais de pontuação (! . , ” @ #, etc.)
  • O espaço (sim! o espaço é um caractere), a tabulação

Entendeu!? Cada coisinha dessa é um caractere e um conjunto de 0 ou mais caracteres formam o que chamamos de STRING, que é a mesma coisa que texto.

Uffaaa!!! Muito assunto né!? Mas se você chegou até aqui é porque acha esse assunto tão legal quanto eu! Vai ver que é de suma importância entender bem a introdução para dominar COLLATIONS! No próximo post vamos continuar a introdução… Até lá!

SQL Saturday #253

Galera, é com muita felicidade e empolgação que anuncio o primeiro SQL Saturday de Brasília, e também minha primeira oportunidade como palestrante.

O evento

O SQL Saturday é um evento gratuito, que acontece no mundo todo, voltado para SQL Server e acontece, na maioria dos casos, em um sábado. É o dia inteiro com palestras sobre temas voltados ao produto. Aqui em Brasília será o de número #253.

Já temos mais de 400 inscritos no evento da capital brasileira, e isso reforça que além de ser uma boa oportunidade para aprender e tirar dúvidas sobre SQL, você poderá conhecer novos profissionais da área e fazer networking.

O evento vai ocorrer lá em Taguatinga, na Faculdade Projeção. Mais informações, consulte o link abaixo.

Também, para as empresas da área de TI, é um excelente local para encontrar aquele profissional que estão precisando. As empresas que quiserem patrocinar o evento, podem entrar em contato com o organizador do evento aqui em Brasília, Luciano Moreira [luti], no seguinte endereço: luciano.moreira@srnimbus.com.br.

Aqui em brasília, teremos temos bem legais divididos em 4 categorias (tracks): Desenvolvimento (Dev), DBA, BI (Business Intelligence) e Academic (Iniciante). A agenda do evento é a seguinte: (ainda poderá sofrer algumas pequenas alterações)

SQLSat253_Agenda

Então como podem ver são temos bastantes interessantes, então nao fique de fora!

Para participar você apenas precisa se registrar no link: http://www.sqlsaturday.com/253/register.aspx (apenas em inglês)

Você também pode encontrar mais informações em: http://www.sqlsaturday.com/253/eventhome.aspx

Minha palestra

Como eu disse agorinha, eu terei a primeira oportunidade de palestrar em um evento oficial. Estou muito empolgado e feliz, pois  sempre aprendi lendo posts, livros, videos de pessoas que tiveram a boa vontade de passar o conhecimento, e poder retribuir isso é gratificante!!!

Irei falar sobre um tema que já tive muitas dúvidas, inclusive desde quando era um desenvolvedor SQL: Índices. Quando escrevia códigos, sempre queria saber como otimizar as consultas e muitas respostas me levaram a artigos e sites falando sobre “índices”. Me lembro que uma das perguntas que eu me fazia era: “Se um índice ajuda tanto, porque ele já não vem criado?”.  Também, já vi muitos desenvolvedores chegarem a pedir a criação dos mesmos com justificativas nada convincentes. E ainda, onde eu mesmo já fui vítima, já vi pessoas sugerir a criação de um índice na intenção de melhorar uma consulta, e na verdade o mesmo não iria ajudar em nada.

Com base nisso, o objetivo desta palestra, Índices: Introdução, é responder algumas perguntas comuns a quem nunca teve contato, ou teve pouco com eles:

  • O que são índices e como eles podem ajudar a melhorar uma consulta ?
  • Quando um índice ajuda ?
  • Quando um índice não ajuda ?
  • Por que os índices já não vem criados se eles ajudam tanto ?

E para  entendermos isso eu estou partindo do principio que o publico alvo da palestra seja realmente aqueles que desenvolvem usando o T-SQL ou que já tiveram um contato bem superficial com índices.

Assim, a palestra terá uma base para entendermos um pouco como as coisas são armazenadas dentro do SQL Server, e a partir daí iremos caminhando entendendo alguns problemas que existem, e finalmente como os índices podem ajudar. Aí então, vamos aprender como o SQL Server implementa isso, e como usamos esse recurso bastante poderoso (sim, consultas de 1 min podem cair para segundos com isso).

Segue o tópicos que pretendo abordar:

    1. Overview de Tabelas e Colunas
    2. Overview de Tipos de Dados
    3. Como os dados de tabelas são armazenados?
      1. Data Pages
    4. Pesquisando valores em tabelas
    5. O conceito de Índices
    6. Tipos de Índices no SQL Server
    7. Características e Utilização
    8. Os custos de se ter Índices

É claro que daqui para o dia do evento poderei acrescentar, ou mesmo tirar, alguns tópicos, mas a ideia gira em torno disso aí.

Após isso, espero que os presentes consigam entender melhor para que serve um índice e quando ele pode ajudar ou não.

Bom caro amigo, então é isso! Espero que goste do evento, e que aproveite a oportunidade. Depois do evento posto no blog como foi e os arquivos da palestra! Espero você lá!

 

Rodrigo Ribeiro Gomes
[]’s

Impressões da Prova 70-457: SQL 2008–> 2012 (Part 1)

Bom hoje eu resolvi quebrar um pouco da série, e dar um feedback sobre a prova 70-457 (Transition your MCTS on SQL Server 2008 to MCSA: SQL Server 2012, Part 1). Como minha primeira prova de transição eu fiquei um pouco surpreso com o formato. A prova é tem 50 questões, dividas em duas partes de 25.

Na primeira parte, veio muita questão voltada a administração. Num primeiro momento, como eu não sabia, achava queria cair mais algo voltado para desenvolvimento. Questões bastantes conhecidas para quem fez as provas do 2005/2008 estavam lá. Uma que me lembro, e que é comum entre as atividades da maioria dos DBA’s, era sobre o logs do SQL Agent: Você precisava ver o output produzido pelas steps de um job a questão te perguntava como habilitar isso.  Backup & Restore tomou conta em umas 3 ou 4 questões. Uma delas te perguntava quais os passos para restaurar um backup do SQL Server 2005 para o 2012. Falando em passos, uma coisa na prova deixou ela mais fácil: as perguntas cujo a resposta era composta por várias ações sempre tinham o número de passos. Isso facilita um pouco quem não domina determinado assunto, mas tem alguma noção. Por exemplo, a pergunta final do backup acima era mais ou menos assim:

“Quais os três passos para se completar a tarefa”

Em relação a alta disponibilidade caiu boas perguntas sobre as tecnologias novas e as velhas conhecidas, como replicação. Nas duas partes, existiam um grupo de respostas que eram repetidos em vários perguntas diferentes. No meu caso foi para essa parte de HA, e na parte de Query (a segunda parte da prova). O que predominou nesse assunto foi comparar qual determinada tecnologia é melhor em dada situação. Acho que essa abordagem já é conhecida. Também, me lembro de 1 ou 2 perguntas sobre Failover Cluster, que mantém o mesmo padrão de provas anteriores (gerenciamento do cluster, atualização, fazer o failover, etc.).

Em um mix bem bacana, caiu perguntas sobre PBM, Audit, XE e profiler. A maioria delas te dava uma situação e perguntava qual tecnologia usar. Me recordo de algumas sobre Audit, perguntando sobre a sintaxe para fazer determinada tarefa. Perfmon também deu alguns sinais de vida nesse tipo de questão comparativa.

A outra parte, veio querying pesado. Como eu sou fã da parte de perfomance já adianto que caiu umas bem “desafiadoras”, porém algumas mal formuladas. Em uma dessas, o questão te dava uma querie que usava uma UDF e perguntava qual das opções era a melhor escolha para otimizar a consulta.  Funções analíticas não me recordo de muita coisa, apenas de uma questão, onde você deveria saber a diferença entre LAG E LEAD e o efeito da cláusula OVER sobre ela. (aproveito para compartilhar este artigo do Fabiano Amorim, no simple talk, que te dá uma visao bacana dessa funções e uma boa explicação sobre o conceito do  “frame/window”). Pode crer, este artigo me salvou! Smile

No geral a parte de query caiu perguntas bem conhecidas dos outros exames de query, incorporando algumas com as novas funcionalidades. Dessa vez eu não vi nenhum para fazer a análise de um plano de execução. Mas teve view indexada, data modification, etc.

SSIS teve sua presença em umas 4 ou 5 questões, junto SQL Server Agent, jobs, etc.

Em suma, eu gostei da prova, achei cheia de questões legais e senti uma dificuldade maior do que nas outras provas. Talvez seja porque ainda não estivesse muito em contato com a nova versão do produto ( e já tá vindo a 2014 pra piorar melhorar a minha vida, rs!). Uma dica que eu dou é ver o “What’s New” do 2012, ver o que tem de novo, e estudar esses assuntos (no próprio link tem breve explicações que já ajudam). Tem muita coisa bacana que veio para resolver problemas antigos, assim quem já tem alguma experiência desde a versão 2005, consegue assimilar tranquilo as novas funcionalidades.

No mais é isso galera, até o próximo post. A nossa série sobre o SELECT ainda não parou, em breve a continuação. Quando fizer o Part 2, eu posto aqui os resultados.

Também aproveito para falar que post da parte de administração também estarão em breve saindo do forno. E se você tem alguma sugestão, não deixe de usar o espaço “on demand” para colocar algum assunto. Até a próxima!


[]’s
Rodrigo Ribeiro Gomes

Desmistificando o SELECT no SQL Server: Processamento Lógico vs Processamento Físico

Quando eu começei a ler sobre o processamento lógico das queries, eu “boiei” muito.
Sabia que era um assunto bem legal, mas nao entendia realmente o que era.

Depois de algum tempo de leitura e pesquisa, acho que finalmente entendi, e, por experiencia própria acredito que seja mais do que importante entender bem esse assunto.

Para o SQL Server processar aquele comando SQL, ele tem algo como “regras”.
Ele vai validar o comando pra ver se está de acordo com a sintaxe do SQL, checar se as tabelas existem, etc…

Todo esse procedimento segue uma lógica. Essa lógica guia o modo como a engine do SQL Server irá interpretar o comando.
Por exemplo, veja a seguinte query: (Os scrips para criação dessas tabelas está aqui)

SELECT
     C.cidade
    ,COUNT(P.pedidoID)
FROM
    dbo.Cliente C
    LEFT JOIN
    dbo.Pedido P
	   ON P.clienteID = C.clienteID
GROUP BY
    C.cidade

É uma query muito simples. O que ela faz é trazer a quantidade de pedidos por cidade.
Vamos viajar um pouco. Imagine que você fosse o SQL Server e estivesse responsável por processar a query.
De cara, você começa a processar a query a partir do início, isto é, da cláusula SELECT:

Ai você dá de cara com esse primeiro trecho do comando:

SELECT
	c.cidade

Ai você se pergunta, “C.cidade” ? Qual tabela o alias “C” representa ?
Opa, você percebeu que nao podemos começar o processamento pelo SELECT, porque primeiro precisamos saber quais as tabelas e alias o desenvolvedor informou na query.

E onde estão essas informações ? Na cláusula FROM!!

Agora veja esta outra query:

SELECT DISTINCT
     UPPER(C.cidade) AS NomeCidade
FROM
    dbo.Cliente C
ORDER BY
    NomeCidade

Essa query pode ter várias interpretações diferentes, isto é, várias “lógicas de processamento” diferentes.Cada lógica escolhida no seu processamento vai produzir um resultado diferente. Quer ver ? Então vamos lá.

Vamos supor que a lógica de processamento que voce escolheria fosse a seguinte: (de novo, imaginando que você  é o SQL Server)

1º – FROM
2º – ORDER BY
3º – SELECT
Bem vamos lá, o FROM seria moleza. Você teria apenas que ler os dados da tabela Cliente e atribuir o alias “C” a ela.

Logo em seguida viria o ORDER BY. Opa, temos um problema, a tabela Cliente nao tem uma coluna ‘NomeCidade‘. Essa coluna é um alias definido no SELECT, e como você ainda não processou o SELECT, não sabe da existencia desse alias. Nesse caso, representando o SQL Server, o que fazer? Simples: Informaria um erro ao usuário:

“Erro 0000: A coluna NomeCidade nao foi encontrada”

Assim, nessa ordem de processamento o resultado seria um erro. Agora, vamos imaginar que a ordem escolhida fosse essa:

1º – FROM
2º – SELECT
3º – ORDER BY

De novo, a primeira fase é processar o FROM: apenas ler tabela Clientes e atribuir o alias “C” a ela.
Agora, vem a fase do SELECT. Nessa parte ele menciona “C.cidade”. Como já processamos o FROM, sabemos que o “C” representa a tabela “Cliente”. Legal, com isso nós vimos que o desenvolvedor está querendo referenciar uma coluna chamada “cidade” da tabela Cliente. O próximo passo seria verificar se a coluna realmente foi retornada pelo FROM, mas não se preocupe com isso agora.

Continuando o processamento do SELECT, aplicariamos a funcao UPPER na coluna “C.cidade”. Por último, nós iríamos associar o alias “NomeCidade” ao resultado desta função. Até aqui tudo bem.

Enfim, processaríamos o ORDER BY. Como já processamos o SELECT, nó sabemos que o nome “NomeCidade” é uma alias pro resultado da expressão “UPPER(C.Cidade)”

Agora é so ordenar os dados de acordo com o resultado dessa função, e pronto!

Tá vendo ? Olhe só que interessante.
Na primeira tentativa, o nosso processamento resultou em um erro.
Na segunda, apenas por trocar o ORDER BY de lugar com o SELECT, ja produziu um resultado sem erros.

Isso não se resume a resultados com erros ou não. Dependendo de como você acha que sua query ai ser executada, você pode imaginar que vai vir uma coisa, quando na verdade vem outra…

É por isso que é bastante importante entender como o SQL Server irá avaliar seu comando SQL. Entender como é a lógica usada por ele, o que chamamos de processamento lógico da query (Logical Query Processing). Entendo o processamento lógico da query é a chave para escrever consultas mais eficientes e robustas.

E o processamento físico ?

O processamento lógico na verdade é só um conceito… A microsoft apenas implementou as regras deste conceito. O modo como o SQL Server vai acessar os dados, filtrar, etc… “são outros 500 …”.

Você so precisa saber que o resultado produzido pelo processamento físico deve ser exatamente o mesmo produzido no processamento lógico. Assim, quando formos analisarmos o plano de execução (que indica como o SQL irá executar a query) iremos ver passos em uma ordem muito diferente do processamento lógico, mas pode ter certeza que o resultado produzido, será o mesmo do processamento lógico.

Bom, espero que esse post nao tenha ficado confuso. Esse lance de processamento físico e lógico vai ser esclarecido conforme formos vendo cada fase do processamento lógico.

Qualquer dúvida, sugestão, crítica, etc., por favor, coloque nos comentários que estarei respondendo.
Até a próxima.

[]’s
Rodrigo Ribeiro Gomes
MTA|MCTS