Problemas com performace.
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!
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
Curtidas 0
Respostas
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+
|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
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!
Me desculpa novamente! E muito obrigado por tudo!
GOSTEI 0
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+
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
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!
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
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+
|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
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.
This operation is not defined for system tables.
unsuccessful metadata update.
could not find UNIQUE INDEX with specified columns.
GOSTEI 0
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+
T+
GOSTEI 0