DepartamentodeEngenhariaInformática 9/ AdministraçãoeOptimizaçãodeBDsºsemestre Mini Projecto Entregaa6deMarçode Aresoluçãodeveserclaramenteidentificadacomonúmerodegrupoeentreguesoba formadeumrelatórioimpresso,seguindootemplatedadonapáginadacadeira. Deveaindaserfeitaumaentregaelectrónicadomesmorelatório(emformatoPDF), respeitandooprazodefinidonapáginadacadeira.. ConsiderandooSGBDSQLServer8,respondaàsseguintesquestões: a. Qual o comando T SQL que permite criar uma base de dados com o seguinte conjuntodecaracterísticas: A BD deve chamar se AOBDTestDB e deve conter quatro ficheiros de dados em três filegroups diferentes (i.e., um ficheiro no filegroup primário, dois ficheiros num filegroup secundário,eumficheironumsegundo filegroup secundário).oficheirono filegroup primáriodeveterumtamanhoinicialde3mb,eosrestantesdevemterum tamanho inicial de 5MB. A base de dados deve ainda ter um ficheiro de log com um tamanho inicial de MB. O ficheiro de log deve ter um tamanho máximo de 35MB, enquanto que os data files devem ter um tamanho máximo ilimitado. Todos os ficheiros devemcresceraumataxade5%. b. Ao criar uma tabela na base de dados AOBDTestDB, seria possível associar explicitamentepartiçõesdosdadosaarmazenarnatabelaacadaumdosquatro ficheirosdedadosqueformamabasededados?justifique. c. Seria possível alterar a base de dados AOBDTestDB por forma a que a mesma tivessedoisficheirosdelogemfilegroupsdistintos?emcasoafirmativoapresente ainstruçãot SQLcorrespondenteàalteraçãoe,nocasocontrário,apresenteuma justificaçãoparaasuaresposta.. Considerandoabasededadosdaalíneaanterior,respondaàsseguintesquestões: a. QualocomandoT SQLparacriarumatabelasobreabasededadosAOBDTestDB, considerando as características: A tabela deverá chamar se Persons, tendo um atributo numérico de nome PersonID, correspondente à chave primária, um atributo alfanumérico de nome Name com um tamanho máximo de caracteres, e um atributo de nome BirthYear correspondente ao ano de nascimento. A tabela deverá ser particionada por forma a que todos as pessoas cujadatadenascimentosejainferiora9fiquemnoterceirofilegroup,todasas pessoascommaisde5anosfiquemnosegundofilegroup,easrestantespessoas fiquemnofilegroupprimário. IST/DEI Pág.de9
AdministraçãoeOptimizaçãodeBasesdeDados b. Indique uma vantagem em ter a tabela Persons particionada da forma descrita naalíneaanterior.exemplifiqueavantagematravésdeumcenárioconcreto. c. IndiqueseoSQLServer8iriaconstruiralgumíndicesobreatabela Persons destapergunta.emcasoafirmativo,indiqueotipodoíndiceeindiqueseomesmo seriaclusteredounon clustered,justificandoasuaresposta. 3. Considere uma estrutura de dados do tipo extendable hash onde cada bucket armazena registos. Considere ainda os seguintes registos e a chaves de hash que lhescorrespondem: Daniel Esmeralda Francisca Geraldes Indiquequalaestruturaobtidaapósainserçãosequencialdecadaumdosvaloresacima. Assumaqueaordemparaaqualdevemconsiderarosbitsdaschavesdehashédobit menossignificativo(direita)paraobitmaissignificativo(esquerda). 4. ConsidereabasededadosAdventureWorksdoSQLServer8. a. Dê um exemplo de uma interrogação T SQL, sobre esta base de dados e envolvendo pelo menos uma junção, sobre a base de dados Adventure Works, ondeaexistênciadeumíndiceb+tree,criadocomaopçãoinclude,podetrazer benefícios.justifiqueoporquêdasuaescolhaeapresentetambémumainstrução T SQLquepermitiriacriaroíndice. b. DêumexemplodeumainterrogaçãoT SQLsemelhanteàdaalíneaanterior(i.e., sobre exactamente as mesmas tabelas e envolvendo selecções e projecções exactamente sobre os mesmos atributos) mas onde mesmo índice já não seria vantajoso.justifiqueasuaresposta. Sugestão:Exploreofactodoíndicepoderestarordenadodeduasformasdistintas. c. Supondo que o SQL Server 8 oferece suporte nativo para índices extendable hash,dêumexemplodeumainterrogaçãot SQLsobreabasededadosAdventure Worksondeemprincípioseriamaisútilumíndicedotipoextendablehashdoque umíndiceb+tree.justifiqueporquê. IST/DEI Pág.de9
AdministraçãoeOptimizaçãodeBasesdeDados 5. Considere que na base de dados da primeira pergunta existe um índice B+Tree no atributobirthyeardatabelapersons. a. IndiqueumcomandoT SQLparacriaroíndiceB+TreesobreacolunaBirthYear, considerandoasseguintesopções: i O índice deve incluir também o atributo Name, embora este não faça partedachavedepesquisa. ii O índice deve seguir o mesmo esquema de particionamento utilizado paraatabela(veralínea.c). b. MostrequalaestruturadaárvoreB+Treeresultantedainserçãosequencialde cada um dos seguintes valores: 995, 997, 99, 993,, 98, 986. Desenheclaramenteaárvoreresultantedecadapassodeinserção. c. Sobre o resultado da alínea anterior, mostre qual a árvore resultante após a remoçãosequencialdecadaumdosseguintesvalores:995,997,99,993,,98,986.desenheaárvoreresultantedecadapassoderemoção. d. Sobre a árvore resultante da alínea b), indique os passos envolvidos no algoritmodepesquisasobreaárvoreb+treeparaasseguintesduassituações: i.encontrarosregistoscomumbirthyeariguala. ii.encontrarosregistoscomumbirthyearentre986e997,inclusive. IST/DEI Pág.3de9
AdministraçãoeOptimizaçãodeBasesdeDados Abaixoencontram seasresoluçõesparaosproblemaspropostosnomini projecto. ResoluçãodoProblema Pergunta.A CREATE TABLE AOBDTestDB ON PRIMARY (NAME = AOBDTestDB_Primary, FILENAME= TestDB_Primary.mdf, size=3mb, FILEGROWTH=5%), FILEGROUP SECONDARY_FIRST (NAME = AOBDTestDB_Secondary, FILENAME= TestDB_Secondary.ndf, size=5mb, FILEGROWTH=5%), (NAME = AOBDTestDB_Secondary, FILENAME= TestDB_Secondary.ndf, size=5mb, FILEGROWTH=5%), FILEGROUP SECONDARY_SECOND (NAME = AOBDTestDB_Secondary, FILENAME= TestDB_Secondary.ndf, size=5mb, FILEGROWTH=5%), LOG ON (NAME = AOBDTestDB_Log, FILENAME= Log.ldf, size=mb, MAXSIZE=35MB, FILEGROWTH=5%); GO; Pergunta.B No SQL Server, as partições de tabelas ou índices apenas podem ser atribuídas explicitamente a filegroups, e não a ficheiros individuais de uma BD. Não é pois possível fazer a atribuição a ficheiros. Pergunta.C No SQL Server, uma BD pode conter vários ficheiros de log, mas estes não são organizados em filegroups. Apenas os ficheiros de dados são organizados em filegroups. ResoluçãodoProblema Pergunta.A USE AOBDTestDB; CREATE PARTITION FUNCTION AODBTestDB_PRange(INT) AS RANGE LEFT FOR VALUES (9,96); CREATE PARTITION SCHEME AODBTestDB_PScheme AS PARTITION AODBTestDB_PRange TO (SECONDARY_SECOND, SECONDARY_FIRST, [PRIMARY]); CREATE TABLE Persons ( PersonID INT NOT NULL, NAME VARCHAR(), BirthDate INT NOT NULL) ON AODBTestDB_PScheme(BirthDate); GO; Pergunta.B O esquema de particionamento da base de dados usado na pergunta anterior permite um controlo explícito do armazenamento dos tuplos da tabela Persons, tendo-se que os mesmos são armazenados em determinados filegroups consoante o valor do atributo BirthDate. Desta forma, torna-se possível armazenar os tuplos mais acedidos num filegroup que corresponde a ficheiros numa unidade de armazenamento mais rápida, ou armazenar os dados históricos num filegroup que corresponde a ficheiros numa unidade de armazenamento maior embora potencialmente mais lenta. Torna-se ainda possível ter acessos concorrentes às diferentes partições de dados, particularmente se os filegroups corresponderem a ficheiros em unidades de armazenamento diferentes. Finalmente, o particionamento dos dados pode ainda permitir a um acesso mais eficiente aos tuplos das várias partições da tabela, uma vez que cada uma das partições se vai encontrar numa estrutura de dados mais pequena, diminuindo-se assim o tempo de procura por tuplos específicos dentro de cada partição. Um cenário concreto onde o particionamento usado na alínea anterior seria útil corresponde à situação em que existem três padrões de acesso distintos à tabela Persons, tendo-se que um deles corresponde ao acesso a dados históricos (e.g., acessos pouco frequentes a tuplos correspondentes a datas inferiores a 9), outro a dados do passado recente (e.g., acessos para contabilização de estatísticas sobre os tuplos correspondentes a datas entre 9 e 96), e outro ainda aos dados da actualidade (e.g., operações correntes estilo OLTP sobre tuplos correspondendo a data superiores a 96). Pode-se assim melhor optimizar o acesso à tabela Persons para cada um dos diferentes padrões. IST/DEI Pág.4de9
AdministraçãoeOptimizaçãodeBasesdeDados Pergunta.C O SQL Server 8 não permite a existência simultânea de uma chave candidata sobre um atributo, e de um esquema de particionamento associado a um atributo diferente. Desta forma, a instrução apresentada na alínea.a não inclui a definição de uma chave primária sobre a tabela. Caso a instrução CREATE TABLE incluísse a definição de uma chave primária, o SQL Server teria também criado um índice clustered do tipo B+Tree sobre o atributo correspondente à chave primária. A razão pela qual o SQL Server procede desta forma relaciona-se com o facto dos atributos correspondentes às chaves primárias serem frequentemente usados em operações de pesquisa e de join entre tabelas, pelo que a existência de índices sobre estes atributos tem frequentemente um grande impacto na base de dados em termos da performance de acesso. ResoluçãodoProblema3 Daniel Esmeralda Daniel 3 3 Geraldes Esmeralda 3 Esmeralda Francisca Francisca Daniel Daniel IST/DEI Pág.5de9
AdministraçãoeOptimizaçãodeBasesdeDados ResoluçãodoProblema4 Pergunta4.A USE AdventureWorks; CREATE NONCLUSTERED INDEX IDX ON Person.Person(BusinessEntityID) INCLUDE (FirstName); -- Encontrar pessoas com BusinessEntityID > 69 que tenham um endereço de email SELECT Person.BusinessEntityID, Person.FirstName FROM Person.Person JOIN Person.EmailAddress ON Person.Person.BusinessEntityID = Person.EmailAddress.BusinessEntityID WHERE Person.BusinessEntityID > 69; O índice non-clustered seria útil para a consulta pois a chave de pesquisa suporta as operações de selecção e junção usadas na query, e inclui ainda todos os atributos da tabela usados na interrogação. Pergunta4.B -- Encontrar pessoas com BusinessEntityID < 69 que tenham um endereço de email SELECT Person.BusinessEntityID, Person.FirstName, Person.LastName FROM Person.Person JOIN Person.EmailAddress ON Person.Person.BusinessEntityID = Person.EmailAddress.BusinessEntityID WHERE Person.BusinessEntityID < 69; O índice não suporta a condição de selecção, visto que a sua ordenação é crescente nos valores do atributo BusinessEntityID. O índice non-clustered também não inclui o atributo LastName. Pergunta4.C -- Pesquisa por igualdade SELECT Person.BusinessEntityID, Person.FirstName FROM Person.Person WHERE Person.BusinessEntityID = 69; ResoluçãodoProblema5 Pergunta5.A USE AOBDTestDB; CREATE INDEX PersonBirthDate ON Persons(BirthDate) INCLUDE(NAME) ON AODBTestDB_PScheme(BirthDate); IST/DEI Pág.6de9
AdministraçãoeOptimizaçãodeBasesdeDados Pergunta5.B 995 995 997 997 99 995 997 995 997 99 993 995 997 995 997 99 993 995 997 993 995 98 99 993 995 997 99 993 995 98 986 99 993 995 997 997 997 IST/DEI Pág.7de9
AdministraçãoeOptimizaçãodeBasesdeDados Pergunta5.C 99 98 986 99 993 997 99 993 995 98 986 98 986 993 993 995 98 986 993 986 995 995 986 98 99 993 IST/DEI Pág.8de9
AdministraçãoeOptimizaçãodeBasesdeDados Pergunta5.D.. Começar na raiz da árvore.. Percorrer o nó raiz até encontrar um valor maior do que. Caso este valor se encontre, deve-se seguir o ponteiro correspondente a nós cujos valores são menores que o valor em questão. Neste caso concreto, o nó raiz apenas contem um valor (995), que é menor do que. Segue-se assim o ponteiro correspondente a nós >= 995. 3. Enquanto não se chegar a um nó folha, repetir o passo. 4. Ao chegar a um nó folha, pesquisam-se sequencialmente os seus valores, até se encontrar o valor pretendido, ou se ter a confirmação de que o valor não se encontra armazenado na árvore. Neste caso concreto, o valor encontra-se armazenado na árvore. Pergunta5.D.. Começar na raiz da árvore.. Percorrer o nó raiz até encontrar um valor maior do que 986. Caso este valor se encontre, deve-se seguir o ponteiro correspondente a nós cujos valores são menores que o valor em questão. Neste caso concreto, o nó raiz apenas contem um valor (995), que é maior do que 983. Segue-se assim o ponteiro correspondente a nós < 995. 3. Enquanto não se chegar a um nó folha, repetir o passo. 4. Ao chegar a um nó folha, pesquisam-se sequencialmente os seus valores, até se encontrar um valor >= 986. 5. Depois de encontrar o primeiro valor >= 986, pesquisam-se sequencialmente os restantes valores armazenados nas folhas da árvore, até se encontrar o primeiro valor > 997. Os valores encontrados durante esta pesquisa sequencial correspondem aos valores a retornar para a pesquisa. IST/DEI Pág.9de9