Le performance dei database NoSQL

Comparazione delle performance dei database NoSQL con i classici RDBMS su operazioni di inserimento e lettura dati.

Confrontiamo le performance

Quando si parla di comparazioni è importante dire quali benchmark verranno utilizzati e in che condizioni. Questo per garantire la replicabilità dei test e l’obiettività dei risultati. In questo caso ho utilizzato lo stesso PC per entrambi gli ambienti, garantendo così la stessa potenza di calcolo. Per evitare di influire con il tuning, le comparazioni si riferiscono ai sistemi installati senza apportare modifiche alla configurazione. I due prodotti utilizzati sono MongoDB  and SQLServer Express . I test effettuati sono relativi all’intero stack, non al solo database, perché mi interessa comparare le differenze di prestazioni a livello applicativo. Sempre per evitare di influenzare i risultati, ho usato la stessa tecnologia (.Net framework 4.5, C#) e NHibernate come ORM.

 

Benchmark details
Feature NoSQL SQL
CPU i7 i7
RAM 16GB 16GB
Disk SSD SSD

Le operazioni che voglio comparare sono:

  • mass insert
  • query
  • analytics
  • transaction

Mass operation on a single entity

Questa operazione consiste nell’inserire un grande numero di elementi contemporaneamente. Il test viene replicato aumentando il numero di elementi inseriti. Da tenere  in considerazione che nel caso SQL abbiamo anche il vantaggio della transazione (e quindi il costo in termini di performance).

Performance comparison
#rows NoSQL(ms) SQL(ms)
100 1 3
1000 12 163
10000 85 202
100000 842 2182
1000000 9179 19875

 

SQL NoSQL Comparison

Search

Questo test è focalizzato sulle ricerche. Le performance della query dipende molto da cosa sto cercando e in che modo. Per capire come si comportano i due sistemi su tipologie di ricerca diverse ho differenziato tre casi:

  • CASE 1 get per chiave primaria: questo pattern di ricerca è utilizzato per leggere il singolo record utilizzando l’indice associato alla chiave primaria
  • CASE 2 ricerca fallita: Questa ricerca viene fatta per un set di campi e comporta un full scan degli indici, senza ottenere risultati. E’ il caso peggiore che possiamo incontrare in termini di performance.
  • CASE 3 Paged query: una query complessa che ritorna un set ristretto di dati (pagina), ordinati.

Mischiano di casi  d’uso sopra descritto ho creato tre benchmark. Il codice sorgente dei test è disponibile su  git-hub.

Benchmark description
CASE 1 CASE 2 CASE 3
Benchmark 1 5% 70% 25%
Benchmark 2 10% 45% 45%
Benchmark 3 15% 8% 77%

Il primo test è eseguito su un set ristretto di dati, circa 2.500.000 righe.

Performance comparison
benchmark NoSQL(ms) SQL(ms)
Benchmark 1 47 244
Benchmark 2 1 13
Benchmark 3 1 12

Secondo test in un insieme di dati più corposo, circa 5M.

Performance comparison
benchmark NoSQL(ms) SQL(ms)
Benchmark 1 56 287
Benchmark 2 2 17
Benchmark 3 2 18

Questo benchmark mostra come i sistemi NoSQL mantengono invariate le performance con l’aumento dei dati.

Transaction

In questo test effettuiamo una simulazione di inserimento dati in transazione (dico simulazione perché nella maggior parte dei sistemi NoSQL le transazioni non sono supportate). La differenza di tempo è quando guadagnano al costo del rischio di inconsistenza.

Performance comparison
#transactions SQL (ms) NoSQL (ms)
10 99 89
100 1004 764
1000 11025 7309

 

 

Analytics

Questo benchmark vuole capire come si comporta NoSQL quando si fanno interrogazioni di tipo analitico sui dati. Il test si basa su una struttura master-detail replicata identica su entrambi i sistemi.

  • export: join tra master e detail table per ottenere l’elenco completo dei campi
  • report: costruire l’elenco master associando con una funzione di aggregazione il conteggio degli elementi figli.
  • KPI: Ottenere un totale complessivo sommando tutti i parziali scritti sui figli.

I test sono realizzati su un db di 4M righe.

Performance comparison
test SQL (ms) NoSQL (ms)
KPI 1176 1403
REPORT 805 1363

 

Analytics compariso SQL NoSQL

 

danielefontani

Actually CTO in Sintra Consulting s.r.l, I'm senior developer and architect specialized on portals, intranets, and others business applications. Particularly interested in Agile developing and open source projects, I worked on some of this as project manager and developer. My experience include: Frameworks \Technlogies: .NET Framework (C# & VB), ASP.NET, Java, php, Spring Client languages: XML, HTML, CSS, JavaScript, Angular.js,Angular. jQuery Platforms: Sharepoint,Liferay, Drupal Databases: MSSQL, ORACLE, MYSQL, Postgres

Lascia un commento