获取特定日期的所有 perforce 更改列表

Get all the perforce change-lists for specific day

我希望获取特定日期的所有已提交更改列表,我使用的命令如下:

$ p4 changes -s submitted //...@2020/11/03,2020/11/04

所以,我相信上面的命令应该让我得到从 2020 年 11 月 3 日到 2020 年 11 月 4 日所有提交的变更列表的列表。

相反,我看到了这个:

Too many rows scanned (over 55000000); see 'p4 help maxscanrows'.

我应该怎么做才能摆脱它?

或许,我们应该使用这个:

p4 更改//path/to/depot/...@2020/11/03,2020/11/05

“maxscanrows”设置(由管理员为每个用户组配置)限制任何给定查询扫描的数据库行数。在 p4 changes 的情况下,查询可能 运行 有两种不同的方式,具体取决于您传递的参数:

  1. 如果指定了路径,则扫描与路径匹配的 db.rev 条目,并从该集合中选择与修订范围匹配的更改列表。 db.rev 由路径索引。
  2. 如果没有指定路径,并且修订范围不依赖于修订数据(例如日期,包含在更改列表本身中),db.change 条目将被扫描以找到匹配的条目范围。

(1) 的一个例外是,如果请求最大数量的更改列表,如果路径非常广泛,则可以使用 db.revcx。此逻辑可以调整并在 p4 help undoc:

中进行了描述
    dm.changes.thresh1     50K 'changes -mx path' uses db.revcx if...
    dm.changes.thresh2     10K ...if < thresh2 of thresh1 db.rev match

对于您的具体情况,我想您会发现:

p4 changes -s submitted @2020/11/03,2020/11/04

执行得更快(并且不会达到 maxscanrows 限制),因为它将根据 db.change.

进行搜索

正如您在自己的回答中指出的那样,缩小仓库路径是另一种可能的解决方案,因为这会减少扫描的 db.rev 行数——但是,这会给您不同的结果(并且取决于你把仓库路径缩小了多少,它仍然可能不如简单地扫描变化那么快table)。

为了查看给定查询访问了哪些特定的 table,以及每个查询访问了多少行,您可以使用 -Zdbstat 全局标志:

C:\Perforce\test>p4 -Zdbstat changes -s submitted @2019/11/03,2020/11/04
...
--- db.revcx
---   pages in+out+cached 1+0+1
---   locks read/write 0/0 rows get+pos+scan put+del 0+0+0 0+0
---   peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
...
--- db.change
---   pages in+out+cached 5+0+4
---   locks read/write 0/0 rows get+pos+scan put+del 0+1+127 0+0
---   peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
...

对比:

C:\Perforce\test>p4 -Zdbstat changes -s submitted //...@2019/11/03,2020/11/04
...
--- db.rev
---   pages in+out+cached 27+0+26
---   locks read/write 0/0 rows get+pos+scan put+del 0+1+868 0+0
---   peek count 1 wait+held total/max 0ms+16ms/0ms+16ms
...
--- db.change
---   pages in+out+cached 4+0+3
---   locks read/write 0/0 rows get+pos+scan put+del 0+64+128 0+0
---   peek count 1 wait+held total/max 0ms+0ms/0ms+0ms
...

在您有多种方法获取特定数据的情况下,这可能是一个非常有用的工具,可以帮助您调整查询以提高效率,尤其是在了解您为何会遇到特定性能限制时。