Ajuda com query.
Boa tarde a todos, estou com um problema no qual não consigo achar solução, sem mudanças drásticas...
Vamos lá,
tenho a seguinte Tabela
CREATE TABLE CUSTOMER (
ID BIGINT NOT NULL,
NAME VARCHAR(256) CHARACTER SET NONE COLLATE NONE,
DOCUMENT_TYPE INTEGER,
DOCUMENT_NUMBER VARCHAR(100) CHARACTER SET NONE COLLATE NONE,
DISPATCHER VARCHAR(256) CHARACTER SET NONE COLLATE NONE,
DOCUMENT_STATE CHAR(2) CHARACTER SET NONE COLLATE NONE);
ALTER TABLE CUSTOMER ADD CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID);
CREATE INDEX IDX_CUSTOMER_ID ON CUSTOMER(ID);;
com exatamente 4342 registro (Teoricamente muito pouco)
Porém qualquer simples consulta que eu faça ao banco utilizando a SQL a seguir
SELECT * FROM customer WHERE name = ´guilherme´;
Leva no mínimo 78ms até 94ms para executar.
Começei a realizar estes testes porque esta achando muito lenta essa outra SQL
SELECT COUNT(id) FROM customer WHERE ((UPPER(udf_CollateBr(name)) like UPPER(udf_CollateBr(´¬gu¬´ ))))
Que Leva entre 95ms até 108ms para executar.
Alguem poderia tentar me ajuda?
Muito Obrigado a Todos.
Att,
Guilherme.
Vamos lá,
tenho a seguinte Tabela
CREATE TABLE CUSTOMER (
ID BIGINT NOT NULL,
NAME VARCHAR(256) CHARACTER SET NONE COLLATE NONE,
DOCUMENT_TYPE INTEGER,
DOCUMENT_NUMBER VARCHAR(100) CHARACTER SET NONE COLLATE NONE,
DISPATCHER VARCHAR(256) CHARACTER SET NONE COLLATE NONE,
DOCUMENT_STATE CHAR(2) CHARACTER SET NONE COLLATE NONE);
ALTER TABLE CUSTOMER ADD CONSTRAINT PK_CUSTOMER PRIMARY KEY (ID);
CREATE INDEX IDX_CUSTOMER_ID ON CUSTOMER(ID);;
com exatamente 4342 registro (Teoricamente muito pouco)
Porém qualquer simples consulta que eu faça ao banco utilizando a SQL a seguir
SELECT * FROM customer WHERE name = ´guilherme´;
Leva no mínimo 78ms até 94ms para executar.
Começei a realizar estes testes porque esta achando muito lenta essa outra SQL
SELECT COUNT(id) FROM customer WHERE ((UPPER(udf_CollateBr(name)) like UPPER(udf_CollateBr(´¬gu¬´ ))))
Que Leva entre 95ms até 108ms para executar.
Alguem poderia tentar me ajuda?
Muito Obrigado a Todos.
Att,
Guilherme.
Psyke
Curtidas 0
Respostas
Robson Catunda
11/02/2010
psyke,
Primeiramente, vc não precisa criar um índice para um campo que já é uma chave primary key. A primary key já é um índice. Logo, "CREATE INDEX IDX_CUSTOMER_ID ON CUSTOMER(ID)" não é necessário.
Quanto à velocidade, vc deve criar um índice com o campo NAME.
Outra coisa, se o banco já vem sendo usado ou testado há algum tempo, quer dizer, já teve muita inclusão e exclusão de registros, é bom vc fazer um backup e restore com o gbak. Isso elimina o lixo do banco e reorganiza ou atualiza os índices.
Primeiramente, vc não precisa criar um índice para um campo que já é uma chave primary key. A primary key já é um índice. Logo, "CREATE INDEX IDX_CUSTOMER_ID ON CUSTOMER(ID)" não é necessário.
Quanto à velocidade, vc deve criar um índice com o campo NAME.
Outra coisa, se o banco já vem sendo usado ou testado há algum tempo, quer dizer, já teve muita inclusão e exclusão de registros, é bom vc fazer um backup e restore com o gbak. Isso elimina o lixo do banco e reorganiza ou atualiza os índices.
GOSTEI 0
Robson Catunda
11/02/2010
ah.. um lembrete pra completar a resposta:
alguns comandos como UPPER(NAME) , %NAME , %NAME% e CONTAINING NAME, ignoram os índices existentes utilizando apenas o plano natural e ficando mais lentas as consultas.
alguns comandos como UPPER(NAME) , %NAME , %NAME% e CONTAINING NAME, ignoram os índices existentes utilizando apenas o plano natural e ficando mais lentas as consultas.
GOSTEI 0
Carlos Mazzi
11/02/2010
Resolvido ?
GOSTEI 0