Fórum Problemas com performace. #46119
18/08/2004
0
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
Curtir tópico
+ 0Posts
18/08/2004
Afarias
|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
18/08/2004
Luiz.claudio.vieira
Me desculpa novamente! E muito obrigado por tudo!
Gostei + 0
18/08/2004
Afarias
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
18/08/2004
Luiz.claudio.vieira
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
18/08/2004
Afarias
|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
18/08/2004
Luiz.claudio.vieira
This operation is not defined for system tables.
unsuccessful metadata update.
could not find UNIQUE INDEX with specified columns.
Gostei + 0
18/08/2004
Afarias
T+
Gostei + 0
Clique aqui para fazer login e interagir na Comunidade :)