本帖最后由 qtcxc 于 2022-8-24 13:36 编辑
目前在写一个比较复杂的服务器端命令,测试过程中发现速度异常的慢,基本为不可用状态,刚开始以为是自己写的逻辑太复杂导致的执行慢的问题,经过几天的跟踪测试逐一排查最后找到问题的节点:
程序慢的原因通过,跟踪每一步执行的sql得出的结果是,在对其中一个大表插入数据时 ,用服务器端命令进行插入,插入完成后会查询遍历整个表,导致整个插入动作执行速度变慢(99%的时间在执行这个动作,如果循环插入多次则反复执行这个查询)导致整个程序执行非常慢,而这个动作的执行有什么意义?好像纯粹将整个表查询出来用一次.
进一步测试结果为:
1 用数据库客户端直接插入记录跟踪不会有这种问题(排除数据库结构引起)
2 在活字格设计器的数据库中手工操作插入数据跟踪不会有这个语句产生(排除所有活字格插入操作都会有问题的可能)
3 在活字格客户端命令(非服务器端命令)中插入数据跟踪,不会产生这个语句(排除客户端数据表操作也会有问题的可能)
4 在服务器端命令中执行数据表操作插入数据,会产生这个语句(确认只要用服务器端命令就会产生这个问题)
5 在服务器端命令中执行数据表操作插入其他表数据,也会产生类似这样的语句,但是有区别,语句的末尾是有where 条件的所以只限定一条记录,并不会有太大性能影响.
对比4和5 的语句可以看出明显的区别,4的查询时整个表所有数据都差查询出来,而5的查询只查1条记录,且语句生成方式好像也有点不一样,4是纯sql ,而5是一条动态查询语句,带了where条件返回结果只限定未1条记录
问题:
为什么服务器端命令执行插入后要查出数据,只查插入的数据还能理解,可能是要用于作为新纪录阐述 newrow 使用,但是为什么我有一个表插入后是查出这张表所有的数据并不是只查当前插入的数据?
在目前写的服务器端命令中有很多数据的插入动作,其它表都正常,却有一个表一直会出现此问题,要如何解决!
咨询:
产生这样的情况的原因是什么,如何解决此问题?
|