- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我写过一些简单的 Rails 应用程序,通过 ActiveRecord 抽象访问数据库,所以恐怕我对 PostgreSQL 引擎的内部工作了解不多。但是,我正在编写一个需要支持 100000 多行动态更新内容的 Rails 应用程序,我想知道我是否有效地使用了随机函数:
Database migration schema setting:
t.float: attribute1
t.integer: ticks
add_index :mytable, :attribute1
add_index :mytable, :ticks
基本上,我想要以下随机函数分布:
a) 在属性 1 中具有前 10% 值的行 = 30% 的机会被选中
b) 中间 60%(在属性 1 中)行 = 50% 的机会被选中
c) 低于 100 个刻度的最低 30%(在属性 1 中)= 15% 的机会被选中,
d) 并且对于那些具有最低 30% 属性 1 且具有超过 X(在此问题中使用 X = 100)的人,ticks = 5% 的机会被选中。
目前我有以下代码:
@rand = rand()
if @rand>0.7
@randRowNum = Integer(rand(0.1) * Mytable.count )
@row = Mytable.find(:first, :offset =>@randRowNum , :order => '"attribute1" DESC')
else
if @rand>0.2
@randRowNum = Integer((rand(0.6)+0.1) * Mytable.count)
@row= Mytable.find(:first, :offset =>@randRowNum , :order => '"attribute1" DESC')
else
@row= Mytable.find(:first, :offset =>Integer(0.7 * Mytable.count), :order => '"attribute1" DESC')
if !(@row.nil?)
if (@rand >0.05)
@row= Mytable.find(:first, :order => 'RANDOM()', :conditions => ['"attribute1" <= '"#{@row.attribute1}", '"ticks" < 100' ] )
else
@row= Mytable.find(:first, :order => 'RANDOM()', :conditions => ['"attribute1" <= '"#{@row.attribute1}", '"ticks" >= 100' ] )
end
end
end
end
1) 我想做的一件事是避免使用 :order => 'RANDOM()',因为根据我的研究,似乎每次调用它时,都涉及 SQL 引擎首先扫描所有行,为它们分配一个随机值。因此使用 @randRowNum = Integer(rand(0.1) * Mytable.count ) 并由 @randRowNum 偏移。对于 a) 和 b)。我真的提高了效率吗?有没有更好的办法?
2) 我是否应该对 c) 和 d) 执行与 1) 相同的操作,并且是通过使用 :conditions => ['"attribute1"<= '"#{@row.attribute1}", '"ticks">= 100' ],我是否强制 SQL 引擎扫描所有行?除了索引之外,还有什么可以提高此调用的效率(同时尽可能少的空间/存储开销)吗?
3) Mytable 中的条目总数可能在 Mytable.count 和 Mytable.find 调用之间发生了变化。我可以将这两个调用放在一个事务中,但是仅仅为了读取操作而锁定整个表似乎太过分了(目前,如果我得到一个@row.nil,我有额外的代码可以回退到简单的随机行选择从上面的代码)。是否可以在 Rails 中的单个原子 SQL 查询中移动 .count 调用?或者它会像在 Rails 中通过事务锁定一样有效吗?
4) 我也一直在阅读 PostgreSQL 中的存储过程...但是对于这种特殊情况,是否可以提高效率,值得将代码从 Activerecording 抽象转移到存储过程?
非常感谢!
附言开发/部署环境:鲁布 1.8.7 rails 2.3.14PostgreSQL 8(在 Heroku 上)
最佳答案
你的问题似乎有点含糊,如果我的解释有误,请纠正我。
如果您没有拆分 (c) 和 (d),我只会将 [0,1) 上的均匀随机变量转换为 [0,1) 上的有偏随机变量,然后使用它来选择您的行偏移量.
不幸的是,(c) 和 (d) 是根据“ticks”的值拆分的——不同的列。这是最难的部分,也会使查询效率大大降低。
在你从底部取出70%处的attribute1的值后,还要取出第(c)行的数量;类似 SELECT COUNT(*) FROM foo WHERE attribute1 <= partiton_30 AND ticks < 100
的东西.然后用它来找到 ticks < 100
中的偏移量或 ticks >= 100
个案。 (您可能需要一个关于 (attribute1, ticks)
或其他内容的索引;最佳顺序取决于您的数据)。
如果预先知道“滴答”阈值并且不需要经常更改,您可以将其缓存在列(BOOL ticks_above_threshold
或其他)中,这使得查询很多更有效率如果你有关于 (ticks_above_threshold, attribute1)
的索引(注意反转)。当然,每次更改阈值时都需要写入每一行。
(我认为您也可以使用“物化 View ”来避免主表因额外的列而变得困惑,但我不确定效率上的差异是什么。)
使用存储过程显然可以提高一些效率。我不会太担心它,除非服务器的延迟特别高。
编辑:
回答您的其他问题:
索引 (BOOL ticks_above_threshold, attribute1)
应该比 (ticks, attribute1)
工作得更好(虽然我可能顺序错了)因为它可以让你比较第一个索引列是否相等。这很重要。
索引通常使用某种平衡树来查找有效的列表。例如,取 A4 B2 C3 D1(有序字母,数字)并查找“字母大于 B 且数字大于 2 的行数”。您能做的最好的事情就是在 B 之后开始并遍历整个表。如果您按数字、字母订购,您将获得 1D 2B 3C 4A。同样,在 2s 之后开始。
如果你的索引是 is_greater_than_2,letter,它看起来像 false,B false,D true,A true,C。您可以向索引询问 (true,B) 的位置——在 true,A 和 true,C 之间——并计算条目数直到结束。计算两个索引位置之间的项目数很快。
Google App Engine 的 Restrictions on Queries更进一步:
Inequality Filters Are Allowed on One Property Only
A query may only use inequality filters (<, <=, >=, >, !=) on one property across all of its filters.
...
The query mechanism relies on all results for a query to be adjacent to one another in the index table, to avoid having to scan the entire table for results. A single index table cannot represent multiple inequality filters on multiple properties while maintaining that all results are consecutive in the table.
如果你们没有其他查询受益于 ticks
上的索引, 那么是的。
在某些情况下,索引 a
可能会更快而不是 a,b
(或 b,a
)如果子句包括 b
几乎总是正确的,并且您正在获取行数据(不仅仅是获取 COUNT()
)(即,如果 1000 <= a AND a <= 1010
匹配一百万行并且 b > 100
仅在两行中失败,那么它最终可能会更快地执行两个额外的行查找而不是使用更大的索引)。
关于ruby-on-rails - 如何使用有偏概率有效地选择随机行。使用 Rails 2.3 和 PostgreSQL 8 分发?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7323875/
我收到未知数据,我想以编程方式查看相关性,并将所有完全相关的变量组合在一起(忽略方向)。在下面的数据集中,我可以手动查看相关性并说 a, f, g, h一起去吧b, d, e .我怎样才能以编程方
这个问题在这里已经有了答案: use dplyr's summarise_each to return one row per function? (3 个答案) 关闭 4 年前。 作为探索性工作的
我想要完成的是使用数组存储未知大小的多项式。我在互联网上看到的是使用一个数组,每个单元格都包含系数,度数是单元格编号,但这不是有效的,因为如果我们有一个多项式,如:6x^14+x+5。这意味着我们将从
嘿伙计们,我一直在尝试解析 HTML 文件以从中抓取文本,但时不时地,我会得到一些非常奇怪的字符,例如 à€œ。我确定是“智能引号”或弯头标点符号导致了我的所有问题,因此我的临时修复是搜索所有这些字符
我原来的 data.table 由三列组成。 site、observation_number 和 id。 例如以下是 id = z 的所有观察结果 |site|observation_number|i
"Premature optimisation is the root of all evil (but it's nice to have once you have an ugly solutio
给定这个数组 X: [1 2 3 2 3 1 4 5 7 1] 和行长度数组R: [3 2 5] 表示转换后每行的长度。 我正在寻找一个计算效率高的函数来将 X reshape 为数组 Y: [[ 1
我有一些 data.frame s: # Sample data a <- data.frame(c(1:10), c(11:20)) names(a) <- c("A", "B") b <- dat
我有点困惑。列表擅长任意位置插入,但不善于随机访问? (怎么可能)如果你不能随机访问,你怎么知道在哪里插入? 同样,如果你可以在任何位置插入,为什么你不能从那个位置高效地读取? 最佳答案 如果您已经有
我有一个向量,我想计算它的移动平均值(使用宽度为 5 的窗口)。 例如,如果有问题的向量是[1,2,3,4,5,6,7,8],那么 结果向量的第一个条目应该是 [1,2,3,4,5] 中所有条目的总和
有一个随机整数生成器,它生成随机整数并在后台运行。需求设计一个API,调用时返回当时的簇数。 簇:簇是连续整数的字典顺序。例如,在这种情况下,10,7,1,2,8,5,9 簇是 3 (1,2--5--
我想做的是将一组 (n) 项分成大小相等的组(大小为 m 的组,并且为简单起见,假设没有剩余,即 n 可以被 m 整除)。这样做多次,我想确保同一组中的任何项目都不会出现两次。 为了使这稍微更具体一些
假设我有一些包含类型排列的模板表达式,在本例中它们来自 Abstract Syntax Tree : template
我已经在这方面工作了几天,似乎没有我需要的答案。 由于担心这个被标记为重复,我将解释为什么其他问题对我不起作用。 使用 DIFFLIB for Python 的任何答案都无助于我的需求。 (我在下面描
我正在使用 NumPy 数组。 我有一个 2N 长度向量 D,并希望将其一部分 reshape 为 N x N 数组 C. 现在这段代码可以满足我的要求,但对于较大的 N 来说是一个瓶颈: ``` i
我有一个问题: 让我们考虑这样的 pandas 数据框: Width Height Bitmap 67 56 59 71 61 73 ...
我目前正在用 C 语言编写一个解析器,设计它时我需要的东西之一是一个可变字符串“类”(一组对表示实例的不透明结构进行操作的函数),我将其称为 my_string。 string 类的实例只不过是包装
假设我在 --pandas-- 数据框中有以下列: x 1 589 2 354 3 692 4 474 5 739 6 731 7 259 8 723
我有一个成员函数,它接受另一个对象的常量引用参数。我想 const_cast 这个参数以便在成员函数中轻松使用它。为此,以下哪个代码更好?: void AClass::AMember(const BC
我们目前正在将 Guava 用于其不可变集合,但我惊讶地发现他们的 map 没有方法可以轻松创建只需稍作修改的新 map 。最重要的是,他们的构建器不允许为键分配新值或删除键。 因此,如果我只想修改一
我是一名优秀的程序员,十分优秀!