为什么同一条sql语句,在navicat中比在程序中执行要快100倍以上?

时间:2021-06-22 20:06:56
sql语句:select 1 from towerload_info where FilesNames=''FC001MY1500KW19-20120801021848TJ'' and LoadSign=1
在navicat中执行时返回结果只需要100多ms,但在自己编写的程序中需要6s(ado),请各位帮忙看看是什么原因?

19 个解决方案

#1


多少数据啊?6s 有点夸张...............

#2


100ms和6s是差别很大,单单Open应该不会相差这么大
是不是ADO还执行其它事件,比如BeforeOpen,Afteropen,CalcFields,...等事件,都有代码

新建一个工程试试

#3


只有50几万条数据,应该不是语句的原因,非常想不通的问题是在navicat中运行为什么是正常的,唯一的不同是自己写的程序通过mysql的odbc驱动而已。

#4


新建工程试了一下,还是一样

#5


引用 3 楼  的回复:
只有50几万条数据,应该不是语句的原因,非常想不通的问题是在navicat中运行为什么是正常的,唯一的不同是自己写的程序通过mysql的odbc驱动而已。

具体原因待查...不瞎说,只说下我自己曾经遇到过的事情。
之前没用过MyODBC,就找了下了个用了有问题,然后重下了个 mysql-connector-odbc-5.1.5-win32.msi 用就好了。lz不妨试试看吧...

#6


是在同一台机器上吗?

#7


感觉是 数据从硬件读取的时间差别吧,不是指令时间

#8


在数据库系统的ide环境和在使用ODBC的程序中,有一些速度的差异,但一般不会达到一个数量级,慢40%左右

#9


这个应该是跟navicat自身机制有关。

#10


用odbc连接本身就会慢一点,
另外navicat软件应该对mysql的连接和查询有优化;

个人感觉应该是用odbc的原因多一点;

#11


ODBC本身就比较慢, 为什么不用ADO呢?

肯定差不了这么多...

#12


楼主试一下 select Count(*) from towerload_info where LoadSign=1 and FilesNames='FC001MY1500KW19-20120801021848TJ'
这句语句的时间,如果非常短,试一下把你的AdoQuery.CursorLocation设置成clUseServer试一下查询记录的速度,不确定能解决你的问题.
个人分析:
50万条记录查询并全部复制到本地100ms完成有点悬,所以怀疑它用的分页或者就是这样,或者其他因为你select 1,固定数字,只要一个满足条件的记录数就够了,所以navicat有可能优化,不确定这一点。

#13


navicat只有读取部分数据,显示出来

#14


如果我没有猜错的话楼主在程序里使用的是循环的方式,改用SQL语句进接打开看。

#15


引用 13 楼  的回复:
navicat只有读取部分数据,显示出来

对了 提醒我了 navicat默认是显示前1000条记录

#16


navicat?没听过。。。。

这个sql返回多少条记录?虽然字段就是1.。。。

#17


我也发现了这个问题,同样的语句,navicat vs java hibernate,相差是有100倍,不知是什么原因

#18


不过我想可能是这个原因:navicat一直是打开数据库的,而程序中需要先打开数据库,然后执行完毕再断开数据库。不过hibernate用的是连接池,也不应该差这么多啊

#19


100倍啊,有这么远的差价?我有点怀疑。

#1


多少数据啊?6s 有点夸张...............

#2


100ms和6s是差别很大,单单Open应该不会相差这么大
是不是ADO还执行其它事件,比如BeforeOpen,Afteropen,CalcFields,...等事件,都有代码

新建一个工程试试

#3


只有50几万条数据,应该不是语句的原因,非常想不通的问题是在navicat中运行为什么是正常的,唯一的不同是自己写的程序通过mysql的odbc驱动而已。

#4


新建工程试了一下,还是一样

#5


引用 3 楼  的回复:
只有50几万条数据,应该不是语句的原因,非常想不通的问题是在navicat中运行为什么是正常的,唯一的不同是自己写的程序通过mysql的odbc驱动而已。

具体原因待查...不瞎说,只说下我自己曾经遇到过的事情。
之前没用过MyODBC,就找了下了个用了有问题,然后重下了个 mysql-connector-odbc-5.1.5-win32.msi 用就好了。lz不妨试试看吧...

#6


是在同一台机器上吗?

#7


感觉是 数据从硬件读取的时间差别吧,不是指令时间

#8


在数据库系统的ide环境和在使用ODBC的程序中,有一些速度的差异,但一般不会达到一个数量级,慢40%左右

#9


这个应该是跟navicat自身机制有关。

#10


用odbc连接本身就会慢一点,
另外navicat软件应该对mysql的连接和查询有优化;

个人感觉应该是用odbc的原因多一点;

#11


ODBC本身就比较慢, 为什么不用ADO呢?

肯定差不了这么多...

#12


楼主试一下 select Count(*) from towerload_info where LoadSign=1 and FilesNames='FC001MY1500KW19-20120801021848TJ'
这句语句的时间,如果非常短,试一下把你的AdoQuery.CursorLocation设置成clUseServer试一下查询记录的速度,不确定能解决你的问题.
个人分析:
50万条记录查询并全部复制到本地100ms完成有点悬,所以怀疑它用的分页或者就是这样,或者其他因为你select 1,固定数字,只要一个满足条件的记录数就够了,所以navicat有可能优化,不确定这一点。

#13


navicat只有读取部分数据,显示出来

#14


如果我没有猜错的话楼主在程序里使用的是循环的方式,改用SQL语句进接打开看。

#15


引用 13 楼  的回复:
navicat只有读取部分数据,显示出来

对了 提醒我了 navicat默认是显示前1000条记录

#16


navicat?没听过。。。。

这个sql返回多少条记录?虽然字段就是1.。。。

#17


我也发现了这个问题,同样的语句,navicat vs java hibernate,相差是有100倍,不知是什么原因

#18


不过我想可能是这个原因:navicat一直是打开数据库的,而程序中需要先打开数据库,然后执行完毕再断开数据库。不过hibernate用的是连接池,也不应该差这么多啊

#19


100倍啊,有这么远的差价?我有点怀疑。

#20