SQL Server Tecnologia de Base de Dados Nuno Costa – Nº 50099 Tópicos Introdução História Estrutura do SQL Server Armazenamento Views Tabelas/Índices Scan e read-ahead Tipos de Views Execução/Optimização de querys Acesso concorrente Save-points Updates Níveis de isolamento História O SQL Server, originalmente designado Sysbase SQL Server, nasceu de uma parceria entre a Sybase, Ashton-Tate e a Microsoft, competindo directamente com a Oracle e IBM. A primeira versão resultante da parceria, denominada SQL Server 4.2 surgiu em 1989, para OS/2, sendo igual ao Sybase SQL Server 4.0 compatível com sistemas Unix e VMS. O primeiro lançamento do Microsoft SQL Server para NT surgiu em 1992, sendo que a primeira versão totalmente compatível com NT, sem qualquer ligação à Sybase, só apareceu com o Microsoft SQL Server v6.0 Por volta da altura em que o Windows NT saiu, já a Microsoft e Sybase tinham seguindo percursos distintos no que diz respeito ao desenho e implementação do seu próprio SGBD, tendo a Sybase mudado o nome do seu produto para Adaptive Server Enterprise. Armazenamento No SQL Server uma BD envolve uma colecção de ficheiros, contendo os dados e suportada por um único log de transacção De seguida irá ser mencionada a forma de armazenamento de tabelas e as várias formas de acesso a estas. Armazenamento - Tabelas O SQL Server suporta dois tipos de organização: Heap – a localização de cada linha de uma tabela é determinada pelo sistema, não sendo possível ao utilizador especificá-la. Cada linha tem um identificador (RID), nunca sendo mudado excepto quando o ficheiro é comprimido ou a linha mudada. Clustered index – as linhas de uma tabela são guardadas numa B+ tree, ordenada pela chave do clustered index. Esta chave serve igualmente para identificar cada linha da tabela, podendo ser definida como nonunique e neste caso o SQL Server adiciona uma coluna oculta de forma a tornar a chave única. Armazenamento – Scans e Read-Aheads A execução de querys no SQL Server poderá ser feita usando diferentes métodos de procura em tabelas e índices, como por exemplo scan total de tabelas vs filtered scans, forwards vs backward ou ordered vs unordered scans. Cada um destes tipos de scan usa um mecanismo de readahead que tenta estar sempre à frente da linha de execução da query de forma a reduzir o tempo de procura e idle do disco. O algoritmo read-ahead usa o conhecimento obtido partir do plano de execução da query de forma a assegurarse que apenas é obtida a informação requisitada pela query. A quantidade de informação a ser lida pelo read-ahead é automaticamente ajustada de acordo com a dimensão do buffer, capacidade de I/O e ritmo ao qual os dados são “consumidos” na execução da query. Views As views são tabelas virtuais cuja informação é definida através de um select As tabelas referenciadas por views são denominadas tabelas base Os resultados de uma View podem ser obtidas a partir de outras O optimizador de custos avalia uma View como se esta não existisse Tipos de Views Indexed Views: têm como único propósito optimizar a performance na execução de querys que trabalham com grandes quantidades de informação, agregando-a sob a forma de sums, counts e averages. Partitioned Views: são usadas para particionar dados por vários tabelas, BD´s ou instâncias de SQL Server, distribuindo a carga computacional, sendo possível fazer a query a partir de vários servidores de BD. Execução/Optimização de querys Na execução de querys, o SQL Server tem baseiase no protótipo de optimização Cascades. Os passos na execução de uma query são: Parsing/Binding – o optimizador procede ao parsing de cada statement da query e identifica as tabelas, nomes de colunas recorrendo ao catálogo. Constrói views de forma a gerar uma árvore de operadores e verifica na cache de procedimentos se já existe um plano de execução para aquela query, podendo assim evitar o processo de optimização. Através de algebra relacional, é elaborada uma combinação de operadores relacionais Execução/Optimização de querys Simplificação/Optimização – o optimizador aplica uma série de regras à árvore de operadores de forma a obter uma forma simplicada. Durante este processo o optimizador calcula e recorre a estatísticas para calcular a cardinalidade (caso não existam estatísticas o optimizador gera-as antes de dar seguimento ao processo de optimização) Optimização cost-based – o optimizado explora (reordenação de operadores, como por exemplo joins) e implementa diferentes regras (merge join, hash join, etc) de forma a gerar alternativas e estimando o custo de execução de cada uma, escolhe o plano de execução mais favorável. Preparação do plano – com base no plano seleccionado, o optimizador cria as estruturas necessárias para a execução da query Acesso concorrente e recuperação Save-points O SQL Server suporta dois tipos de savepoints de transacção: Statement – o save-point é definido no início da statement de modo a que caso esta falhe não haja rollback de toda a transacção Named - a aplicação define um save-point algures na transacção e caso haja rollback, a transacção irá ser retomada a partir do ponto definido. Acesso concorrente e recuperação opções de concorrência nos Updates O SQL Server tem duas opções no acesso concorrente, na operação de update: Optimista – parte do princípio que qualquer conflito de recursos que surga entre múltiplos utilizadores é improvável (mas não impossível) que aconteça e permite a execução de transacções sem recorrer a locks. Caso ocorra um conflito, a aplicação terá de ler a informação e tentar de novo. As aplicações detectam as mudanças comparando valores ou verificando um valor especial de versão, atribuído a cada linha. Acesso concorrente e recuperação opções de concorrência nos Updates(cont.) Pessimista (default) – sempre que necessário, o controlo de concorrência recorre a locks durante a execução de um transacção. Caso não ocorram deadlocks o sucesso da transacção é assegurado. Os locks podem ser feitos a vários tipos de recursos: RID – usado para lock de uma única linha numa tabela Chave – permite protecção de um determinado range key Página – tabela/Página de index de 8Kbyte Extent – grupo contíguo de 8 páginas de dados ou indíces Tabela – tabela inteira, incluindo indíces BD Acesso concorrente e recuperação Níveis de Isolamento Os níveis de isolamento suportados pelo SQL Server são: Read uncommited (dirty read) – nível mais baixo, onde as transacções são isoladas apenas ao ponto de garantir que não existem leituras de dados fisicamente corrumpidos. Read commited (nível default) – O SQL Server usa shared locks na leitura de informação e assegura que dados fisicamente corrumpidos nunca irão ser lidos bem como leitura de informação que foi alterada mas não foi commited, no entanto, não assegura que essa informação não irá ser alterada antes de a transacção acabar Repeatable read – não permite a ocorrência de dirty reads e nonrepeatable reads, ou seja, irá ser feito um lock a toda a informação requisitada por uma query, impossibilitando outras transacções de alterar esses dados, até que a transacção que fez o lock acabe. Serializable – nível mais alto de isolamento, onde cada transacção é totalmente isolada de outras que estejam a ser executadas Bibliografia http://en.wikipedia.org/wiki/MS-SQL http://www.mssqlcity.com/Articles/Adm/S QL70Locks.htm Silberschatz, Korth, Sudarshan, “Database System Concepts”, Cap. 27, McGraw-Hill, 4th Edition Fim