Luiz Fernando Posted December 12, 2013 Report Share Posted December 12, 2013 Colegas no meu sistema em mysql ainda não criei indice para as tabelas, o meu codigo esta 100% em sql,, minha duvida é a seguinte dentro do sistema é bom eu dar uma opção pro usuario de destruir os indice já existente e criar os mesmo novamente, ou é bobeira fazer isto, uma vez criado não preciso mais me preocupar com isto.... Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted December 13, 2013 Report Share Posted December 13, 2013 Uma vez criado não precisa se preocupar, em mysql não tem essa história de ter que abrir o índice para ele ser atualizado mas se quiser ter uma segurança, e inserir uma rotina para apenas criar/re criar caso algum doido apague algo, aí seria válido. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted December 13, 2013 Author Report Share Posted December 13, 2013 Uma vez criado não precisa se preocupar, em mysql não tem essa história de ter que abrir o índice para ele ser atualizado mas se quiser ter uma segurança, e inserir uma rotina para apenas criar/re criar caso algum doido apague algo, aí seria válido. Vlw Erciley pela resposta, só para ver se eu entendi, tipo se já existe o indice criado, e eu mandar criar de novo sem apagar o mesmo com DROP não tera problema... Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Eroni Posted December 13, 2013 Report Share Posted December 13, 2013 Empresoft, tem que dar o drop antes sim. O banco não faz automatico. Em meu sistema tenho uma tela com um browse que permite as tabelas que seram criados os indices, isso para o caso de no decorrer do desenvolvimento você ir criando mais indices conforme achar necessário. Uma ideia é fazer uma função para automatizar a criação e já fazer o drop. Recomendo fortemente a rever suas tabelas e criar os indices o mais rapido possivel, porque tua aplicação vai decolar em termos de performance, principalmente se tiver base de dados grande. Se quiser posto o meu fonte de criação de indices. Abraço. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted December 13, 2013 Author Report Share Posted December 13, 2013 Eroni vlw pela resposta agora ficou bem claro, eu só coloquei este sistema em clientes novos por isto não tinha me preocupado ate então com os indice, mais no inicio do ano irei migrar meus cliente antigos dai preciso deixa pronto este esquema de indice... Obs: colega sobre os fonte, se vc poder postar um exemplo de pelo menos uma tabela,,, Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted December 13, 2013 Report Share Posted December 13, 2013 Luiz, caso você mande criar o índice, com o mesmo nome, dará erro no sql. Caso mande criar o índice DO MESMO CAMPO, dando nome diferente ao índice, não terá erro por parte do SQL, mas isso é errado, óbvio. Quanto a índices no sistema: É importantíssimo que você crie índices para "todas" suas tabelas, e tão importante quanto isso, é TODO WHERE QUE VOCÊ FIZER, fazer seguindo a ordem dos campos no índice, igual você faz em DBF, se não fizer isso, não tem sentido algum seus índices criados. A diferença de performance é imperceptível dependendo o tamanho de suas tabelas, mas pode ser MONSTRUOSA em outros casos, hehehe, ou seja, boa sexta-feira ^^ Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted December 13, 2013 Author Report Share Posted December 13, 2013 Luiz, caso você mande criar o índice, com o mesmo nome, dará erro no sql. É importantíssimo que você crie índices para "todas" suas tabelas, e tão importante quanto isso, é TODO WHERE QUE VOCÊ FIZER, fazer seguindo a ordem dos campos no índice, igual você faz em DBF, se não fizer isso, não tem sentido algum seus índices criados. A diferença de performance é imperceptível dependendo o tamanho de suas tabelas, mas pode ser MONSTRUOSA em outros casos, hehehe, ou seja, boa sexta-feira ^^ Colega mesmo nas tabelas pequena preciso criar indice, estava pensando em fazer só nas mais pesada, tipo tabela de cadastro de conta corrente, terá ai no máximo 5 registro, preciso criar indice mesmo assim... Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
Erciley Junior Posted December 13, 2013 Report Share Posted December 13, 2013 Você não precisa e creio que não sentirá diferença alguma, criando ou não, ou seja, não precisa.... mas é aquela história de boas práticas............ sempre é bom ter...... sempre tendo, nunca terá problemas, blablabla. Fica a seu critério imagine em um DBF de 5 registros..... você quer informação do registro CÓDIGO = 5, oq vc faz? lAchou:=.F. DBGOTOP() WHILE !EOF() IF CODIGO == 5 lAchou:=.T. EXIT ENDIF DBSKIP(1) ENDDO IF lAchou ?'ACHOU, EBAAAAA' ELSE ?'REGISTRO NÃO ENCONTRADO' ENDIF Imagino que no mysql seria a mesma coisa, ou seja, melhor ter doq não ter ^^ Quote Link to comment Share on other sites More sharing options...
Eroni Posted December 13, 2013 Report Share Posted December 13, 2013 Boa tarde, segue o meu fonte. // Quando o usuario clicar Ok para iniciar , com o browse marcado...... For a := 1 to len( [ sua lista de tabelas, ou seu browse de tela ] ) CASE [ linha do seu browse ] == "tabela abc" // Mensagem ao usuario tipo "aguarde, indexando a tabela abc..." SWCreateIndex( [ linha do seu browse ], [Nome do indice no banco ], [nome do campo ] ) SWCreateIndex( [ linha do seu browse ], [Nome do indice no banco ], [nome do campo , nome do campo 2 ] ) // e assim sucessivamente, para varios indices da mesma tabela next a // proxima tabela marcada // etc, finalizar. ******************************************************************************************* ******************************************************************************************* FUNCTION SWCreateIndex( cTable, cIndex, cKey ) LOCAL cDropIndex := "" IF cTable = NIL .OR. cIndex == NIL .OR. cKey == NIL RETURN( .F. ) ENDIF cDropIndex := "DROP INDEX " + Upper( AllTrim( cIndex ) ) IF Upper( oSistema:cDbDriver_ ) == "MYSQL" cDropIndex := "DROP INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) ) ENDIF TRY SWExecSql( cDropIndex,.F. ) SWExecSql( "CREATE INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) ) + " (" + Upper( AllTrim( cKey ) ) + ")",.F. ) CATCH SWExecSql( "CREATE INDEX " + Upper( AllTrim( cIndex ) ) + " ON " + Upper( AllTrim( cTable ) ) + " (" + Upper( AllTrim( cKey ) ) + ")",.F. ) END RETURN( .T. ) Desculpe se nao ta claro o suficiente, qualquer coisa é so pedir por email, ou skype. Abraço. Quote Link to comment Share on other sites More sharing options...
Luiz Fernando Posted December 13, 2013 Author Report Share Posted December 13, 2013 Maravilha Eroni ficou bem claro, vou criar o meu aqui usando mais ou menos a mesma logica do seu exemplo, só mais uma duvida, se um usuario for executar esta rotina num terminal, os demais terminais podem estar usando o sistema sem problema, ou é aconselhado ninguém estar usando o sistema durante este processo... Obrigado Luiz Fernando Quote Link to comment Share on other sites More sharing options...
kleyber Posted December 14, 2013 Report Share Posted December 14, 2013 Senhores, Vendo este tópico, gostaria de fazer uma pergunta: Há realmente a necessidade de se recriar os índices em um banco SQL? Eu tenho trabalhado com bancos SQL desde 2009 e nunca vi a necessidade de se recriar índices, até porque quem gerencia isso é o próprio banco e não o nosso sistema, tal como fazemos em dbf. Fica só a questão. Quote Link to comment Share on other sites More sharing options...
evandro Posted December 15, 2013 Report Share Posted December 15, 2013 Olá, Criar os índices é fundamental. Mas isto é feito na criação das tabelas. O que é desnecessária é a rotina de [re]criação de índices. Uma vez criado não se mexe mais. Não é preciso. Quote Link to comment Share on other sites More sharing options...
Recommended Posts
Join the conversation
You can post now and register later. If you have an account, sign in now to post with your account.