0

odbc を使用して、php から dBase .dbf ファイル (別のアプリケーションによって生成された) に接続しています。

//database connection string
$dsn = "Driver={Microsoft dBASE Driver (*.dbf)};SourceType=DBF;DriverID=21;Dbq=".$GLOBALS['config']['pathToDbFiles'].";Exclusive=NO;collate=Machine;NULL=NO;DELETED=1;BACKGROUNDFETCH=NO;READONLY=false;";

//connect to database
$odbc=odbc_connect($dsn," "," ", SQL_CUR_USE_ODBC ) or die('Could Not Connect to ODBC Database!');

//query string
$query= $toSelect." FROM ".$dbFile." $conditions";

//query execution
$result = odbc_exec($odbc, $query) or die (odbc_errormsg());

次の点を考慮してください。

  • 03BOTESD.DBF は 19 MB のファイルです。
  • 03BORIGD.DBF は 4 MB のファイルです。

クエリの実行は本当に遅いです...いくつかの例:

SELECT * FROM 03BOTESD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# // exec: 23ms

SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# // exec: 82ms
SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# AND F_PROGRE=3.0 // exec: 99ms
SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# AND F_PROGRE=5.0 // exec: 99ms
SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# AND F_PROGRE=7.0 // exec: 97ms
SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2203' AND F_DATBOL=#2011-07-30# AND F_PROGRE=9.0 // exec: 98ms

SELECT * FROM 03BOTESD.DBF WHERE F_NUMBOL=' 2204' AND F_DATBOL=#2011-07-30# // exec: 25ms 

SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2204' AND F_DATBOL=#2011-07-30# // exec: 80ms
SELECT * FROM 03BORIGD.DBF WHERE F_NUMBOL=' 2204' AND F_DATBOL=#2011-07-30# AND F_PROGRE=3.0 // exec: 101ms

これらの例を見ると、ファイルが大きいほどクエリが遅くなることは明らかです。奇妙なことに、クエリでより多くのパラメーターを指定すると (その結果、選択される行が少なくなる)、実行が遅くなります。

どういうわけかそれを高速化する方法はありますか?

私はそれについて多くのことをグーグルで調べましたが、実際の解決策は見つかりませんでした:

  • SQL_CUR_USE_ODBC パラメータを接続文字列に追加しようとしました
  • 「Exclusive=yes」を dns odbc パラメータに設定しようとしました
4

0 に答える 0