SAD: 4º Projecto DW Limpeza e transformação de dados Suponha a operação de junção aproximada, que pode ser expressa pelo operador Match da framework de limpeza e transformação e dados AJAX. Pretende utilizar esta operação para detectar registos aproximadamente duplicados de clientes. A tabela Clientes tem o seguinte esquema: Clientes(clId, nome) e resultou da integração de duas tabelas Cliente(Id, nome) e Customer(custId, name). A chave clid não pode ser utilizada para detectar duplicados aproximados. Consideram-se duplicados aproximados os registos de Clientes cuja distância de edição entre os seus nomes é inferior ou igual a 2. Considere uma função de distância de edição editdist(s1, s2) que aceita como entradas duas cadeias de caracteres s1, s2 e devolve um número inteiro que representa a distância de edição entre as duas cadeias. a) (1pt) Escreva em SQL uma interrogação que devolve os pares de identificadores de clientes (clid1, clid2) que correspondem a clientes aproximadamente duplicados. b) (3pts) Que problema pode trazer a execução desta interrogação num SGBD Relacional? Escreva o pseudo-código de um algoritmo de execução para esta operação, potencialmente mais eficiente que o escolhido pelo optimizador do SGBDR, que podia ser considerado como equivalente (ou seja, o resultado era o mesmo) ao algoritmo de execução escolhido pelo SGBDR (Nota: use a informação sobre o tamanho das cadeias de caracteres corresponentes aos nomes) 1
Select c1.clid clid1, c2.clid clid2 from Clientes C1, Clientes C2 where editdistance (C1.nome, C2.nome) <= 2 and C1.nome!= C2.nome b) Existe um problema de desempenho: o SGBD executa o produto cartesiano entre as duas tabelas (ou da tabela por ela própria) e aplica a função de distância a cada tuplo do produto cartesiano Pseudo-código de um algoritmo alternativo baseado no tamanho das cadeias de caracteres para filtrar os tuplos de entrada ao produto cartesiano. cl1 ~ cl2 se dist(cl1.nome, cl2.nome) <= 2 A optimização consiste em determinar um mapeamento f() e uma função dist (), tal que: Dist (f(cl1.nome), f(cl2.nome)) <= 2 and Dist (f(cl1.nome), f(cl2.nome)) < = dist (cl1.nome, cl2.nome) Vamos usar: f(string) = len(string) dist (x,y) = x y 2
Input: Π nome (Clientes), editdist, 2 { P cjto de partições de Π nome (Clientes) de acordo com len() Para cada partição p1 P { Para cada partição P2 P tal que P1.len P2.len <= 2 do { para cada s1 P1 do { para cada s2 P2 do { if editdist(s1, s2) < = 2 then output = output (s1, s2) }}}}} SQL Server 2005 Integration Services Siga as cinco lições do tutorial do Integration Services. Após a 5ª lição, terá aprendido como ler registos de um ficheiro (ou mais) de texto, verificar se determinados valores contidos nas linhas desse ficheiro pertencem às tabelas de dimensões DimCurrency e DimTime (operações de lookup) e a carregar as linhas que obedeçam às condições das operações de lookup para a tabela de factos FactCurrencyRate. Terá também aprendido a escrever, numa tabela de log, os registos do ficheiro de entrada que contenham valores errados e que por isso não possam ser processados pelas operações de lookup. a) Assuma um único ficheiro de entrada SampleCurrencyData.txt (como nas lições 1 e 2) e que o ficheiro de entrada é escrito numa tabela cujas colunas correspondem às colunas do ficheiro. Dê a essa tabela o mesmo nome do ficheiro. Escreva em SQL uma interrogação para cada operação de lookup. Suponha que o resultado da primeira operação de lookup é escrito numa tabela intermédia com nome OutLookupCurrency. b) Escreva em SQL o conjunto de instruções SQL que correspondem à sequência: Lookup Currency Key, Lookup Date Key, Sample OLE DB Destination. Assuma a criação de tabelas intermédias para armazenar o resultado de algumas interrogações. c) Como conseguiria modificar uma das interrogações que correspondem às operações de Lookup de modo a escrever os registos de entrada errados para uma tabela de saída, denominada LogTable? d) Como se comporta o SQL quando existe um erro no processamento de uma interrogação, por exemplo quando se tenta executar uma instrução de insert de vários tuplos numa tabela e um dos tuplos viola a restrição de chave primária? O que acontece aos outros tuplos que não violam a restrição de integridade? 3
SampleCurrencyData(AverageRate, CurrencyId, CurrencyDate, EndOfDayRate) DimCurrency(CurrencyKey, CurrencyAlternateKey, CurrencyName) DimTime(TimeKey, FullDateAlternateKey, DayNumberOfWeek, EnglishDayNameOfWeek,... FactCurrencyRate(CurrencyKey, TimeKey, AverageRate, EndOfDayRate) a) e b)select S.AverageRate, S.CurrencyDate, S.EndOfDayRate, D.CurrencyKey into OutLookupCurrency from SampleCurrencyData S, DimCurrency D where S.currencyId = D.CurrencyAlternateKey select C.CurrencyKey, T.TimeKey, C.AverageRate, C.EndOfDayRate into FactCurrencyRate from outlookupcurrency C, DimTime D where C.CurrencyDate = T.FullDateAlternateKey 4
c) A primeira interrogação, por exemplo, tinha que ser acompanhada de outra interrogação: Select * into LogTable From SampleCurrencyDate Where CurrencyId not in (select CurrencyId from OutLookupCurrency) d) A execução da instrução pára assim que é violada a restrição de integridade. Todos os outros tuplos que já foram inseridos não o são porque uma instrução SQL corresponde a uma transacção. 5