Question

I would like to know if there are any performance related ups and downs for tables that has a primary key and those without primary key.

I have a schema with two tables.

Table Without ID

create_table "site_page_views", :id => false, :force => true do |t|
  t.integer "site_id"
  t.integer "page_id"
  t.integer "visit_count", :default => 0, :null => false
  t.date    "start_date"
  t.date    "end_date"
end

add_index "site_page_views", ["end_date"], :name => "index_site_page_views_on_end_date"
add_index "site_page_views", ["site_id"], :name => "index_site_page_views_on_site_id"
add_index "site_page_views", ["start_date", "end_date"], :name => "index_site_page_views_on_start_date_and_end_date"
add_index "site_page_views", ["start_date"], :name => "index_site_page_views_on_start_date"

Table With ID

create_table "content_views", :force => true do |t|
  t.integer "site_id"
  t.integer "page_id"
  t.integer "visit_count", :default => 0, :null => false
  t.string  "type"
  t.date    "start_date"
  t.date    "end_date"
end

add_index "content_views", ["page_id"], :name => "index_content_views_on_page_id"
add_index "content_views", ["site_id"], :name => "index_content_views_on_site_id"
add_index "content_views", ["start_date", "end_date"], :name => "index_content_views_on_start_date_and_end_date"
add_index "content_views", ["type"], :name => "index_content_views_on_type"

If you have a look at the second table it represents a STI(Single Table Inheritance)

I have similar data in both tables(this is just a curious testing), when I query for records to get records between date ranges. I get following benchmark results

puts 'No primary Key :' Benchmark.bm do |b|
  b.report {
    SitePageView.where(site_id: 123,
      start_date: start_date,
      end_date: end_date).includes(:page)
    .order('visit_count DESC').limit(100).all }.real * 1000
end

=> No primay key : 176 ms


puts 'With primary Key :' Benchmark.bm do |b|
  b.report {
    StiPageViews.where(site_id: 123,
      start_date: start_date,
      end_date: end_date).includes(:page)
    .order('visit_count DESC').limit(100).all }.real * 1000
end

=> With primay key : 101 ms

What would be the reason for the slowness of table without primary key ?

Was it helpful?

Solution

Primary key has auto index. You no need to manually index the primary key.

But, your Query doesn't use primary key column.

So, there should not be any differences in performance.

Better check the query execution time in postgres aswell.

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top