为什么nodejs orm的性能远不只是运行简单的查询



仅使用ORM2进行一些性能测试,并且似乎速度慢了4倍,而不是直接使用SQL查询。有任何想法吗?

https://github.com/gmaggiotti/rule-restapi/tree/orm-poc

使用ORM2

基准测试
Document Path:          /rules/
Document Length:        6355 bytes
Concurrency Level:      100
Time taken for tests:   5.745 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      6484000 bytes
HTML transferred:       6355000 bytes
Requests per second:    174.06 [#/sec] (mean)
Time per request:       574.526 [ms] (mean)
Time per request:       5.745 [ms] (mean, across all concurrent requests)
Transfer rate:          1102.13 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       2
Processing:   118  552  83.1    555     857
Waiting:      116  552  83.1    555     857
Total:        119  552  83.0    555     857

仅使用SQL

基准
Document Path:          /rules/
Document Length:        6355 bytes
Concurrency Level:      100
Time taken for tests:   1.630 seconds
Complete requests:      1000
Failed requests:        0
Total transferred:      6484000 bytes
HTML transferred:       6355000 bytes
Requests per second:    613.38 [#/sec] (mean)
Time per request:       163.032 [ms] (mean)
Time per request:       1.630 [ms] (mean, across all concurrent requests)
Transfer rate:          3883.92 [Kbytes/sec] received
Connection Times (ms)
              min  mean[+/-sd] median   max
Connect:        0    0   0.3      0       2
Processing:    98  158  49.2    137     361
Waiting:       98  158  49.2    137     361
Total:         98  158  49.4    137     362

不确定这是一个答案,但要发表评论太长。

(根据我的经验)在每个语言/平台上,对于每个ORM都是正确的。通常,您不使用ORMS进行查询性能,而是将其用于代码维护优化和开发人员速度。

为什么这样?好吧,通常,Orms必须将您在语言X中所说的内容转换为SQL,这样做通常不会提出最优化的查询。他们通常会飞行进行查询生成,因此(理想参数化的)SQL的字符串的实际"构建"需要少量时间,对本机代码对象的结构进行了反思,以找出什么右列名等。

许多Orms也不完全是决定性的,这也意味着,基础数据库在缓存查询计划的困难时期比其他可能的时间更难。另外,我在您提供的链接中找不到您的实际基准测试;您可能实际上并不是要对苹果进行测量。

因此,我无法专门为您使用的特定模块而没有花费时间比我所愿意的,但总的来说,我会因为上述原因而劝阻这一问题。我经常使用的工作流程是使用ORM进行所有开发,并担心一旦我可以进行一些生产时间分析,而担心优化查询等,那时,我将用直接的SQL替换最坏的罪犯或可能存储的过程或视图(取决于数据库引擎),以提高实际重要的性能。

最新更新