Working with TQuery

From InterBase
Jump to: navigation, search

Go Up to Programming Applications with Delphi or C++Builder


Use TQuery rather than TTable; the latter should never be used with InterBase.


Why Not to Use TTable

Although TTable is very convenient for its RAD methods and its abstract data-aware model, it is not designed to be used with client/server applications; it is designed for use on relatively small tables in a local database, accessed in core memory.

TTable gathers information about the metadata of a table and tries to maintain a cache of the dataset in memory. It refreshes its client-side copy of the data when you issue the Post method or the TDatabase.Rollback method. This incurs a huge network overhead for most client/server databases, which have much larger datasets and are accessed over a network. In a client/server architecture, you should use TQuery instead.


Setting TQuery Properties and Methods

Set the following TQuery properties and methods as indicated to optimize InterBase performance:

  • CachedUpdates property: set this property to <False> to allow the server to handle updates, deletes, and conflicts.
  • RequestLive property: set this property to <False> to prevent the VCL from keeping a client-side copy of rows; this has a benefit to performance because fewer data must be sent over the network.

In a client/server configuration, a “fetch-all” severely affects database performance, because it forces a refresh of an entire dataset over the network. Here are some instances in which cause a TQuery to perform a fetch-all:

  • Locate method: you should only use Locate on local datasets.
  • RecordCount property: although it is nice to get the information on how many records are in a dataset, calculating the RecordCount itself forces a fetch-all.
  • Constraints property: let the server enforce the constraint.
  • Filter property: let the server do the filtering before sending the dataset over the network.
  • Commit method: forces a fetch-all when the BDE DRIVER FLAGS option is not set to 4096 (see Setting the Driver Flags), or when you are using explicit transaction control.

Advance To: