swirl
Home Software Blog Wallpapers Webtools
Compare data processing performance of SQL Server and Python Pandas dataframes.
Sunday 07, September 2025   |   Post link

Overview

Being a long timer RDBMS user, comparing alternative ways of working with records always fascinates me. This post compares performance of Microsoft SQLServer and Python Pandas dataframes for a certain use case.

The use case

The system consists of two datasets, one dataset contain list of child items that should exist and the other dataset contains list of child items that actually exist. Both datasets record the parent item name and the child items names belonging to each parent.


The raw dataset

ParentName ChildName EntryDate ExpectedChildrenCount ActionType
Parent0 2025-09-06 22:48:00.256 1000 FirstEntry
Parent0 Parent0-child0 2025-09-06 22:48:00.256 Child
Parent0 Parent0-child1 2025-09-06 22:48:00.256 , Child

There are 5 million rows for child entries and 5000 rows for parent entries in this file (generate_raw/rawdata.csv).


The processed dataset

ParentName ChildName EntryDate
Parent0 Parent0-child0 2025-09-06 22:48:00.256
Parent0 Parent0-child1 2025-09-06 22:48:00.256

There are 5 million rows in this file (generate_processed/processed.csv).

Using Pandas

The tools/pandas_processor.py executes the following:

  1. Loading the csv datasets. This step loads the rawdata.csv (312 MBs) & rawdata.csv (277 MBs).
  2. Filtering the raw records for ActionType = "First" & extract the "ParentName" and "ExpectedChildrenCount" fields.
  3. Grouping records in the processes csv by ParentName and counting the number children.
  4. Joining '2' and '3'.
  5. Listing raw records where ActionType = "Child" which do not exist in the processed csv records.

Executing all the steps took 5.4 seconds & consumed 1.600 GB of memory.

Using SQL Server

The following steps are involved in getting the results from SQL Server:

  1. Loading the rawdata.csv file into RawData table using BCP. 5005000 records were copied in 13.172 seconds.
  2. Loading the processed_data.csv file into the ProcessedData.csv table using BCP. 5000000 rows copied in 10.031 seconds.
  3. Query for extracting the "ParentName" & "ExpectedChildrenCount" fields from RawData table where ActionType = 'FirstEntry' along with joining with the query which groups the records in ProcessedData table by ParentName took 1 sec.
  4. Query for selecting those records in RawData where ActionType='Child' but not exist in the ProcessedRecord table took 2 seconds to execute.

Total time taken including data loading from the two csv was: 26.20 seconds and Task Manager reported SQLSVR consuming 16 GB of memory.

Summary

The result are summarized as follows:

Test Time taken (sec) Memory consumed (GBs)
Pandas 5.4 1.6
SQL Server 26.20 16

Conclusion

For simple daily aggregations and reconciliations, using an RDBMs seems to be an overkill. It's slower and takes up a lot more resources. On the positive side, RDBMs' provide seamless transaction support and programming interface from multiple languages which may be necessary for creating reports in web interfaces. An efficient approach could be to store the aggregations into an RDBMs for reporting use cases.

References




Comments

Posts By Year

2026 (3)
2025 (2)
2024 (4)
2023 (5)
2022 (10)
2021 (5)
2020 (12)
2019 (6)
2018 (8)
2017 (11)
2016 (6)
2015 (17)
2014 (2)
2013 (4)
2012 (2)

Posts By Category

