Forum > Portuguese
Forçar uso de scan por index
nightrider:
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:
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:
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:
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.
nightrider:
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)
[ ]
Navigation
[0] Message Index
[#] Next page