Escolar Documentos
Profissional Documentos
Cultura Documentos
ITAQUAQUECETUBA, SP
2012
FACULDADE DE TECNOLOGIA DE ITAQUAQUECETUBA
JOSÉ AUGUSTO MEIRA DA ROCHA
ITAQUAQUECETUBA, SP
2012
JOSÉ AUGUSTO MEIRA DA ROCHA
ANÁLISE DO DESEMPENHO DO OPERADOR
DE EXPRESSÃO REGULAR NO MYSQL
Aprovado em
BANCA EXAMINADORA
_________________________
Prof°.
Instituição - Sigla
_________________________
Prof°.
Instituição - Sigla
_________________________
Prof°.
Instituição - Sigla
AGRADECIMENTOS
INTRODUÇÃO ........................................................................................................................ 14
1 REFERENCIAL TEÓRICO .......................................................................................... 17
1.1 Noções Básicas .............................................................................................................. 17
1.1.1 Conjuntos ................................................................................................................... 17
1.1.2 Sequências e tuplas .................................................................................................... 18
1.1.3 Funções e relações ..................................................................................................... 18
1.1.4 Grafos ......................................................................................................................... 19
1.2 Computabilidade............................................................................................................ 20
1.2.1 Autômatos .................................................................................................................. 21
1.2.1.1 Autômatos finitos ................................................................................................... 21
1.2.1.2 Autômatos finitos determinísticos.......................................................................... 23
1.2.1.3 Autômatos finitos não determinísticos ................................................................... 23
1.2.1.4 Autômato com Pilha ............................................................................................... 23
1.2.2 Máquina de Turing..................................................................................................... 23
1.3 Conceitos de Linguagem ............................................................................................... 24
1.3.1 Símbolo, Alfabeto, Cadeia ......................................................................................... 24
1.3.2 Linguagem ................................................................................................................. 25
1.3.3 Linguagens formais .................................................................................................... 25
1.3.4 Linguagens Regulares ................................................................................................ 26
1.3.5 Expressões Regulares ................................................................................................ 27
1.3.6 Sintaxe ....................................................................................................................... 27
1.4 Equivalência entre ER e AF .......................................................................................... 27
1.5 Conceitos de Base de Dados.......................................................................................... 28
1.5.1 Sistemas gerenciadores de bases de dados relacionais (SGBDR) ............................. 29
1.5.2 A linguagem SQL ...................................................................................................... 30
2 METODOLOGIA.......................................................................................................... 31
2.1 Ambiente de desenvolvimento e testes .......................................................................... 31
2.1.1 Computador ............................................................................................................... 31
2.1.2 Programas .................................................................................................................. 32
2.1.3 Ferramenta Fullfiller .................................................................................................. 33
2.1.4 Base de dados ............................................................................................................. 35
2.2 Execução dos testes ....................................................................................................... 36
3 RESULTADOS ............................................................................................................. 37
4 CONCLUSÃO ............................................................................................................... 42
5 SUGESTÕES ................................................................................................................ 43
REFERÊNCIAS ....................................................................................................................... 44
14
INTRODUÇÃO
Tema
Objetivos
Objetivo geral
Objetivos específicos
Criar uma ferramenta auxiliar cuja função será automatizar a execução dos testes de
desempenho do operador REGEXP, que poderá ser usada para testar ER e para geração
automática de dados de teste.
Comparar o desempenho do operador REGEXP com do operador LIKE.
Examinar o desempenho de variadas combinações de argumentos do operador
REGEXP.
16
Problema da Pesquisa
Hipótese
Justificativa
1 REFERENCIAL TEÓRICO
1.1.1 Conjuntos
Conjuntos finitos podem ser especificados pela enumeração de seus elementos entre
chaves. Por exemplo, {0, 1} denota o alfabeto de símbolos 0 e 1. Outra especificação
possível para conjuntos é por meio de uma regra de formação:
{x | P(x)}
lida como "o conjunto dos objetos x tais que P(x) é verdade" onde P(x) é alguma
afirmação sobre objetos x, ou ainda
{x in A | P(x)}
lida como "o conjunto dos x em A tais que P(x) é verdade" (HOPCROFT et al.,
1979, p.5).
As operações normais definidas para os conjuntos (HOPCROFT et al., 1997, p.5):
1) A ∪ B, a união de A com B, é:
2) A ∩ B, a interseção de A com B, é:
Funções são essenciais à matemática. Uma função estabelece uma relação entrada-
saída, ou seja, recebe uma entrada e produz uma saída. A mesma entrada produzirá sempre a
mesma saída (SIPSER, 2006, p. 7, tradução do pesquisador). Se f é uma função que recebe a
e devolve b, escreve-se
f(a) = b.
Uma função é também chamada de mapeamento. Diz-se da função acima que ela
mapeia a em b.
Por exemplo, a função de valor absoluto abs toma um número x como entrada e
devolve x se x for positivo e –x se x for negativo, então abs(2) = abs(-2) = 2.
O conjunto de possíveis valores de entradas de uma função é chamado de domínio e
o conjunto das saídas é chamado de imagem. A notação para se dizer que f é uma função com
domínio D e imagem R é
f: D ⟶ R.
19
1.1.4 Grafos
1.2 Computabilidade
Alguns problemas podem ser resolvidos por meio de algoritmos enquanto outros não
podem. Saber que um problema é algoritmicamente insolúvel é útil porque isso mostra que o
problema deve ser simplificado (RUS, 2006, tradução do pesquisador).
A computabilidade é uma propriedade dos conjuntos pela qual se pode determinar se
algo é membro ou não de um conjunto, em um numero finito de passos (ROWE, 2010,
tradução do pesquisador).
Uma tarefa será computável se for possível especificar uma sequência de instruções,
chamadas de procedimento ou algoritmo, que resultarão no completamento da tarefa quando
for executada por alguma máquina (BARKER-PLUMMER, 2011, tradução do pesquisador).
21
1.2.1 Autômatos
Permite-se aos AFN ter, saindo de um estado, duas ou mais transições contendo o
mesmo símbolo. Um autômato determinístico é, tecnicamente, um não-determinístico sem
múltiplas transições para um símbolo. Qualquer conjunto aceito por um AFN também pode
ser aceito por um AFD. (ULLMAN, 1994, c.10, tradução do pesquisador).
O autômato com pilha (AP) é análogo ao AFN acrescido de uma memória auxiliar,
uma estrutura do tipo pilha ou LIFO (do inglês Last In First Out), onde o último a entrar é o
primeiro a sair (PALAZZO, 2008a).
Os AF são modelos bons para dispositivos com pouca memória, os AP são modelos
bons para dispositivos com memória ilimitada, do tipo pilha, mas ambos têm capacidade
limitada para algumas tarefas. A máquina de Turing (mT), um tipo de máquina de estado
descrita em 1937 por Alan Turing, é um modelo matemático muito mais poderoso. Um
dispositivo computacional abstrato simples, similar a um AF, com memória irrestrita e
ilimitada (SIPSER, 2006, p.137, tradução do pesquisador).
A mT usa uma fita infinita como memória, tem uma cabeça que pode ler e escrever
símbolos e mover-se livremente ao longo da fita. Ao iniciar, a fita tem inscrita a cadeia de
entrada e nada mais. Ela memoriza informação escrevendo na fita, pode ler o que escreveu,
voltando a cabeça sobre o escrito. A máquina continua computando até entrar em um estado
de aceitação ou rejeição, quando então pára. Funcionará eternamente se nunca entrar num dos
estados (SIPSER, 2006, p.138, tradução do pesquisador).
Símbolo é uma entidade abstrata que não se deve definir formalmente da qual letras e
dígitos são exemplos comuns (HOPCROFT, 2001, tradução do pesquisador).
Um alfabeto é qualquer conjunto finito não vazio, cujos elementos são chamados de
símbolos. Normalmente as letras gregas maiúsculas Σ e Γ são usadas para designar alfabetos
(SIPSER, 2006, tradução nossa).
Hopcroft (1979, tradução do pesquisador) dá alguns exemplos de alfabetos:
Σ1={0,1};
Σ2={a,b,c,d,e,f,g,h,i,j,k,l,m,n,o,p,q,r,s,t,u,v,w,x,y,z};
Γ={0,1,x,y,z}.
Uma cadeia sobre um alfabeto é uma sequência finita de símbolos desse alfabeto,
escritos um ao lado de outro, sem vírgulas separando. Sendo Σ1 = {0,1}, 01001 é uma
cadeia sobre Σl e sendo Σ2 = {a, b, c, . . , z}, abracadabra é uma cadeia sobre Σ2. Se w é
uma cadeia sobre Σ, o tamanho de w, denotado por |w|, é o número de símbolos que ela
contém. Uma cadeia de tamanho zero, chamada de cadeia vazia e representada por ε, é
equivalente ao zero em um sistema numérico e é a identidade para a operação de
concatenação, ou seja εw=wε=w. Se w tem um tamanho n, pode-se escrever w = w1w2…wn, em
que cada wi ∈ Σ. O inverso de w, escrito wR, é a cadeia obtida de w tomada em ordem inversa,
isto é, wnwn-1…w1. Uma cadeia z é uma subcadeia de w se z aparece consecutivamente em w.
Por exemplo, cad é uma subcadeia de abracadabra. Se tivermos uma cadeia x de
25
1.3.2 Linguagem
Uma linguagem formal, ensina Ramos (2010), “(...) é um conjunto, finito ou infinito,
de cadeias de comprimento finito, formadas pela concatenação de elementos de um alfabeto
finito e não-vazio.”
Chomsky (1959, p.142) define quatro níveis gramaticais com regras de formação
progressivamente restritivas, partindo do nível 0 – sem restrições – até o nível 3, o mais
restrito. Cada nível define uma linguagem respectiva.
26
A tabela abaixo relaciona os quatro níveis gramaticais idealizados por Chomsky com
os modelos de gramática e modelos reconhecedores de sentenças.
Tabela 2: Classificação dos níveis gramaticais de Chomsky, seus modelos geradores e reconhecedores
O estudo das linguagens regulares, para Palazzo (2008b), pode ser abordado através
de 3 diferentes formalismos: operacional ou reconhecedor (AF), axiomático ou gerador
(Gramática Regular), e denotacional (ER), que também pode ser considerado gerador.
27
1.3.6 Sintaxe
Na gramática de uma língua, sintaxe é a parte que trata de “(...) dispor as palavras
para formar as orações, as orações para formar os períodos e parágrafos, e estes para formar o
discurso.” (MICHAELIS), ou seja, “Parte da linguística que se dedica ao estudo das regras e
dos princípios que regem a organização dos constituintes das frases.” (PRIBERAM).
Um Autômato Finito descreve uma linguagem e é equivalente a uma ER, já que uma
ER é a formalização algébrica de um Autômato Finito (RODRIGUES, 2009). As linguagens
28
O modelo relacional surge a seguir para resolver problemas que havia nos modelos anteriores.
(KRIEGEL; TRUKHNOV, 2003, p.12, tradução do pesquisador).
O conceito de uma base de dados relacional e da SQL foi apresentado pelo Dr.
Edward Frank Codd, que trabalhava para a IBM como pesquisador, em seu trabalho “A
Relational Model of Data for Large Shared Data Banks” (Um modelo relacional de dados
para grandes bancos de dados compartilhados) em 1970. Este modelo baseava-se na
independência entre dados e a forma como eram armazenados e em uma linguagem não
procedural de alto nível para acessar estes dados (KRIEGEL; TRUKHNOV, 2003, p.22,
tradução do pesquisador). A proposta de Codd imediatamente atraiu a atenção devido a sua
simplicidade e fundamentação matemática. Ela usava o conceito de relação matemática e
tinha base teórica na teoria dos conjuntos e na lógica dos predicados de primeira ordem
(ELMASRI; NAVATHE, 2011, p.59, tradução do pesquisador).
30
2 METODOLOGIA
2.1.1 Computador
2.1.2 Programas
Imaginou-se um banco de dados com duas tabelas que se distinguem pela quantidade
de colunas e pelo tamanho das cadeias que cada coluna comporta. A tabela “ficha” tem quatro
colunas: com tamanho que varia de 16 octetos à cerca de 255 octetos e uma coluna para a
chave primária. A tabela “texto” tem uma coluna que comporta uma cadeia de até 5.000.000
octetos e uma coluna para a chave primária. A chave primária nas tabelas “ficha” e “texto”
tem caráter funcional, e não será objeto dos testes.
O tamanho da cadeia da coluna “conteúdo” da tabela “texto” é 1.000.000 octetos na
grandeza 0, 2.000.000 octetos na grandeza 1 e assim por diante até a grandeza 4 com
5.000.000 octetos. Em qualquer grandeza, tem as cadeias “.primeiracadeia.” no inicio e
“.ultimacadeia.” no final.
36
L = C × 10n
3 RESULTADOS
Gráfico 1: Comparação entre LIKE, REGEXP, REGEXP BINARY e a razão entre eles
Fonte: o próprio pesquisador, 2012
maiúscula. Para obter o mesmo efeito com o LIKE devemos repeti-lo vinte e seis vezes, uma
vez para cada letra, unidas pelo operador lógico OR.
Em geral, o uso de BINARY faz o REGEXP ficar mais rápido. Veja-se no gráfico 1
que os tempos de REGEXP insensível à caixa são até duas vezes maiores.
No teste mostrado pelo Gráfico 6, semelhante ao anterior, mas desta vez sobre uma
coluna de 255 caráteres, vê-se que os tempos quando se usa BINARY são lineares e
constantes. A razão entre a operação do REGEXP sensível e insensível à caixa chegou a seis,
o que comprovou os resultados obtidos antes.
4 CONCLUSÃO
Conclui-se que LIKE é mais rápido quando se trata de padrões simples. Isto pode ser
visto nos gráficos 1 e 7. Portanto sempre que a sintaxe permitir o LIKE deve ser usado.
Deve-se usar REGEXP BINARY sempre que possível. Os dados mostrados nos
gráficos 5 e 6 comprovam esta afirmação.
Deve-se dar preferência ao uso de classes quando esta puder substituir a união. É o
que mostram os dados do gráfico 3.
Use-se o curinga (“.”) só quando necessário, pois ele causa uma perda de
performance. O gráfico 1 apresenta dados que embasam esta orientação.
43
5 SUGESTÕES
REFERÊNCIAS
______. Three Models for the Description of Language, IRE Transactions on Information
Theory, Vol. 2, N. 3. Sept. 1956, p. 113-124. ISSN: 0096-1000.
MySQL 5.5 Reference Manual. 21678th rev. Redwood City: Oracle, July 2010.
PARÉ, Rafael Camps, et al. Bases de datos. Barcelona: Fundació per a la Universitat Oberta
de Catalunya, mayo 2005.
RAMOS, M.V.M., NETO, J.J., VEGA, I.S. Linguagens Formais: Teoria, Modelagem e
Implementação. São Paulo: Bookman, 2009.
APÊNDICES
USE `tcc`;
Classe Fullfiller
package fullfiller;
/**
* Provide facilities to automatically create, populate and execute queries on
* databases. Can act as an auxiliary tool on benchmarking commands on MySQL.
* Distributed under GNU GPL license. {@link http://www.gnu.org/copyleft/gpl.html}
*
* @version 0.2
* @author Jose Augusto Meira da Rocha {@link mailto:jose.rocha@fatec.sp.gov.br}
* @author Fatec Itaquaquecetuba {@link
http://www.centropaulasouza.sp.gov.br/Fatec/Escolas/Itaquaquecetuba.html}
* @author Fatec Itaquaquecetuba {@link mailto:dir.fatecitaqua@centropaulasouza.sp.gov.br}
*/
public class Fullfiller {
io.redirectStandardOut();
io.eventWrite("Start running Fullfiller", chrono.getElapsedSec());
chrono.start();
script.parseScript(io);
dataBase.conect(script.getMysqlUser(), script.getMysqlPass());
dataBase.useDb(script.getMysqlSchema());
script.runScript(io, dataBase);
chrono.stop();
io.eventWrite("End running Fullfiller", chrono.getElapsedSec());
System.exit(0);
}
}
Classe Chronometer
package fullfiller;
/**
* Provide facilities to measure execution times.
* Distributed under GNU GPL license. {@link http://www.gnu.org/copyleft/gpl.html}
*
* @version 0.2
* @author Jose Augusto Meira da Rocha {@link mailto:jose.rocha@fatec.sp.gov.br}
* @author Fatec Itaquaquecetuba {@link
http://www.centropaulasouza.sp.gov.br/Fatec/Escolas/Itaquaquecetuba.html}
* @author Fatec Itaquaquecetuba {@link mailto:dir.fatecitaqua@centropaulasouza.sp.gov.br}
*/
Classe Dbfunctions
package fullfiller;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
* Provide data base functionalities.
* Distributed under GNU GPL license. {@link http://www.gnu.org/copyleft/gpl.html}
*
* @version 0.2
* @author Jose Augusto Meira da Rocha {@link mailto:jose.rocha@fatec.sp.gov.br}
* @author Fatec Itaquaquecetuba {@link
http://www.centropaulasouza.sp.gov.br/Fatec/Escolas/Itaquaquecetuba.html}
* @author Fatec Itaquaquecetuba {@link mailto:dir.fatecitaqua@centropaulasouza.sp.gov.br}
*/
public class Dbfunctions {
private Connection connection = null;
private PreparedStatement preparedStat = null;
private ResultSet resultSet = null;
private Statement statement = null;
public Integer queryResultLines = 0;
public float queryElapsed = 0f;
/**
* Get a connection to MySQL.
*
* @param script
*/
public void conect(String user, String pass){
String conn = "jdbc:mysql://localhost/?" +
"user=" + user + "&" +
"password=" + pass;
try {
Class.forName("com.mysql.jdbc.Driver");
connection = DriverManager.getConnection(conn);
} catch (SQLException e) {
System.err.println("Error connecting to DB: " + e.getMessage());
System.exit(1);
} catch (Exception e) {
System.err.println("Error connecting to DB: " + e.getMessage());
System.exit(1);
}
}
Classe InOut
package fullfiller;
import java.io.*;
import java.text.SimpleDateFormat;
import java.util.Calendar;
/**
* Provide functionalities to deal with files.
* Distributed under GNU GPL license. {@link http://www.gnu.org/copyleft/gpl.html}
*
* @version 0.2
* @author Jose Augusto Meira da Rocha {@link mailto:jose.rocha@fatec.sp.gov.br}
* @author Fatec Itaquaquecetuba {@link
http://www.centropaulasouza.sp.gov.br/Fatec/Escolas/Itaquaquecetuba.html}
* @author Fatec Itaquaquecetuba {@link mailto:dir.fatecitaqua@centropaulasouza.sp.gov.br}
*/
public final class InOut {
/**
* Create a buffer reader for the script file.
*/
public void openScriptFile(){
try {
scriptBuffReader = new BufferedReader(new FileReader(new File(scriptName)));
}catch (IOException e){
System.err.print("Error opening script file: "+e.getMessage());
System.exit(1);
}
}
/**
* Closes the script buffer reader.
*/
public void closeScriptFile(){
try {
scriptBuffReader.close();
}catch (IOException e){
System.err.print("Error closing script file:"+e.getMessage());
System.exit(1);
}
}
50
/**
* Create a buffer writer for the result file.
*/
public void openResultFile(){
try {
resultBuffWriter = new BufferedWriter(new FileWriter(new File("result.csv"),
true));
}catch (IOException e){
System.err.print("Error opening result file: "+e.getMessage());
System.exit(1);
}
}
/**
* Redirects the standard output, in order to get and preserve outputs into
* a file.
*/
public void redirectStandardOut(){
stdoutFile = new File("FFlog.log");
try{
PrintStream ps = new PrintStream(new FileOutputStream(stdoutFile));
System.setOut(ps);
}catch (IOException e){
System.err.println ("Error redirecting standard Out: "+e.getMessage());
System.exit(1);
}
}
/**
* Write a message on result file.
*
* @param line The message to be wrote.
*/
public void outputResult(String line){
try{
resultBuffWriter.write(line);
resultBuffWriter.newLine();
}catch (IOException e){
System.err.println("Error writing result: "+e.getMessage());
System.exit(1);
}
}
/**
* Read a line from the script file.
*
* @return the line read
*/
public String readScript(){
try {
if (scriptBuffReader.ready()){
return scriptBuffReader.readLine();
}
}catch (IOException e){
System.err.println ("Error reading script file: "+e.getMessage());
System.exit(1);
}
return "";
}
/**
* Issue a message on standard output.
*
* @param event The event that happend.
* @param segs The duration (in seconds) of the event.
*/
51
public void eventWrite(String event, float segs){
System.out.printf("%s "+event+" (%.4fs)\n",
formato.format(Calendar.getInstance().getTime()), segs);
}
/**
* Constructor of the class.
* @param file Script file name.
*/
public InOut(String file) {
setScriptName(file);
}
Classe Script
package fullfiller;
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.Iterator;
import java.util.ListIterator;
import nl.flotsam.xeger.Xeger;
/**
* Provide functions to parse the script and run commands on it.
* Distributed under GNU GPL license. {@link http://www.gnu.org/copyleft/gpl.html}
*
* @version 0.2
* @author Jose Augusto Meira da Rocha {@link mailto:jose.rocha@fatec.sp.gov.br}
* @author Fatec Itaquaquecetuba {@link
http://www.centropaulasouza.sp.gov.br/Fatec/Escolas/Itaquaquecetuba.html}
* @author Fatec Itaquaquecetuba {@link mailto:dir.fatecitaqua@centropaulasouza.sp.gov.br}
*/
public class Script {
command = argCampos[0];
if (command.startsWith("#") || command.equals("")){
return;
}
argument = argCampos[1];
switch (command){
case "name":
setNames(argument);
return;
case "emai":
setMails(argument);
return;
case "text":
setTexts(argument);
return;
case "test":
setTests(argument);
return;
case "crea":
case "comm":
case "exec":
setActions(arg);
return;
case "sche":
setMysqlSchema(argument);
return;
case "user":
setMysqlUser(argument);
return;
case "pass":
setMysqlPass(argument);
return;
default:
System.err.println("");
System.err.println("Unrecognized command '" + command + "' on line " +
scriptLine);
scriptError = true;
}
}
contaLinhas(dbFuncs);
Chronometer chrono = new Chronometer();
io.openResultFile();
io.eventWrite("Executing tests", chrono.getElapsedSec());
chrono.start();
dbFuncs.createPrepComm(strQuery);
for (int i=0; i<repet; i++){
dbFuncs.execQuery();
somaMilis += dbFuncs.queryElapsed;
}
media = ((float)somaMilis / (float)repet);
while (iterAction.hasNext()){
String action[] = iterAction.next().split(String.valueOf((char)29));
command = action[0];
switch (command){
case "crea":
level = Integer.parseInt(action[1]);
geraTabelaFicha(io, dbFuncs, level);
geraTabelaTexto(io, dbFuncs, level);
break;
case "comm":
argument = action[1];
runOsCommand(io, argument);
break;
case "exec":
repet = Integer.parseInt(action[1]);
runTests(io, dbFuncs, repet);
break;
default:
System.err.println ("Error executing script:" + command);
System.exit(1);
}
}
runChrono.stop();
io.eventWrite("Script executed", runChrono.getElapsedSec());
}
chrono.start();
for (Iterator<String> it = Texts.iterator(); it.hasNext();) {
55
geradorTexto.add(new Xeger(it.next()));
counterText.add(0);
}
io.eventWrite("Filling table Texto at level " + niv, chrono.getElapsedSec());
dbFuncs.createPrepComm("INSERT INTO texto (conteudo) VALUES(?);");
column[0] = ".primeiracadeia.";
for (int i=0; column[0].length()<maxLen; i++){
textGenerator = i%geradorTexto.size();
column[0] += geradorTexto.get(textGenerator).generate();
counterText.set(textGenerator, counterText.get(textGenerator)+1);
}
column[0] += ".ultimacadeia.";
dbFuncs.executePrepComm(column);
chrono.stop();
io.eventWrite("Table Texto filled with 1 line of around "+maxLen+" bytes.",
chrono.getElapsedSec());
for (ListIterator<String> it = Texts.listIterator(); it.hasNext();) {
System.out.printf("%9d expressions of language Lt%d(%s)\n",
counterText.get(it.nextIndex()), it.nextIndex(), it.next());
}
}
}
57
ANEXOS
Fonte: http://code.google.com/p/xeger/wiki/XegerLimitations