.NET (4)
.NET Core (2)
AI (2)
ASP.NET MVC (4)
AWS (5)
AWS API Gateway (1)
Android (1)
Apache Camel (1)
Architecture (1)
Audio (1)
Azure (2)
Book review (3)
Business (1)
C# (3)
C++ (2)
CloudHSM (1)
Containers (4)
Corporate culture (1)
Database (3)
Database migration (1)
Desktop (1)
Docker (1)
DotNet (3)
DotNet Core (2)
ElasticSearch (1)
Entity Framework (3)
Git (3)
IIS (1)
JDBC (1)
Java (10)
Kibana (1)
Kubernetes (1)
Lambda (1)
Learning (1)
Life (7)
Linux (3)
Lucene (1)
Multi-threading (1)
Music (1)
OData (1)
Office (1)
PHP (1)
Pandas (1)
Photography (1)
PowerShell (2)
Programming (29)
Python (3)
Rants (5)
SQL (2)
SQL Server (1)
SQLServer (1)
Security (3)
Software (1)
Software Engineering (1)
Software development (2)
Solr (1)
Sql Server (2)
Storage (1)
T-SQL (1)
TDD (1)
TSQL (5)
Tablet (1)
Technology (1)
Test Driven (1)
Testing (1)
Tomcat (1)
Unit Testing (1)
Unit Tests (1)
Utilities (3)
VC++ (1)
VMWare (1)
VSCode (1)
Visual Studio (2)
WSL (1)
Wallpapers (1)
Web API (2)
Win32 (1)
Windows (10)
XML (2)

Posts By Tags

.NET(6) AI(2) API Gateway(1) ASP.NET(4) AWS(3) Adults(1) Advertising(1) Android(1) Anti-forgery(1) Asynch(1) Authentication(2) Azure(2) Backup(1) Beliefs(1) BlockingQueue(1) Book review(2) Books(1) Busy(1) C#(4) C++(3) CLR(1) CORS(1) CSRF(1) CTE(1) Callbacks(1) Camel(1) Certificates(1) Checkbox(1) Claude(1) Client authentication(1) CloudHSM(1) Cmdlet(1) Company culture(1) Complexity(1) Consumer(1) Consumerism(1) Containers(3) Core(2) Custom(2) DPI(1) Data-time(1) Database(4) Debugging(1) Delegates(1) Developer(2) Dockers(2) DotNetCore(3) EF 1.0(1) Earphones(1) Elastic Search(2) ElasticSearch(1) Encrypted(1) Entity framework(1) Events(1) File copy(1) File history(1) Font(1) Git(2) HierarchyID(1) Hyper-V(1) IIS(1) Installing(1) Intelli J(1) JDBC(1) JSON(1) JUnit(1) JWT(1) Java(3) JavaScript(1) Kubernetes(1) LLAMA(1) LLM(1) Life(1) LinkedIn(1) Linux(3) Localization(1) Log4J(1) Log4J2(1) Logging(1) Lucene(1) MCP(1) MVC(4) Management(2) Migration history(1) Mirror(1) Mobile Apps(1) Modern Life(1) Money(1) Music(1) NGINX(1) NTFS(1) NUnit(2) OData(1) OPENXML(1) Objects(1) Office(1) OpenCover(1) Organization(1) PHP(1) Pandas(1) Paths(1) Poetry(1) PowerShell(2) Processes(1) Producer(1) Programming(2) Python(3) QAAC(1) Quality(1) REDIS(2) REST(1) Runtimes(1) S3-Select(1) SD card(1) SLF4J(1) SQL(3) SQL Code-first Migration(1) SSH(2) SSL(1) Sattelite assemblies(1) School(1) Secrets Manager(1) Self reliance(1) Service(1) Shell(1) Solr(1) Sony VAIO(1) Spirituality(1) Spring(1) Sql Express(1) System Image(1) TDD(1) TSQL(3) Table variables(1) Tables(1) Tablet(1) Ubuntu(1) Url rewrite(1) VMWare(1) VSCode(1) Validation(2) VeraCode(1) WSL(1) Wallpaper(1) Wallpapers(1) Web Development(4) Windows(4) Windows 10(2) Windows 2016(2) Windows 8.1(1) Work culture(1) XML(1) Yii(1) drive(1) iTunes(1) open file handles(1) renew(1) security(1) static ip address(1) ulimit(1)