Я подключаюсь из php к файлу dBase .dbf (созданному другим приложением) с odbc:
//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 МБ;
- 03BORIGD.DBF - это файл 4 МБ;
Выполнение запроса действительно медленное ... пример:
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