Rails Postgresql具有主键vs没有主键的表的性能差异

时间:2014-01-02 07:48:32

标签: ruby-on-rails ruby postgresql-9.2 sti

我想知道具有主键和没有主键的表是否存在任何与性能相关的起伏。

我有一个包含两个表的模式。

没有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"

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"

如果你看一下第二个表,它代表一个STI(单表继承)

我在两个表中都有类似的数据(这只是一个奇怪的测试),当我查询记录以获取日期范围之间的记录时。我得到以下基准测试结果

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

没有主键的表格缓慢的原因是什么?

1 个答案:

答案 0 :(得分:0)

主键具有自动索引。您无需手动索引主键。

但是,您的查询不使用主键列。

因此,性能不应有任何差异。

更好地检查postgres中的查询执行时间。