Otimizar SQL

15 respostas
M

Possuo um banco de dados cujas tabelas precisam apenas armazenar um campo String ou VarChar

As strings tem em media 500 caracteres cada, e faço consultas com a SQL abaixo

SELECT campo FROM tabela WHERE campo = ‘xyz’

teria como otimizar esse select para que o mesmo fosse mais eficiente ?

15 Respostas

R

Bom dia,

Dá uma lida no link:

Explica legal os tipos de dados relacionado a colunas de uma tabela.

O exemplo está em Oracle, mas a essencia dos tipos são semelhantes entre alguns bancos de dados.

G

cara, fico meio confuso isso que vc posto, mais da uma olhada sobre hibernate!!! Vai simplificar a sua vida em relação a banco de dados.

pra voce pesquisar um texto grande, acredito que seja difícil digitar tudo exatamente do jeito que ta no banco, sem errar uma virgula,
acredito q o atributo like do sql te ajude.

t+

G

Não entendi bem o objetivo. Está pesquisando o banco para trazer a informação que você já tem? (retornar o valor de ‘campo’ onde esse valor é ‘xyz’)

E outra coisa, se não for desrespeitar nenhuma informação confidencial da empresa, vc poderia explicar melhor para que serve essa tabela com um único campo, talvez alguém possa indicar uma solução melhor.

E

Não sabemos nem o SGBD que está sendo utilizado. Assim fica difícil ajudar.
Foi sugerido utilizar o like. Dica: só utilize-o caso realmente seja necessário, pois a performance dele não é boa.

R

mmx:
Possuo um banco de dados cujas tabelas precisam apenas armazenar um campo String ou VarChar

As strings tem em media 500 caracteres cada, e faço consultas com a SQL abaixo

SELECT campo FROM tabela WHERE campo = ‘xyz’

teria como otimizar esse select para que o mesmo fosse mais eficiente ?

PreparedStatement ou Hibernate.

S

Essa parte está confusa, você quer ir no banco recuperar o valor de campo onde campo=‘xyz’ ?

M

ok, creio que não me expressei corretamente

Eu uso a base de dados H2. na minha database tem 2 tabelas

1 - Uma tabela com as informações a serem processadas
2 - Uma tabela com as informações processadas

a minha aplicação vai na tabela 1, retira uma tupla, processa e insere na tabela 2

Cada tabela tem so um campo varchar para armazenar os dados, eu não preciso ter relacionamento entre as tabelas, por isso nao usei chaves estrangeiras, etc

Cada campo desta tabela é UNIQUE

para remover um item da tabela 1, eu faço um SELECT no banco, conforme o SQL que eu dei de exemplo e depois faço um DELETE
correto ?

O que eu queria era otimizar o uso de recursos da maquina ao acessar o banco. Por exemplo, reparei que para conexão em um database H2 ja populado, a aplicação consome uma memoria consideravel e demora pra liberar a mesma

Eu gostaria de reduzir o consumo de memoria da aplicação, a velocidade de acesso ao banco nao e muito fundamental, embora se puder ser melhorada seria algo muito bom

Eu sei que de acordo com o tipo de consulta, os resultados retornados podem deixar o desempenho da plicação sofrivel, eu perguntei se tem como eu melhorar este acesso ao banco, mudar o SELECT ou alguma coisa do tipo, posso estar errando no design do meu banco.

Eu ja ouvi falar de Hibernate, mas ouvi tb que ele consome muita RAM, estou enganado ?

creio q agora expliquei devidamente

L

Não seria melhor vc ter uma tabela com 2 campos ?

palavra, data_processamento

dai faria uma consulta: (busca as palavras não processadas)select palavra from sua_tabela where data_processamento is null

esses registros devem ser processados, ao processar você atualiza o campo data_processamento com a data do sistema.

Assim você vai saber quais palavras já foram processadas, quais não foram e a performance é melhor.

E

Pra que fazer um SELECT se logo após já irá executar um DELETE? Não poderia submeter apenas o DELETE?

Você está dando um close na conexão após utilizá-la?

