8
.
05
.
2024
9
.
09
.
2022
Ruby on Rails
Backend

What you lost when you used structure.sql instead of schema.rb in your Rails project

Mariusz Kozieł
Chief Executive Officer

Both schema formats have their own pros and cons. I didn’t want to write when and why we should use structure.sql or schema.rb but I might do it in the next article. You can read more in the official documentation. In this article I would like to show you a short production story.

We have jumped into a new project which had database performance problems. It was easy to notice that client's team had struggled with it also. For example, they made database replication to redirect the most time-consuming queries to second instance. Numerous requests and millions of records in tables were causing a real problem.

The client’s team had various ideas on how to solve the problem. We discussed about:

  • scaling DB horizontally
  • materialized SQL views
  • extract the most crucial part as a microservice

But we decided to start from the beginning and we started digging. New Relic (APM - Application Performance Monitoring tool) was our best friend. We have detected the 5 most time-consuming queries and investigated them one by one.

I would like to show one of them:

performance_before_changes

Query which is run so often (46 times per minute) can't be that slow. Let’s investigate why? SQL explain and other checks proved that everything happened because of one line


validates :column_id, uniqueness: { scope: :other_column_id }

and lack of unique index on those columns in the database.

By adding index:


def change
    add_index :table, [:column_id, :other_column_id], unique: true
end

We have achieved a nice result. Average query time fell down from 731 to 1.5 ms which solves one of the biggest DB problem.

performance_after_changes

Success story but what the hell is the advantage of using schema.rb instead of structure.sql as our schema format?

If schema.rb had been used, mentioned issue would not have existed. Thanks to Rubocop-rails which is used in the project. We are enthusiasts of this tool :)

We might have learned about this issue earlier or even previous team could catch it immediately after problematic validation was added. Rubocop Rails/UniqueValidationWithoutIndex check highlight it:


app/models/example.rb:10:3: C: Rails/UniqueValidationWithoutIndex: Uniqueness validation should have a unique index on the database column.
  validates :column_id, uniqueness: { scope: :other_column_id }
  ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^

Rubocop checks indexes in the schema.rb file so there is no verification if there is no schema.rb file. Probably there are other tools that can detect it as fast as Rubocop. Let me know if you know any helpful tools or tips that allow detecting database optimization problems

Mariusz Kozieł
Chief Executive Officer

Check my Twitter

Check my Linkedin

Did you like it? 

Sign up To VIsuality newsletter

READ ALSO

Let’s prepare for GITEX Dubai together!

11
.
06
.
2025
Michał Piórkowski
Conferences
Business

Ruby Quirks

11
.
06
.
2025
Jan Matusz
Ruby on Rails
Ruby

Visuality recognized as one of the Best Ruby on Rails Devs

11
.
06
.
2025
Maciej Zdunek
Ruby on Rails
Visuality
Business

Let’s prototype!

11
.
06
.
2025
Michał Łęcicki
Ruby on Rails
Backend

Between the devil and the deep blue sea

11
.
06
.
2025
Mateusz Wodyk
Project Management
Backend
HR

Is the culture of the organization important?

11
.
06
.
2025
Alicja Gruszczyk
Conferences
Visuality

5 marketing hacks which will make your life easier

11
.
06
.
2025
Maciej Zdunek
Marketing
Design

Marketing hacks #01: How to Track off-line conversions

11
.
06
.
2025
Marek Łukaszuk
Ruby on Rails
Business
Marketing

JSON:API consumption in Rails

11
.
06
.
2025
Jan Matusz
Ruby on Rails
Backend
Tutorial

Selected SXSW lectures takeaways

11
.
06
.
2025
Michał Piórkowski
Conferences
Frontend
Backend
Business

Common communication issues in project management

11
.
06
.
2025
Michał Krochecki
Project Management

SXSW Summary

11
.
06
.
2025
Michał Piórkowski
Ruby on Rails
Conferences
Frontend
Backend
Business

How to get the most out of SXSW Interactive

11
.
06
.
2025
Michał Krochecki
Ruby on Rails
Conferences
Frontend
Backend
Business

Guide to recruitment at Visuality

11
.
06
.
2025
Michał Piórkowski
HR
Visuality

TOP Ruby on Rails Developers

11
.
06
.
2025
Maciej Zdunek
Ruby on Rails
Visuality
Business

How to conquer Westworld?

11
.
06
.
2025
Maciej Zdunek
Business
Marketing

2018 Rewind by Visuality

11
.
06
.
2025
Michał Krochecki
HR
Visuality

Quality Assurance Testing

11
.
06
.
2025
Jarosław Kowalewski
Ruby on Rails
Backend

Why do we like to be together?

11
.
06
.
2025
Michał Krochecki
Visuality
HR

Wallboards - a great value for our teams and clients

11
.
06
.
2025
Michał Krochecki
Ruby on Rails
Design
Project Management
Backend

2018 Clutch Global Leader

11
.
06
.
2025
Maciej Zdunek
Ruby on Rails
Visuality
Business
Marketing