Разница в оптимизации между вызовом запроса внутри собственного приложения и прогрессивным архитектором базы данных - PullRequest
3 голосов
/ 21 ноября 2011

В данный момент я работаю с сервером базы данных преимущества от sybase.Я программирую на Delphi и использую локальный сервер.Моя проблема заключается в том, что если я сделаю SQL-запрос внутри собственного исходного кода, запрос будет в 3 раза медленнее (особенно для вложенных запросов Select), как если бы я использовал точно такой же запрос в Advantage Database Architect, также поставляемой sybase.База данных также одинакова.Есть ли какой-то шаг оптимизации, который мне не хватает?

Мой исходный код выглядит следующим образом:

  //Initializing Connection and Query
  FADSConnection.LoginPrompt := false;
  FADSConnection.ConnectPath := Filename;
  FADSConnection.AdsServerTypes := [stADS_LOCAL];
  FADSConnection.Name := 'ADB';
  FADSConnection.EncryptionOptions.DataEncryptionType := etAdsAES256;
  FADSConnection.IsConnected := true;


  FADSQuery.DatabaseName := FADSConnection.Name;
  FADSQuery.SourceTableType := ttAdsADT;
  FADSQuery.AdsTableOptions.AdsCharType := GERMAN_VFP_CI_AS_437;

  s := 'SELECT *' 
       + 'FROM ADB_Table1 WHERE No IN' 
       +'(SELECT No' 
       +       'FROM ADB_Table2 WHERE V=0.4 AND N=26 AND No IN' 
       +       '(SELECT No FROM ADB_Table2 WHERE V=0.6 AND N=8)) AND Count=2'

  FADSQuery.sql.Text := s;
  FADSQuery.Open;
  FADSQuery.first;

Запрос занимает в моей программе 600 мс.В архитектуре базы данных преимуществ требуется 200 мс.База данных насчитывает около 18000 записей.

Заранее спасибо!

1 Ответ

0 голосов
/ 30 января 2012

Итак, я нашел свою ошибку:

Проблема заключается в инициализации экземпляра запроса.Каким-то образом переопределение исходного типа таблицы и AdsCharType не требуется.

FADSQuery.SourceTableType := ttAdsAdt;
FADSQuery.Tableoptions.AdsCharType := GERMAN_VFP_CI_AS_437;

Я только что удалил вышеупомянутые строки, и мои запросы почти так же быстры, как Advantage Data Architect.

...