Mas o teu SELECT não retorna apenas 1 registro? Você está abrindo uma nova conexão com Banco pra cada SELECT?

Sem conhecer o modelo de dados da tua Base e as tuas reais necessidades, fica difícil ajudá-lo.

O Hibernate é um framework e com certeza o seu uso terá um custo. Usando SQL diretamente via JDBC, e da melhor maneira possível, certamente terá um custo menor do que usá-lo.

M

E por isso que eu digo que 2 cabeças pensam melhor que uma … valeu a dica lucasportela !
vou modificar o código e testar esta nova solução !

pq eu preciso processar a informação e depois remove-la, ou seja remover da tabela 1 e inserir na tabela 2

sim

não, apenas 1 conexão com o banco aberta o tempo todo

claro, este era o código antigo:

public static synchronized void criaTabelas() {
		
		Statement stm = null;
		
		try {
				
			stm = conn.createStatement(); 
			
			String sql1 = "CREATE TABLE IF NOT EXISTS tabela1(campo VARCHAR(767) NOT NULL, UNIQUE(campo))";
			String sql2 = "CREATE TABLE IF NOT EXISTS tabela2(campo VARCHAR(767) NOT NULL, UNIQUE(campo))";
			
			stm.execute(sql1);
			stm.execute(sql2);
						
		} catch (SQLException e) {
			
			System.exit(0); 
		
		} finally {
			
			try {
				
				if (stm != null)
					stm.close();
				
			} catch (SQLException e) {}
			
		}// finally
		
	}// end of

e este e o codigo de acordo com a dica do lucasportela

public static void criaTabela() throws SQLException {

		Statement stm = null;

		stm = conn.createStatement();

		// monta sql
		sb.append("CREATE TABLE IF NOT EXISTS ").
		   append(TABELA).
		   append(" (").
		   append(CAMPO1).append(" VARCHAR(767) NOT NULL, ").
		   append(CAMPO2).append(" VARCHAR(767), " ).
		   append("UNIQUE(").
		   append(CAMPO1).
		   append("))");
		
		stm.execute(sb.toString());

		if (stm != null)
		  stm.close();
		
		sb.setLength(0);

	}// end of

Então, não acho o projeto grande o suficiente para justificar o uso de Hibernate

R

O hibernate nao foi criado para projetos grandes, ele foi criado para diminuir o trabalho com o SQL.

L

Boa noite amigo,

o 1º campo pode ser chave primária e 2º campo deve ser do tipo DATE.

Bom, eu faria desse jeito

M

certo, mas como não precisei incluir nenhum framework no projeto, vou pensar a respeito …

vero, pra fazer checagem de NULL, não preciso alocar tanto espaço …

SQL não é o meu forte … mas vamos evoluindo hehe :slight_smile:

R

Eu li e re-li esse topico, e nao achei em nenhum lugar a sua consulta, voce somente mostrou um exemplo no inicio.

Otimizar um SELECT campo FROM tabela WHERE campo = ‘xyz’, acho que a questao de performance ai nao é na instrucao SQL, um select tao simples como esse nao é a causa do seu gargalo.

Tem como voce mostrar o metodo onde voce esta realizando essa consulta ?

M

as consultas sql são simples assim, o que acontece é que os métodos de acesso ao banco são synchronized, para o acesso de dezenas de threads, poderia isso ser um gargalo ? olha por exemplo o meu insert

public static synchronized void insereLinkBanco(String info) throws SQLException {

		PreparedStatement stm = null;

		// monta sql
		sb.append("INSERT INTO ").
		   append(TABELA).
		   append(" (").
		   append(CAMPO1).
		   append(", ").
		   append(CAMPO2).
		   append(") VALUES (?,NULL)");

		// executa comando
		stm = conn.prepareStatement(sb.toString());
		stm.setString(1, info); 
		stm.executeUpdate();
		
		if (stm != null)
			stm.close();

		sb.setLength(0);
		
	}// end of insereLinkBanco

simples, so que este metodo e executado por muitas threads

Criado 5 de fevereiro de 2013
Ultima resposta 9 de fev. de 2013
Respostas 15
Participantes 8