Recent

Author Topic: Forçar uso de scan por index  (Read 5983 times)

nightrider

  • Full Member
  • ***
  • Posts: 139
Forçar uso de scan por index
« on: January 01, 2012, 12:24:45 am »
Como posso ter certeza de vá usar ou forçar o Lazarus a gerar o código de 1 SELECT em SQLite fazendo o scan da base usando um index criado no DB?

Saudações desde São Paulo - SP

Ricardo

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Forçar uso de scan por index
« Reply #1 on: January 02, 2012, 10:24:25 am »
Você não mencionou quais componentes você está usando, suponho que TSqlite3Dataset+TDataSource. Tem uma propriedade SQL no TSqlite3Dataset, você pode tentar colocar o select lá.

Mas estou chutando pois banco de dados não é o meu forte.

nightrider

  • Full Member
  • ***
  • Posts: 139
Re: Forçar uso de scan por index
« Reply #2 on: January 02, 2012, 11:59:05 am »
Nao, Felipe. To usando TSQLite3Connection, TSQLTransaction e TSQLQuery. TSQLite3dataset nao permite até onde consegui apurar, por exemplo, o uso de parametros simbolicos num INSERT ou UPDATE. Entao, se tua logica fizer alguns milhares de INSERT ou UPDATE serao outros tantos milhares de parses executados em tempo de execucao causando dramatico impacto no tempo de execucao.

[ ]

Ricardo

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Forçar uso de scan por index
« Reply #3 on: January 02, 2012, 01:06:06 pm »
Se está usando TSQLQuery daí é fácil. Aqui um exemplo de como eu uso TSQLQuery especificando o meu próprio SELECT:

  SQLGameEvent := TSQLQuery.Create(nil);
  SQLGameEvent.Transaction := DBComm.SQLTransaction;
  SQLGameEvent.Database := DBComm.PQConnection;
  SQLGameEvent.SQL.Text := 'select * from "GameEvent"';
  SQLGameEvent.FieldDefs.Add('Id', ftInteger);
  SQLGameEvent.FieldDefs.Add('EventType', ftSmallint);
  SQLGameEvent.FieldDefs.Add('BetRules', ftSmallint);
  SQLGameEvent.FieldDefs.Add('PlayRules', ftSmallint);
  SQLGameEvent.FieldDefs.Add('RakeRules', ftSmallint);
  SQLGameEvent.FieldDefs.Add('AccountType', ftSmallint);
  SQLGameEvent.FieldDefs.Add('MaxPlayers', ftSmallint);
  SQLGameEvent.FieldDefs.Add('StyleScheme', ftSmallint);
  SQLGameEvent.FieldDefs.Add('BetLimit', ftInteger);
  SQLGameEvent.Active := True;

Eu nunca uso parâmetros simbólicos no meu SQL, então não sei sobre isso, mas acho que alguém falou sobre isso na mailling list uma vez numa pergunta minha.
« Last Edit: January 02, 2012, 01:08:00 pm by felipemdc »

nightrider

  • Full Member
  • ***
  • Posts: 139
Re: Forçar uso de scan por index
« Reply #4 on: January 02, 2012, 02:39:49 pm »
Como de hábito, não domino este modo de construir um select. Me pareceu até, confesso mais confuso que o método que exponho. Mas quem sou eu pra criticar o teu código. Em todo caso nao vi em nenhum lugar tu especificando o uso de 1 index predefinido no proprio DB.

Eu faco assim:

TSQLQuery.SQL.Text :=
            'select * from MySQLTable where lote = ''NOVO'' and numfunc >= 30';

Depois do respectivo open, acesso as colunas usando, p/ex.:

salario := TSQLQuery.FieldByName('salfunc').AsFloat;

(Provavelmente há considerações de performance outras alem do scan no metodo que uso. Mas é o jeito que aprendi)

Enfim, se to fazendo acesso por lote e numero do funcionario e há um index no DB, justamente por estes 2 campos, como forço o uso? Ou em todos RDBMS o uso já é automático num caso destes? Eu lembro que o DB2 dos mainframes assumiria por conta propria o uso. Só que o DB2 foi escrito por uma mega desenvolvedora de software que é a Big Blue.  Será que estes outros DBs escritos por comunidades se viram direitinho nestes casos e assumem o index sozinhos? Ou tem como e precisa-se forçar no Lazarus?(que é a minha pergunta original, alias)

[ ]
« Last Edit: January 02, 2012, 11:51:50 pm by nightrider »

felipemdc

  • Administrator
  • Hero Member
  • *
  • Posts: 3538
Re: Forçar uso de scan por index
« Reply #5 on: January 03, 2012, 01:45:38 am »
Como de hábito, não domino este modo de construir um select. Me pareceu até, confesso mais confuso que o método que exponho. Mas quem sou eu pra criticar o teu código. Em todo caso nao vi em nenhum lugar tu especificando o uso de 1 index predefinido no proprio DB.

O meu código não tem index. A sua pergunta original era "Como posso ter certeza de vá usar ou forçar o Lazarus a gerar o código de 1 SELECT", daí a minha resposta era no sentido de que não sei se é possível forçar o Lazarus a gerar o código do SELECT, mas você pode criar seu próprio SELECT usando a propriedade SQL.Text.

Mas vendo o resto da tua resposta já posso adiantar que não faço idéia e a questão claramente depende de conhecer bem o sqlite. Talvez tenha mais sorte perguntando num forum dedicado ao sqlite ou aqui em inglês. Se você colocar um SELECT, o sqldb (A biblioteca que contem a classe TSQLQuery por exemplo) manda ele pro banco de dados sem mudanças. O que o sqlite faz com o SELECT já são outros 500.

nightrider

  • Full Member
  • ***
  • Posts: 139
Re: Forçar uso de scan por index
« Reply #6 on: January 03, 2012, 11:44:51 am »
Ok, muito o brigado. Provavelmente postarei no forum em ingles antes de ir pra outros foruns.

Só para esclarecer, não para polemizar, minha pergunta original era:

"Como posso ter certeza de que vá usar ou forçar o Lazarus a gerar o código de 1 SELECT em SQLite fazendo o scan da base usando um index criado no DB?"

[ ]  e grato pela intercessao

Ricardo

 

TinyPortal © 2005-2018