Problemas com performace.

Firebird

18/08/2004

Caros amigos estou colocando o banco de dados dos Correios, no meu sistema. Mas estou enfrentando o seguinte problema. O Banco de Dados de Ruas, e muito grande (mais de meio milhao de registros). Ai funciona da seguinte forma:

Tenho uma tabela com os Estados brasileiros, uma com as cidades e a de Logradouros, que tem todas as ruas das cidades que tenham cep individual por rua. (e a grande). Entao a tabela de Logradouro e ´ligada´ através de um campo a de cidades que por sua vez e ´ligada´ através de um campo a de Estado. Mas o problema e o seguinte, eu liguei uma a outra usando o ´MasterSource´ e ´MasterField´ do componente ClientDataSet, e nao utilizo nada o Banco de Dados para ligar uma na outra, esta certo? Acontece que assim que eu abro o ClientDataSet da Tabela Logradouro, tanto a pesquisa como a navegaçao do cadastro fica muito lenta.
Ja me falaram para usar chave estrangeira para ligar uma tabela a outra, mas nao sei como criar uma chave estrangeira, e isso resolveria o meu problema?

Aguardo uma ajuda!

Obrigado!


Luiz.claudio.vieira

Luiz.claudio.vieira

Curtidas 0

Respostas

Afarias

Afarias

18/08/2004

|Mas o problema e o seguinte, eu liguei uma a outra usando
|o ´MasterSource´ e ´MasterField´ do componente ClientDataSet, e nao
|utilizo nada o Banco de Dados para ligar uma na outra, esta certo?

NÃO, por 2 motivos::

1 - vc pelo visto está carregando tudo no ClientDataSet o q é uma ´loucura´ :wink: -- vc tem q consultar usando SQL só o logradouro q precisa.

2 - se vc não criou FKs então certifíque-se de criar índices nos campos de relacionamento ou um JOIN entre as tabelas será um ´desastre´



|Acontece que assim que eu abro o ClientDataSet da Tabela Logradouro,
|tanto a pesquisa como a navegaçao do cadastro fica muito lenta.

Era de se esperar


|Ja me falaram para usar chave estrangeira para ligar uma tabela a
|outra, mas nao sei como criar uma chave estrangeira, e isso resolveria
|o meu problema?

Apenas isso NÃO resolve -- vc deve fazer consultas parametrizadas (pode até ser com o ClientDataSet mesmo) - mas não pode abrí-lo executando um SQL (select * from logradouros) q traz 1/2 milhão de registros para memória.



T+


GOSTEI 0
Luiz.claudio.vieira

Luiz.claudio.vieira

18/08/2004

Cara, me desculpa as perguntas ai, mais qual seria a melhor solução? O que é e como crio indices? Alem dos indices se eu usar Fk ajuda? Como crio uma FK? Como faço a busca para trazer apenas o registro que eu preciso?

Me desculpa novamente! E muito obrigado por tudo!


GOSTEI 0
Afarias

Afarias

18/08/2004

|Cara, me desculpa as perguntas ai, mais qual seria a melhor solução?

além de ter os índices necessários criados no banco, é na sua Query ter uma consulta parametrizada do tipo::

select {bla-bla-bla}
where cidade = :parametro_cidade
and bairro = :parametro_bairro
and {...}

sei lá... (algo assim)

O q vc não pode é slecionar TUDO!


|O que é e como crio indices?

bom, se ve é programador e pretende trabalhar com banco de dados sugiro q estude bastante sobre eles (os bancos de dados) antes de mais nada!

Índices são estruturas muito importantes em bancos de dados e, sua principal função é fornecer um meio rápido para encontrar registros (por exemplo, na sua agenda de contatos deve ter umas abas com as letras A, B, C ... e quando vc quer o telefone da CARLA vc vai direto na página com a aba C nào é mesmo?? -- pronto, isso são índices!)

para criá-los no IB a sintaxe é::

create [desc] [unique] index nome_do_indice on nome_da_tabela (lista_de_campos);

os valores entre [] são opcionais


|Alem dos indices se eu usar Fk ajuda?

As FK criam os índices para vc, não sendo necessário criá-los


|Como crio uma FK?

ALTER TABLE nome_da_tabela ADD CONSTRAINT nome_fk
FOREIGN KEY (lista_de_campos) REFERENCES nome_da_tabela_de_referencia (lista_de_campos_pk)


|Como faço a busca para trazer apenas o registro que eu preciso?

bom, ai só vc sabe! :) pq tem q saber a estrutura das tabelas e exatamente o q vc precisa!

Dê uma estudada em SQL -- principalmente no comando SELECT


T+


GOSTEI 0
Luiz.claudio.vieira

Luiz.claudio.vieira

18/08/2004

Digamos que eu tenha uma tabela com os seguintes campos:

CREATE TABLE ESTADO
(
CodEstado Integer NOT NULL,
SiglaEstado VarChar(2) ,
SiglaPais VarChar(3),
Estado VarChar(30),


PRIMARY KEY (CodEstado)
);

e outra tabela Localidade, com os seguintes campos:

CREATE TABLE LOCALIDADE
(
CodLocalidade Integer NOT NULL,
CodEstado Integer,
NomeLocalidade VarChar(50),


PRIMARY KEY (CodLocalidade)
);

como eu faria um Chave estrangeira ligando o campo CodEstado da tabela LOCALIDADE ao campo CodEstado da tabela ESTADO. Pq a Localidade e vinculada ao Estado, do mesmo jeito que as ruas sao vinculadas as cidades.

Um abraço!


GOSTEI 0
Afarias

Afarias

18/08/2004

|como eu faria um Chave estrangeira ligando o campo CodEstado da
|tabela LOCALIDADE ao campo CodEstado da tabela ESTADO.


ALTER TABLE LOCALIDADE ADD CONSTRAINT FK_LOC_ESTADO
FOREIGN KEY (CodEstado) REFERENCES ESTADO (CodEstado);



T+


GOSTEI 0
Luiz.claudio.vieira

Luiz.claudio.vieira

18/08/2004

Eu o seguinte erro!

This operation is not defined for system tables.
unsuccessful metadata update.
could not find UNIQUE INDEX with specified columns.


GOSTEI 0
Afarias

Afarias

18/08/2004

uma FK deve fazer referência a uma PK (chave primária) -- pelo erro q vc está citando só posso pensar q vc NÃO definiu o campo CodEstado da tabela ESTADO como PK (diferente do q mostra o SQL q vc postou!)



T+


GOSTEI 0
POSTAR