获取特定日期的所有 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
的情况下,查询可能 运行 有两种不同的方式,具体取决于您传递的参数:
- 如果指定了路径,则扫描与路径匹配的
db.rev
条目,并从该集合中选择与修订范围匹配的更改列表。 db.rev
由路径索引。
- 如果没有指定路径,并且修订范围不依赖于修订数据(例如日期,包含在更改列表本身中),
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
...
在您有多种方法获取特定数据的情况下,这可能是一个非常有用的工具,可以帮助您调整查询以提高效率,尤其是在了解您为何会遇到特定性能限制时。
我希望获取特定日期的所有已提交更改列表,我使用的命令如下:
$ 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
的情况下,查询可能 运行 有两种不同的方式,具体取决于您传递的参数:
- 如果指定了路径,则扫描与路径匹配的
db.rev
条目,并从该集合中选择与修订范围匹配的更改列表。db.rev
由路径索引。 - 如果没有指定路径,并且修订范围不依赖于修订数据(例如日期,包含在更改列表本身中),
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
...
在您有多种方法获取特定数据的情况下,这可能是一个非常有用的工具,可以帮助您调整查询以提高效率,尤其是在了解您为何会遇到特定性能限制时。