为什么nodejs orm比仅运行简单查询更糟糕?

时间:2016-12-09 03:07:29

标签: node.js orm

使用orm2进行一些性能测试,似乎比直接用sql查询慢4倍。有什么想法吗?

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

1 个答案:

答案 0 :(得分:0)

不确定这是否值得回答,但评论时间太长。

对于每个ORM,这(根据我的经验)适用于每种语言/平台。通常,您不会将ORM用于查询性能,而是将它们用于代码维护优化和开发人员速度。

为什么会这样?好吧,作为一项规则,ORM必须将你在语言X中所说的内容翻译成SQL,这样他们就不会经常提出最优化的查询。他们通常会动态地进行查询生成,因此实际的"建设" (理想情况下参数化)SQL的字符串需要一些时间,因为可以反映本机代码对象的结构,以找出正确的列名称等。

许多ORM在执行此操作方面也不是完全确定的,这意味着底层数据库缓存查询计划的时间比其他情况下更难。此外,我无法在您提供的链接中找到您的实际基准测试;你可能没有实际测量苹果到苹果。

所以我不能专门回答您使用的特定模块而不花费更多时间,但总的来说,由于上述原因,我会不鼓励这一问题。我经常使用的工作流程是使用ORM进行我的所有开发,并担心优化查询等,一旦我可以进行一些生产时间分析,那时我会用直接SQL替换最坏的违规者或者可能存储过程或视图(取决于数据库引擎),以提高实际重要性能。