相关疑难解决方法(0)

使用group by vs distinct时的巨大性能差异

我正在HSQLDB服务器上执行一些测试,其中包含一个包含500 000个条目的表.该表没有索引.有5000个不同的业务键.我需要一份清单.当然,我开始DISTINCT查询:

SELECT DISTINCT business_key FROM memory WHERE
   concept <> 'case' or 
   attrib <> 'status' or 
   value <> 'closed'
Run Code Online (Sandbox Code Playgroud)

大约需要90秒!

然后我尝试使用GROUP BY:

SELECT business_key FROM memory WHERE
       concept <> 'case' or 
       attrib <> 'status' or 
       value <> 'closed'
GROUP BY business_key
Run Code Online (Sandbox Code Playgroud)

它需要1秒!!!

试图找出我运行的差异,EXLAIN PLAN FOR但它似乎为两个查询提供相同的信息.

EXLAIN PLAN FOR DISTINCT ...

isAggregated=[false]
columns=[
  COLUMN: PUBLIC.MEMORY.BUSINESS_KEY
]
[range variable 1
  join type=INNER
  table=MEMORY
  alias=M
  access=FULL SCAN
  condition = [    index=SYS_IDX_SYS_PK_10057_10058
    other condition=[
    OR arg_left=[ …
Run Code Online (Sandbox Code Playgroud)

sql performance group-by distinct hsqldb

71
推荐指数
1
解决办法
10万
查看次数

通过关系在has_many中找到唯一记录的更好方法

在我的rails应用程序中,用户可以参加活动 -

user.rb

has_many :attendances
has_many :events, through: :attendances
Run Code Online (Sandbox Code Playgroud)

event.rb

has_many :attendances
has_many :users, through: :attendances
Run Code Online (Sandbox Code Playgroud)

...有一个由event_id,user_id和其他一些零碎组成的考勤表 -

attendance.rb

belongs_to :user
belongs_to :writers_event
Run Code Online (Sandbox Code Playgroud)

在寻找特定的出勤时,我发现自己正在使用.where ... .first - 例如

attendance = Attendance.where(user_id: @user.id, event_id: this_event_id).first
Run Code Online (Sandbox Code Playgroud)

让我感到震惊的是,我错过了课堂,我们谈到了find_by在这种情况下使用的东西- 换句话说,你确信你正在寻找独特的东西.这可能没关系,但是搜索一个集合然后从中获取第一个对象会感到浪费和错误.

有没有更好的办法?

我环顾四周,这是最接近的,但不(我认为)真的覆盖它.如何通过has_many关系显示唯一记录?

ruby activerecord ruby-on-rails

4
推荐指数
1
解决办法
67
查看次数