У меня есть файл Access, выполняющий запрос, который не имеет такого поведения на моем рабочем столе и на сервере под управлением Windows 2003 Server.Этот запрос извлекает данные из нескольких связанных таблиц MySQL с помощью коннектора MyODBC, чтобы вставить их в другую рабочую таблицу в моем файле Access.
На моем рабочем столе все работает нормально, выполнение запроса занимает приблизительно 20 секунд,Но когда я пытаюсь сделать то же самое на сервере 2003, для выполнения запроса требуется бесконечное время, и даже через несколько минут он продолжает выполняться без заполнения моей таблицы доступа.
Вот что регистрируетсяКоннектор MySQL ODBC на моем рабочем столе:
SELECT `wsDispo_produits`.`code_fournisseur` ,`wsDispo_produits`.`code_int_produit` ,`wsDispo_produits`.`ref_fournisseur` ,`wsDispo_produits`.`qte_plaque` ,`wsDispo_produits`.`plaques_par_roll` ,`wsDispo_produits`.`prix` ,`wsDispo_produits`.`prix_etage` ,`wsDispo_produits`.`prix_roll` ,`wsProduits`.`designation` ,`wsProduits`.`taille_pot` ,`wsProduits`.`hauteur` ,`wsProduits`.`gencod` ,`wsFournisseur`.`raison_sociale` ,`wsProvenance`.`type_expedition` ,`wsProvenance`.`comm_produit` ,`wsProvenance`.`comm_transport` ,`wsProvenance`.`coef_transport` ,`wsTarifs_expedition`.`tarif` FROM `wsDetail_offre`,`wsZone_departements`,`wsDispo_produits`,`wsProduits`,`wsProvenance`,{oj `wsFournisseur` LEFT OUTER JOIN `wsTarifs_expedition` ON (`wsFournisseur`.`code_fournisseur` = `wsTarifs_expedition`.`code_fou` ) } WHERE ((((((`wsDetail_offre`.`code_int_produit` = `wsDispo_produits`.`code_int_produit` ) AND (`wsDetail_offre`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) ) AND (((`wsZone_departements`.`departement` IN ('*' ,'75' ) ) AND ((`wsZone_departements`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) AND (`wsZone_departements`.`code_zone` = `wsDispo_produits`.`code_zone` ) ) ) AND (`wsDispo_produits`.`code_fournisseur` = `wsFournisseur`.`code_fournisseur` ) ) ) AND (`wsDispo_produits`.`code_int_produit` = `wsProduits`.`code_produit` ) ) AND (`wsFournisseur`.`code_pro` = `wsProvenance`.`code_pro` ) ) AND (((`wsTarifs_expedition`.`departement` IS NULL ) OR ((`wsTarifs_expedition`.`departement` = '75' ) AND (`wsTarifs_expedition`.`nb_max_roll` = 3 ) ) ) AND ((`wsDetail_offre`.`code_liste` )= ANY (SELECT `wsOffre`.`code_liste` FROM `wsOffre` WHERE ((`wsOffre`.`date_deb` = {ts '2011-07-01 15:00:00'} ) AND (`wsOffre`.`date_fin` = {ts '2011-07-08 15:00:00'} ) ) ))) ) ;
COMMIT;
И следующий журнал на сервере 2003:
SELECT `wsDetail_offre`.`code_liste` ,`wsDispo_produits`.`code_fournisseur` ,`wsDispo_produits`.`code_int_produit` ,`wsDispo_produits`.`ref_fournisseur` ,`wsDispo_produits`.`qte_plaque` ,`wsDispo_produits`.`plaques_par_roll` ,`wsDispo_produits`.`prix` ,`wsDispo_produits`.`prix_etage` ,`wsDispo_produits`.`prix_roll` ,`wsFournisseur`.`code_fournisseur` ,`wsFournisseur`.`raison_sociale` ,`wsFournisseur`.`code_pro` ,`wsProduits`.`designation` ,`wsProduits`.`taille_pot` ,`wsProduits`.`hauteur` ,`wsProduits`.`gencod` FROM `wsDetail_offre`,`wsZone_departements`,`wsDispo_produits`,`wsFournisseur`,`wsProduits` WHERE ((((`wsDetail_offre`.`code_int_produit` = `wsDispo_produits`.`code_int_produit` ) AND (`wsDetail_offre`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) ) AND (((`wsZone_departements`.`departement` IN ('*' ,'75' ) ) AND ((`wsZone_departements`.`code_fournisseur` = `wsDispo_produits`.`code_fournisseur` ) AND (`wsZone_departements`.`code_zone` = `wsDispo_produits`.`code_zone` ) ) ) AND (`wsDispo_produits`.`code_fournisseur` = `wsFournisseur`.`code_fournisseur` ) ) ) AND (`wsDispo_produits`.`code_int_produit` = `wsProduits`.`code_produit` ) ) ;
SELECT `code_fou` ,`departement` ,`nb_max_roll` ,`tarif` FROM `wsTarifs_expedition` WHERE (`code_fou` = 1);
SELECT `code_pro` ,`type_expedition` ,`comm_produit` ,`comm_transport` ,`coef_transport` FROM `wsProvenance` WHERE (`code_pro` = 1);
SELECT `code_pro` ,`type_expedition` ,`comm_produit` ,`comm_transport` ,`coef_transport` FROM `wsProvenance` WHERE (`code_pro` = 1);
...
И он продолжает выполнять запросы, как последние два, пока я не убью MsAccess.Я не могу понять, почему запрос не выполняется таким же образом.Уже проверил, что те же версии MsAccess и ODBC Connector запущены (MsAccess 2003 SP3 и MySQL Connector 5.1.8).Я провел такой же тест на другом сервере под управлением Windows Server 2008, и он отлично работает, как мой рабочий стол.Я даже пытался на сервере 2003 восстановить Office и деинсталлировать / переустановить ODBC Connector.
Единственное, что я заметил, это то, что на сервере 2003 запрос преобразуется, чтобы не использовать LEFT OUTER JOIN.
У кого-нибудь есть объяснения по этому поводу?
Спасибо.