在 Win 2k3 中通过 MySQL ODBC 连接器转换访问 SQL 查询

发布于 2024-11-18 12:13:36 字数 4070 浏览 1 评论 0原文

我有一个运行查询的 Access 文件,该查询在我的桌面上和运行 Windows 2003 Server 的服务器上没有相同的行为。 此查询使用 MyODBC 连接器从多个 MySQL 链接表检索数据,以便将其插入到我的 Access 文件中的另一个工作表中。

在我的桌面上,一切正常,查询运行大约需要 20 秒。 但是,当我尝试在 2003 服务器上执行相同的操作时,查询需要无限的时间才能运行,甚至在几分钟后,它仍会继续运行,而不会填充我的 Access 表。

以下是我桌面上的 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 连接器(MsAccess 2003 SP3 和 MySQL Connector 5.1.8)。 我在另一台运行 Windows Server 2008 的服务器上运行了相同的测试,它像我的桌面一样运行良好。我什至尝试在2003服务器上修复Office并卸载/重新安装ODBC Connector。

我唯一注意到的是,在 2003 服务器上,查询被转换为不使用 LEFT OUTER JOIN。

有人对此有任何解释吗?

谢谢。

I have an Access file running a query that does not have the same behavior on my desktop and on a server running Windows 2003 Server.
This query retrieves data from several MySQL linked tables using the MyODBC connector in order to insert it into another work table in my Access file.

On my desktop, everything just works fine, the query takes approximatively 20 seconds to run.
But when I try to do the same thing on the 2003 server, the query takes infinite time to run, and even after several minutes, it keeps running without populating my Access table.

Here is what is logged by the MySQL ODBC connector on my desktop :

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;

And next the log on the 2003 server :

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);
...

And it keeps running queries like the last two until I kill MsAccess.
I can't figure out why the query is not executed the same way. Already checked that same versions of both MsAccess and ODBC Connector are ran (MsAccess 2003 SP3 and MySQL Connector 5.1.8).
I ran the same test on another server running Windows Server 2008 and it works fine like my desktop. I even tried on the 2003 server to repair Office and uninstall / reinstall ODBC Connector.

The only thing I noticed is that on the 2003 server the query is transformed in order not to use the LEFT OUTER JOIN.

Has someone any explainations on this ?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。
列表为空,暂无数据
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文