Thread: Performance degradation on concurrent COPY into a single relation in PG16.

Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
Hi all,

While testing PG16, I observed that in PG16 there is a big performance
degradation in concurrent COPY into a single relation with 2 - 16
clients in my environment. I've attached a test script that measures
the execution time of COPYing 5GB data in total to the single relation
while changing the number of concurrent insertions, in PG16 and PG15.
Here are the results on my environment (EC2 instance, RHEL 8.6, 128
vCPUs, 512GB RAM):

* PG15 (4b15868b69)
PG15: nclients = 1, execution time = 14.181
PG15: nclients = 2, execution time = 9.319
PG15: nclients = 4, execution time = 5.872
PG15: nclients = 8, execution time = 3.773
PG15: nclients = 16, execution time = 3.202
PG15: nclients = 32, execution time = 3.023
PG15: nclients = 64, execution time = 3.829
PG15: nclients = 128, execution time = 4.111
PG15: nclients = 256, execution time = 4.158

* PG16 (c24e9ef330)
PG16: nclients = 1, execution time = 17.112
PG16: nclients = 2, execution time = 14.084
PG16: nclients = 4, execution time = 27.997
PG16: nclients = 8, execution time = 10.554
PG16: nclients = 16, execution time = 7.074
PG16: nclients = 32, execution time = 4.607
PG16: nclients = 64, execution time = 2.093
PG16: nclients = 128, execution time = 2.141
PG16: nclients = 256, execution time = 2.202

PG16 has better scalability (more than 64 clients) but it took much
more time than PG15, especially at 1 - 16 clients.

The relevant commit is 00d1e02be2 "hio: Use ExtendBufferedRelBy() to
extend tables more efficiently". With commit 1cbbee0338 (the previous
commit of 00d1e02be2), I got a better numbers, it didn't have a better
scalability, though:

PG16: nclients = 1, execution time = 17.444
PG16: nclients = 2, execution time = 10.690
PG16: nclients = 4, execution time = 7.010
PG16: nclients = 8, execution time = 4.282
PG16: nclients = 16, execution time = 3.373
PG16: nclients = 32, execution time = 3.205
PG16: nclients = 64, execution time = 3.705
PG16: nclients = 128, execution time = 4.196
PG16: nclients = 256, execution time = 4.201

While investigating the cause, I found an interesting fact that in
mdzeroextend if I use only either FileFallocate() or FileZero, we can
get better numbers. For example, If I always use FileZero with the
following change:

@@ -574,7 +574,7 @@ mdzeroextend(SMgrRelation reln, ForkNumber forknum,
         * that decision should be made though? For now just use a cutoff of
         * 8, anything between 4 and 8 worked OK in some local testing.
         */
-       if (numblocks > 8)
+       if (false)
        {
            int         ret;

I got:

PG16: nclients = 1, execution time = 16.898
PG16: nclients = 2, execution time = 8.740
PG16: nclients = 4, execution time = 4.656
PG16: nclients = 8, execution time = 2.733
PG16: nclients = 16, execution time = 2.021
PG16: nclients = 32, execution time = 1.693
PG16: nclients = 64, execution time = 1.742
PG16: nclients = 128, execution time = 2.180
PG16: nclients = 256, execution time = 2.296

After further investigation, the performance degradation comes from
calling posix_fallocate() (called via FileFallocate()) and pwritev()
(called via FileZero) alternatively depending on how many blocks we
extend by. And it happens only on the xfs filesystem. Does anyone
observe a similar performance issue with the attached benchmark
script?

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Mon, Jul 3, 2023 at 11:55 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>
> After further investigation, the performance degradation comes from
> calling posix_fallocate() (called via FileFallocate()) and pwritev()
> (called via FileZero) alternatively depending on how many blocks we
> extend by. And it happens only on the xfs filesystem.

FYI, the attached simple C program proves the fact that calling
alternatively posix_fallocate() and pwrite() causes slow performance
on posix_fallocate():

$ gcc -o test test.c
$ time ./test test.1 1
total   200000
fallocate       200000
filewrite       0

real    0m1.305s
user    0m0.050s
sys     0m1.255s

$ time ./test test.2 2
total   200000
fallocate       100000
filewrite       100000

real    1m29.222s
user    0m0.139s
sys     0m3.139s

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Heikki Linnakangas
Date:
On 03/07/2023 05:59, Masahiko Sawada wrote:
> On Mon, Jul 3, 2023 at 11:55 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>>
>> After further investigation, the performance degradation comes from
>> calling posix_fallocate() (called via FileFallocate()) and pwritev()
>> (called via FileZero) alternatively depending on how many blocks we
>> extend by. And it happens only on the xfs filesystem.
> 
> FYI, the attached simple C program proves the fact that calling
> alternatively posix_fallocate() and pwrite() causes slow performance
> on posix_fallocate():
> 
> $ gcc -o test test.c
> $ time ./test test.1 1
> total   200000
> fallocate       200000
> filewrite       0
> 
> real    0m1.305s
> user    0m0.050s
> sys     0m1.255s
> 
> $ time ./test test.2 2
> total   200000
> fallocate       100000
> filewrite       100000
> 
> real    1m29.222s
> user    0m0.139s
> sys     0m3.139s

This must be highly dependent on the underlying OS and filesystem. I'm 
not seeing that effect on my laptop:

/data$ time /tmp/test test.0 0
total    200000
fallocate    0
filewrite    200000

real    0m1.856s
user    0m0.140s
sys    0m1.688s
/data$ time /tmp/test test.1 1
total    200000
fallocate    200000
filewrite    0

real    0m1.335s
user    0m0.156s
sys    0m1.179s
/data$ time /tmp/test test.2 2
total    200000
fallocate    100000
filewrite    100000

real    0m2.159s
user    0m0.165s
sys    0m1.880s

/data$ uname -a
Linux heikkilaptop 6.0.0-6-amd64 #1 SMP PREEMPT_DYNAMIC Debian 6.0.12-1 
(2022-12-09) x86_64 GNU/Linux

/data is an nvme drive with ext4 filesystem.

-- 
Heikki Linnakangas
Neon (https://neon.tech)




Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Mon, Jul 3, 2023 at 4:36 PM Heikki Linnakangas <hlinnaka@iki.fi> wrote:
>
> On 03/07/2023 05:59, Masahiko Sawada wrote:
> > On Mon, Jul 3, 2023 at 11:55 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> >>
> >> After further investigation, the performance degradation comes from
> >> calling posix_fallocate() (called via FileFallocate()) and pwritev()
> >> (called via FileZero) alternatively depending on how many blocks we
> >> extend by. And it happens only on the xfs filesystem.
> >
> > FYI, the attached simple C program proves the fact that calling
> > alternatively posix_fallocate() and pwrite() causes slow performance
> > on posix_fallocate():
> >
> > $ gcc -o test test.c
> > $ time ./test test.1 1
> > total   200000
> > fallocate       200000
> > filewrite       0
> >
> > real    0m1.305s
> > user    0m0.050s
> > sys     0m1.255s
> >
> > $ time ./test test.2 2
> > total   200000
> > fallocate       100000
> > filewrite       100000
> >
> > real    1m29.222s
> > user    0m0.139s
> > sys     0m3.139s
>
> This must be highly dependent on the underlying OS and filesystem.

Right. The above were the result where I created the file on the xfs
filesystem. The kernel version and the xfs filesystem version are:

% uname -rms
Linux 4.18.0-372.9.1.el8.x86_64 x86_64

% sudo xfs_db -r /dev/nvme4n1p2
xfs_db> version
versionnum [0xb4b5+0x18a] =
V5,NLINK,DIRV2,ATTR,ALIGN,LOGV2,EXTFLG,MOREBITS,ATTR2,LAZYSBCOUNT,PROJID32BIT,CRC,FTYPE,FINOBT,SPARSE_INODES,REFLINK

As far as I tested, it happens only on the xfs filesystem (at least
the above version) and doesn't happen on ext4 and ext3 filesystems.

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



Hi Masahiko,

Out of curiosity I've tried and it is reproducible as you have stated : XFS @ 4.18.0-425.10.1.el8_7.x86_64:

[root@rockyora ~]# time ./test test.1 1
total   200000
fallocate       200000
filewrite       0

real    0m5.868s
user    0m0.035s
sys     0m5.716s
[root@rockyora ~]# time ./test test.2 2
total   200000
fallocate       100000
filewrite       100000

real    0m25.858s
user    0m0.108s
sys     0m3.596s
[root@rockyora ~]# time ./test test.3 2
total   200000
fallocate       100000
filewrite       100000

real    0m25.927s
user    0m0.091s
sys     0m3.621s
[root@rockyora ~]# time ./test test.4 1
total   200000
fallocate       200000
filewrite       0

real    0m3.044s
user    0m0.043s
sys     0m2.934s

According to iostat and blktrace -d /dev/sda -o - | blkparse -i - output , the XFS issues sync writes while ext4 does not, xfs looks like constant loop of sync writes (D) by kworker/2:1H-kblockd:
[..]
  8,0    2    34172    24.115364875   312  D  WS 44624928 + 16 [kworker/2:1H]
  8,0    2    34173    24.115482679     0  C  WS 44624928 + 16 [0]
  8,0    2    34174    24.115548251  6501  A  WS 42525760 + 16 <- (253,0) 34225216
  8,0    2    34175    24.115548660  6501  A  WS 44624960 + 16 <- (8,2) 42525760
  8,0    2    34176    24.115549111  6501  Q  WS 44624960 + 16 [test]
  8,0    2    34177    24.115551351  6501  G  WS 44624960 + 16 [test]
  8,0    2    34178    24.115552111  6501  I  WS 44624960 + 16 [test]
  8,0    2    34179    24.115559713   312  D  WS 44624960 + 16 [kworker/2:1H]
  8,0    2    34180    24.115677217     0  C  WS 44624960 + 16 [0]
  8,0    2    34181    24.115743150  6501  A  WS 42525792 + 16 <- (253,0) 34225248
  8,0    2    34182    24.115743502  6501  A  WS 44624992 + 16 <- (8,2) 42525792
  8,0    2    34183    24.115743949  6501  Q  WS 44624992 + 16 [test]
  8,0    2    34184    24.115746175  6501  G  WS 44624992 + 16 [test]
  8,0    2    34185    24.115746918  6501  I  WS 44624992 + 16 [test]
  8,0    2    34186    24.115754492   312  D  WS 44624992 + 16 [kworker/2:1H]

So it looks like you are onto something.

Regards,
-J.

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Alvaro Herrera
Date:
Hello,

On 2023-Jul-03, Masahiko Sawada wrote:

> While testing PG16, I observed that in PG16 there is a big performance
> degradation in concurrent COPY into a single relation with 2 - 16
> clients in my environment. I've attached a test script that measures
> the execution time of COPYing 5GB data in total to the single relation
> while changing the number of concurrent insertions, in PG16 and PG15.

This item came up in the RMT meeting.  Andres, I think this item belongs
to you, because of commit 00d1e02be2.

The regression seems serious enough at low client counts:

> * PG15 (4b15868b69)
> PG15: nclients = 1, execution time = 14.181
> PG15: nclients = 2, execution time = 9.319
> PG15: nclients = 4, execution time = 5.872
> PG15: nclients = 8, execution time = 3.773
> PG15: nclients = 16, execution time = 3.202

> * PG16 (c24e9ef330)
> PG16: nclients = 1, execution time = 17.112
> PG16: nclients = 2, execution time = 14.084
> PG16: nclients = 4, execution time = 27.997
> PG16: nclients = 8, execution time = 10.554
> PG16: nclients = 16, execution time = 7.074

So the fact that the speed has clearly gone up at larger client counts
is not an excuse for not getting it fixed, XFS-specificity
notwithstanding.

> The relevant commit is 00d1e02be2 "hio: Use ExtendBufferedRelBy() to
> extend tables more efficiently". With commit 1cbbee0338 (the previous
> commit of 00d1e02be2), I got a better numbers, it didn't have a better
> scalability, though:
> 
> PG16: nclients = 1, execution time = 17.444
> PG16: nclients = 2, execution time = 10.690
> PG16: nclients = 4, execution time = 7.010
> PG16: nclients = 8, execution time = 4.282
> PG16: nclients = 16, execution time = 3.373

Well, these numbers are better, but they still look worse than PG15.
I suppose there are other commits that share blame.

-- 
Álvaro Herrera               48°01'N 7°57'E  —  https://www.EnterpriseDB.com/
"La virtud es el justo medio entre dos defectos" (Aristóteles)



Hi,

On 2023-07-10 15:25:41 +0200, Alvaro Herrera wrote:
> On 2023-Jul-03, Masahiko Sawada wrote:
> 
> > While testing PG16, I observed that in PG16 there is a big performance
> > degradation in concurrent COPY into a single relation with 2 - 16
> > clients in my environment. I've attached a test script that measures
> > the execution time of COPYing 5GB data in total to the single relation
> > while changing the number of concurrent insertions, in PG16 and PG15.
> 
> This item came up in the RMT meeting.  Andres, I think this item belongs
> to you, because of commit 00d1e02be2.

I'll take a look - I wasn't even aware of this thread until now.

Greetings,

Andres Freund



Hi,

On 2023-07-03 11:55:13 +0900, Masahiko Sawada wrote:
> While testing PG16, I observed that in PG16 there is a big performance
> degradation in concurrent COPY into a single relation with 2 - 16
> clients in my environment. I've attached a test script that measures
> the execution time of COPYing 5GB data in total to the single relation
> while changing the number of concurrent insertions, in PG16 and PG15.
> Here are the results on my environment (EC2 instance, RHEL 8.6, 128
> vCPUs, 512GB RAM):

Gah, RHEL with its frankenkernels, the bane of my existance.

FWIW, I had extensively tested this with XFS, just with a newer kernel. Have
you tested this on RHEL9 as well by any chance?

Greetings,

Andres Freund



Hi,

On 2023-07-03 11:59:38 +0900, Masahiko Sawada wrote:
> On Mon, Jul 3, 2023 at 11:55 AM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
> >
> > After further investigation, the performance degradation comes from
> > calling posix_fallocate() (called via FileFallocate()) and pwritev()
> > (called via FileZero) alternatively depending on how many blocks we
> > extend by. And it happens only on the xfs filesystem.
>
> FYI, the attached simple C program proves the fact that calling
> alternatively posix_fallocate() and pwrite() causes slow performance
> on posix_fallocate():
>
> $ gcc -o test test.c
> $ time ./test test.1 1
> total   200000
> fallocate       200000
> filewrite       0
>
> real    0m1.305s
> user    0m0.050s
> sys     0m1.255s
>
> $ time ./test test.2 2
> total   200000
> fallocate       100000
> filewrite       100000
>
> real    1m29.222s
> user    0m0.139s
> sys     0m3.139s

On an xfs filesystem, with a very recent kernel:

time /tmp/msw_test /srv/dev/fio/msw 0
total    200000
fallocate    0
filewrite    200000

real    0m0.456s
user    0m0.017s
sys    0m0.439s


time /tmp/msw_test /srv/dev/fio/msw 1
total    200000
fallocate    200000
filewrite    0

real    0m0.141s
user    0m0.010s
sys    0m0.131s


time /tmp/msw_test /srv/dev/fio/msw 2
total    200000
fallocate    100000
filewrite    100000

real    0m0.297s
user    0m0.017s
sys    0m0.280s


So I don't think I can reproduce your problem on that system...

I also tried adding a fdatasync() into the loop, but that just made things
uniformly slow.


I guess I'll try to dig up whether this is a problem in older upstream
kernels, or whether it's been introduced in RHEL.

Greetings,

Andres Freund



Hi,

On 2023-07-03 11:53:56 +0200, Jakub Wartak wrote:
> Out of curiosity I've tried and it is reproducible as you have stated : XFS
> @ 4.18.0-425.10.1.el8_7.x86_64:
>...
> According to iostat and blktrace -d /dev/sda -o - | blkparse -i - output ,
> the XFS issues sync writes while ext4 does not, xfs looks like constant
> loop of sync writes (D) by kworker/2:1H-kblockd:

That clearly won't go well.  It's not reproducible on newer systems,
unfortunately :(. Or well, fortunately maybe.


I wonder if a trick to avoid this could be to memorialize the fact that we
bulk extended before and extend by that much going forward? That'd avoid the
swapping back and forth.


One thing that confuses me is that Sawada-san observed a regression at a
single client - yet from what I can tell, there's actually not a single
fallocate() being generated in that case, because the table is so narrow that
we never end up extending by a sufficient number of blocks in
RelationAddBlocks() to reach that path. Yet there's a regression at 1 client.

I don't yet have a RHEL8 system at hand, could either of you send the result
of a
  strace -c -p $pid_of_backend_doing_copy

Greetings,

Andres Freund



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Tue, Jul 11, 2023 at 12:34 AM Andres Freund <andres@anarazel.de> wrote:
>
> Hi,
>
> On 2023-07-03 11:55:13 +0900, Masahiko Sawada wrote:
> > While testing PG16, I observed that in PG16 there is a big performance
> > degradation in concurrent COPY into a single relation with 2 - 16
> > clients in my environment. I've attached a test script that measures
> > the execution time of COPYing 5GB data in total to the single relation
> > while changing the number of concurrent insertions, in PG16 and PG15.
> > Here are the results on my environment (EC2 instance, RHEL 8.6, 128
> > vCPUs, 512GB RAM):
>
> Gah, RHEL with its frankenkernels, the bane of my existance.
>
> FWIW, I had extensively tested this with XFS, just with a newer kernel. Have
> you tested this on RHEL9 as well by any chance?

I've tested this on RHEL9 (m5.24xlarge; 96vCPUs, 384GB RAM), and it
seems to be reproducible on RHEL9 too.

$ uname -rms
Linux 5.14.0-284.11.1.el9_2.x86_64 x86_64
$ cat /etc/redhat-release
Red Hat Enterprise Linux release 9.2 (Plow)

PG15: nclients = 1, execution time = 22.193
PG15: nclients = 2, execution time = 12.430
PG15: nclients = 4, execution time = 8.677
PG15: nclients = 8, execution time = 6.144
PG15: nclients = 16, execution time = 5.938
PG15: nclients = 32, execution time = 5.775
PG15: nclients = 64, execution time = 5.928
PG15: nclients = 128, execution time = 6.346
PG15: nclients = 256, execution time = 6.641

PG16: nclients = 1, execution time = 24.601
PG16: nclients = 2, execution time = 27.845
PG16: nclients = 4, execution time = 40.575
PG16: nclients = 8, execution time = 24.379
PG16: nclients = 16, execution time = 15.835
PG16: nclients = 32, execution time = 8.370
PG16: nclients = 64, execution time = 4.042
PG16: nclients = 128, execution time = 2.956
PG16: nclients = 256, execution time = 2.591

Tests with test.c program:

$ rm -f test.data; time ./test test.data 0
total   200000
fallocate       0
filewrite       200000

real    0m0.709s
user    0m0.057s
sys     0m0.649s

$ rm -f test.data; time ./test test.data 1
total   200000
fallocate       200000
filewrite       0

real    0m0.853s
user    0m0.058s
sys     0m0.791s

$ rm -f test.data; time ./test test.data 2
total   200000
fallocate       100000
filewrite       100000

real    2m10.002s
user    0m0.366s
sys     0m6.649s

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Tue, Jul 11, 2023 at 1:24 AM Andres Freund <andres@anarazel.de> wrote:
>
> Hi,
>
> On 2023-07-03 11:53:56 +0200, Jakub Wartak wrote:
> > Out of curiosity I've tried and it is reproducible as you have stated : XFS
> > @ 4.18.0-425.10.1.el8_7.x86_64:
> >...
> > According to iostat and blktrace -d /dev/sda -o - | blkparse -i - output ,
> > the XFS issues sync writes while ext4 does not, xfs looks like constant
> > loop of sync writes (D) by kworker/2:1H-kblockd:
>
> That clearly won't go well.  It's not reproducible on newer systems,
> unfortunately :(. Or well, fortunately maybe.
>
>
> I wonder if a trick to avoid this could be to memorialize the fact that we
> bulk extended before and extend by that much going forward? That'd avoid the
> swapping back and forth.
>
>
> One thing that confuses me is that Sawada-san observed a regression at a
> single client - yet from what I can tell, there's actually not a single
> fallocate() being generated in that case, because the table is so narrow that
> we never end up extending by a sufficient number of blocks in
> RelationAddBlocks() to reach that path. Yet there's a regression at 1 client.
>
> I don't yet have a RHEL8 system at hand, could either of you send the result
> of a
>   strace -c -p $pid_of_backend_doing_copy
>

Here are the results:

* PG16: nclients = 1, execution time = 23.758
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 53.18    0.308675           0    358898           pwrite64
 33.92    0.196900           2     81202           pwritev
  7.78    0.045148           0     81378           lseek
  5.06    0.029371           2     11141           read
  0.04    0.000250           2        91           openat
  0.02    0.000094           1        89           close
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0        84           brk
  0.00    0.000000           0         1           sendto
  0.00    0.000000           0         2         1 recvfrom
  0.00    0.000000           0         2           kill
  0.00    0.000000           0         1           futex
  0.00    0.000000           0         1           epoll_wait
------ ----------- ----------- --------- --------- ----------------
100.00    0.580438           1    532891         1 total

* PG16: nclients = 2, execution time = 18.045
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 54.19    0.218721           1    187803           pwrite64
 29.24    0.118002           2     40242           pwritev
  6.23    0.025128           0     41239           lseek
  5.03    0.020285           2      9133           read
  2.04    0.008229           9       855           fallocate
  1.28    0.005151           0      5598      1000 futex
  1.12    0.004516           1      3965           kill
  0.78    0.003141           1      3058         1 epoll_wait
  0.06    0.000224           2       100           openat
  0.03    0.000136           1        98           close
  0.01    0.000050           0        84           brk
  0.00    0.000013           0        22           setitimer
  0.00    0.000006           0        15         1 rt_sigreturn
  0.00    0.000002           2         1           munmap
  0.00    0.000002           2         1           sendto
  0.00    0.000002           0         3         2 recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00    0.403608           1    292217      1004 total

* PG16: nclients = 4, execution time = 18.807
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 64.61    0.240171           2     93868           pwrite64
 15.11    0.056173           4     11337           pwritev
  7.29    0.027100           7      3465           fallocate
  4.05    0.015048           2      5179           read
  3.55    0.013188           0     14941           lseek
  2.65    0.009858           1      8675      2527 futex
  1.76    0.006536           1      4190           kill
  0.88    0.003268           1      2199           epoll_wait
  0.06    0.000213           2       101           openat
  0.03    0.000130           1        99           close
  0.01    0.000031           1        18           rt_sigreturn
  0.01    0.000027           1        17           setitimer
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0        84           brk
  0.00    0.000000           0         1           sendto
  0.00    0.000000           0         1           recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00    0.371743           2    144176      2527 total

* PG16: nclients = 8, execution time = 11.982
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 73.16    0.180095           3     47895           pwrite64
  8.61    0.021194           5      4199           pwritev
  5.93    0.014598           6      2199           fallocate
  3.42    0.008425           1      6723      2206 futex
  3.18    0.007824           2      3068           read
  2.44    0.005995           0      6510           lseek
  1.82    0.004475           1      2665           kill
  1.27    0.003118           1      1758         2 epoll_wait
  0.10    0.000239           2        95           openat
  0.06    0.000141           1        93           close
  0.01    0.000034           2        16           setitimer
  0.01    0.000020           2        10         2 rt_sigreturn
  0.00    0.000000           0         1           munmap
  0.00    0.000000           0        84           brk
  0.00    0.000000           0         1           sendto
  0.00    0.000000           0         2         1 recvfrom
------ ----------- ----------- --------- --------- ----------------
100.00    0.246158           3     75319      2211 total

* PG16: nclients = 16, execution time = 7.507
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 79.45    0.078310           5     14870           pwrite64
  5.52    0.005440           5       973           pwritev
  4.51    0.004443           6       640           fallocate
  3.69    0.003640           1      2884      1065 futex
  2.23    0.002200           2       866           read
  1.80    0.001775           1      1685           lseek
  1.44    0.001421           1       782           kill
  1.08    0.001064           2       477         1 epoll_wait
  0.13    0.000129           2        57           openat
  0.08    0.000078           1        56           close
  0.06    0.000055           0        84           brk
  0.00    0.000003           3         1           munmap
  0.00    0.000003           3         1           sendto
  0.00    0.000003           1         2         1 recvfrom
  0.00    0.000002           0         5           setitimer
  0.00    0.000001           0         3         1 rt_sigreturn
------ ----------- ----------- --------- --------- ----------------
100.00    0.098567           4     23386      1068 total

* PG16: nclients = 32, execution time = 4.644
% time     seconds  usecs/call     calls    errors syscall
------ ----------- ----------- --------- --------- ----------------
 88.90    0.147208          12     11571           pwrite64
  3.11    0.005151           1      2643       943 futex
  2.61    0.004314           4      1039           pwritev
  1.74    0.002879           8       327           fallocate
  1.21    0.001998           3       624           read
  0.90    0.001498           1      1439           lseek
  0.66    0.001090           3       358         1 epoll_wait
  0.63    0.001049           2       426           kill
  0.12    0.000206           3        65           openat
  0.07    0.000118           1        64           close
  0.03    0.000045           0        84           brk
  0.01    0.000011          11         1           munmap
  0.00    0.000008           8         1           sendto
  0.00    0.000007           3         2         1 recvfrom
  0.00    0.000002           0         3         1 rt_sigreturn
  0.00    0.000001           0         3           setitimer
------ ----------- ----------- --------- --------- ----------------
100.00    0.165585           8     18650       946 total

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



On Mon, Jul 10, 2023 at 6:24 PM Andres Freund <andres@anarazel.de> wrote:
>
> Hi,
>
> On 2023-07-03 11:53:56 +0200, Jakub Wartak wrote:
> > Out of curiosity I've tried and it is reproducible as you have stated : XFS
> > @ 4.18.0-425.10.1.el8_7.x86_64:
> >...
> > According to iostat and blktrace -d /dev/sda -o - | blkparse -i - output ,
> > the XFS issues sync writes while ext4 does not, xfs looks like constant
> > loop of sync writes (D) by kworker/2:1H-kblockd:
>
> That clearly won't go well.  It's not reproducible on newer systems,
> unfortunately :(. Or well, fortunately maybe.
>
>
> I wonder if a trick to avoid this could be to memorialize the fact that we
> bulk extended before and extend by that much going forward? That'd avoid the
> swapping back and forth.

I haven't seen this thread [1] "Question on slow fallocate", from XFS
mailing list being mentioned here (it was started by Masahiko), but I
do feel it contains very important hints even challenging the whole
idea of zeroing out files (or posix_fallocate()). Please especially
see Dave's reply. He also argues that posix_fallocate() !=
fallocate().  What's interesting is that it's by design and newer
kernel versions should not prevent such behaviour, see my testing
result below.

All I can add is that this those kernel versions (4.18.0) seem to very
popular across customers (RHEL, Rocky) right now and that I've tested
on most recent available one (4.18.0-477.15.1.el8_8.x86_64) using
Masahiko test.c and still got 6-7x slower time when using XFS on that
kernel. After installing kernel-ml (6.4.2) the test.c result seems to
be the same (note it it occurs only when 1st allocating space, but of
course it doesnt if the same file is rewritten/"reallocated"):

[root@rockyora ~]# uname -r
6.4.2-1.el8.elrepo.x86_64
[root@rockyora ~]# time ./test test.0 0
total   200000
fallocate       0
filewrite       200000

real    0m0.405s
user    0m0.006s
sys     0m0.391s
[root@rockyora ~]# time ./test test.0 1
total   200000
fallocate       200000
filewrite       0

real    0m0.137s
user    0m0.005s
sys     0m0.132s
[root@rockyora ~]# time ./test test.1 1
total   200000
fallocate       200000
filewrite       0

real    0m0.968s
user    0m0.020s
sys     0m0.928s
[root@rockyora ~]# time ./test test.2 2
total   200000
fallocate       100000
filewrite       100000

real    0m6.059s
user    0m0.000s
sys     0m0.788s
[root@rockyora ~]# time ./test test.2 2
total   200000
fallocate       100000
filewrite       100000

real    0m0.598s
user    0m0.003s
sys     0m0.225s
[root@rockyora ~]#

iostat -x reports during first "time ./test test.2 2" (as you can see
w_awiat is not that high but it accumulates):
Device            r/s     w/s     rMB/s     wMB/s   rrqm/s   wrqm/s
%rrqm  %wrqm r_await w_await aqu-sz rareq-sz wareq-sz  svctm  %util
sda              0.00 15394.00      0.00    122.02     0.00    13.00
0.00   0.08    0.00    0.05   0.75     0.00     8.12   0.06 100.00
dm-0             0.00 15407.00      0.00    122.02     0.00     0.00
0.00   0.00    0.00    0.06   0.98     0.00     8.11   0.06 100.00

So maybe that's just a hint that you should try on slower storage
instead? (I think that on NVMe this issue would be hardly noticeable
due to low IO latency, not like here)

-J.

[1] - https://www.spinics.net/lists/linux-xfs/msg73035.html



Hi,

On 2023-07-11 09:09:43 +0200, Jakub Wartak wrote:
> On Mon, Jul 10, 2023 at 6:24 PM Andres Freund <andres@anarazel.de> wrote:
> >
> > Hi,
> >
> > On 2023-07-03 11:53:56 +0200, Jakub Wartak wrote:
> > > Out of curiosity I've tried and it is reproducible as you have stated : XFS
> > > @ 4.18.0-425.10.1.el8_7.x86_64:
> > >...
> > > According to iostat and blktrace -d /dev/sda -o - | blkparse -i - output ,
> > > the XFS issues sync writes while ext4 does not, xfs looks like constant
> > > loop of sync writes (D) by kworker/2:1H-kblockd:
> >
> > That clearly won't go well.  It's not reproducible on newer systems,
> > unfortunately :(. Or well, fortunately maybe.
> >
> >
> > I wonder if a trick to avoid this could be to memorialize the fact that we
> > bulk extended before and extend by that much going forward? That'd avoid the
> > swapping back and forth.
>
> I haven't seen this thread [1] "Question on slow fallocate", from XFS
> mailing list being mentioned here (it was started by Masahiko), but I
> do feel it contains very important hints even challenging the whole
> idea of zeroing out files (or posix_fallocate()). Please especially
> see Dave's reply.

I think that's just due to the reproducer being a bit too minimal and the
actual problem being addressed not being explained.


> He also argues that posix_fallocate() != fallocate().  What's interesting is
> that it's by design and newer kernel versions should not prevent such
> behaviour, see my testing result below.

I think the problem there was that I was not targetting a different file
between the different runs, somehow assuming the test program would be taking
care of that.

I don't think the test program actually tests things in a particularly useful
way - it does fallocate()s in 8k chunks - which postgres never does.



> All I can add is that this those kernel versions (4.18.0) seem to very
> popular across customers (RHEL, Rocky) right now and that I've tested
> on most recent available one (4.18.0-477.15.1.el8_8.x86_64) using
> Masahiko test.c and still got 6-7x slower time when using XFS on that
> kernel. After installing kernel-ml (6.4.2) the test.c result seems to
> be the same (note it it occurs only when 1st allocating space, but of
> course it doesnt if the same file is rewritten/"reallocated"):

test.c really doesn't reproduce postgres behaviour in any meaningful way,
using it as a benchmark is a bad idea.

Greetings,

Andres Freund



Hi,

On 2023-07-03 11:55:13 +0900, Masahiko Sawada wrote:
> While testing PG16, I observed that in PG16 there is a big performance
> degradation in concurrent COPY into a single relation with 2 - 16
> clients in my environment. I've attached a test script that measures
> the execution time of COPYing 5GB data in total to the single relation
> while changing the number of concurrent insertions, in PG16 and PG15.
> Here are the results on my environment (EC2 instance, RHEL 8.6, 128
> vCPUs, 512GB RAM):
>
> * PG15 (4b15868b69)
> PG15: nclients = 1, execution time = 14.181
>
> * PG16 (c24e9ef330)
> PG16: nclients = 1, execution time = 17.112

> The relevant commit is 00d1e02be2 "hio: Use ExtendBufferedRelBy() to
> extend tables more efficiently". With commit 1cbbee0338 (the previous
> commit of 00d1e02be2), I got a better numbers, it didn't have a better
> scalability, though:
>
> PG16: nclients = 1, execution time = 17.444

I think the single client case is indicative of an independent regression, or
rather regressions - it can't have anything to do with the fallocate() issue
and reproduces before that too in your numbers.

1) COPY got slower, due to:
9f8377f7a27 Add a DEFAULT option to COPY  FROM

This added a new palloc()/free() to every call to NextCopyFrom(). It's not at
all clear to me why this needs to happen in NextCopyFrom(), particularly
because it's already stored in CopyFromState?


2) pg_strtoint32_safe() got substantially slower, mainly due
   to
faff8f8e47f Allow underscores in integer and numeric constants.
6fcda9aba83 Non-decimal integer literals

pinned to one cpu, turbo mode disabled, I get the following best-of-three times for
  copy test from '/tmp/tmp_4.data'
(too impatient to use the larger file every time)

15:
6281.107 ms

HEAD:
7000.469 ms

backing out 9f8377f7a27:
6433.516 ms

also backing out faff8f8e47f, 6fcda9aba83:
6235.453 ms


I suspect 1) can relatively easily be fixed properly. But 2) seems much
harder. The changes increased the number of branches substantially, that's
gonna cost in something as (previously) tight as pg_strtoint32().



For higher concurrency numbers, I now was able to reproduce the regression, to
a smaller degree. Much smaller after fixing the above. The reason we run into
the issue here is basically that the rows in the test are very narrow and reach

#define MAX_BUFFERED_TUPLES        1000

at a small number of pages, so we go back and forth between extending with
fallocate() and not.

I'm *not* saying that that is the solution, but after changing that to 5000,
the numbers look a lot better (with the other regressions "worked around"):

(this is again with turboboost disabled, to get more reproducible numbers)

clients                1       2       4       8       16      32

15,buffered=1000                25725   13211   9232    5639    4862    4700
15,buffered=5000                26107   14550   8644    6050    4943    4766
HEAD+fixes,buffered=1000        25875   14505   8200    4900    3565    3433
HEAD+fixes,buffered=5000        25830   12975   6527    3594    2739    2642

Greetings,

Andres Freund

[1] https://postgr.es/m/CAD21AoAEwHTLYhuQ6PaBRPXKWN-CgW9iw%2B4hm%3D2EOFXbJQ3tOg%40mail.gmail.com



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Wed, Jul 12, 2023 at 3:52 AM Andres Freund <andres@anarazel.de> wrote:
>
> Hi,
>
> On 2023-07-03 11:55:13 +0900, Masahiko Sawada wrote:
> > While testing PG16, I observed that in PG16 there is a big performance
> > degradation in concurrent COPY into a single relation with 2 - 16
> > clients in my environment. I've attached a test script that measures
> > the execution time of COPYing 5GB data in total to the single relation
> > while changing the number of concurrent insertions, in PG16 and PG15.
> > Here are the results on my environment (EC2 instance, RHEL 8.6, 128
> > vCPUs, 512GB RAM):
> >
> > * PG15 (4b15868b69)
> > PG15: nclients = 1, execution time = 14.181
> >
> > * PG16 (c24e9ef330)
> > PG16: nclients = 1, execution time = 17.112
>
> > The relevant commit is 00d1e02be2 "hio: Use ExtendBufferedRelBy() to
> > extend tables more efficiently". With commit 1cbbee0338 (the previous
> > commit of 00d1e02be2), I got a better numbers, it didn't have a better
> > scalability, though:
> >
> > PG16: nclients = 1, execution time = 17.444
>
> I think the single client case is indicative of an independent regression, or
> rather regressions - it can't have anything to do with the fallocate() issue
> and reproduces before that too in your numbers.

Right.

>
> 1) COPY got slower, due to:
> 9f8377f7a27 Add a DEFAULT option to COPY  FROM
>
> This added a new palloc()/free() to every call to NextCopyFrom(). It's not at
> all clear to me why this needs to happen in NextCopyFrom(), particularly
> because it's already stored in CopyFromState?

Yeah, it seems to me that we can palloc the bool array once and use it
for the entire COPY FROM. With the attached small patch, the
performance becomes much better:

15:
14.70500 sec

16:
17.42900 sec

16 w/ patch:
14.85600 sec

>
>
> 2) pg_strtoint32_safe() got substantially slower, mainly due
>    to
> faff8f8e47f Allow underscores in integer and numeric constants.
> 6fcda9aba83 Non-decimal integer literals

Agreed.

>
> pinned to one cpu, turbo mode disabled, I get the following best-of-three times for
>   copy test from '/tmp/tmp_4.data'
> (too impatient to use the larger file every time)
>
> 15:
> 6281.107 ms
>
> HEAD:
> 7000.469 ms
>
> backing out 9f8377f7a27:
> 6433.516 ms
>
> also backing out faff8f8e47f, 6fcda9aba83:
> 6235.453 ms
>
>
> I suspect 1) can relatively easily be fixed properly. But 2) seems much
> harder. The changes increased the number of branches substantially, that's
> gonna cost in something as (previously) tight as pg_strtoint32().

I'll look at how to fix 2).

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Wed, Jul 12, 2023 at 5:40 PM Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>
> On Wed, Jul 12, 2023 at 3:52 AM Andres Freund <andres@anarazel.de> wrote:
> >
> > Hi,
> >
> > On 2023-07-03 11:55:13 +0900, Masahiko Sawada wrote:
> > > While testing PG16, I observed that in PG16 there is a big performance
> > > degradation in concurrent COPY into a single relation with 2 - 16
> > > clients in my environment. I've attached a test script that measures
> > > the execution time of COPYing 5GB data in total to the single relation
> > > while changing the number of concurrent insertions, in PG16 and PG15.
> > > Here are the results on my environment (EC2 instance, RHEL 8.6, 128
> > > vCPUs, 512GB RAM):
> > >
> > > * PG15 (4b15868b69)
> > > PG15: nclients = 1, execution time = 14.181
> > >
> > > * PG16 (c24e9ef330)
> > > PG16: nclients = 1, execution time = 17.112
> >
> > > The relevant commit is 00d1e02be2 "hio: Use ExtendBufferedRelBy() to
> > > extend tables more efficiently". With commit 1cbbee0338 (the previous
> > > commit of 00d1e02be2), I got a better numbers, it didn't have a better
> > > scalability, though:
> > >
> > > PG16: nclients = 1, execution time = 17.444
> >
> > I think the single client case is indicative of an independent regression, or
> > rather regressions - it can't have anything to do with the fallocate() issue
> > and reproduces before that too in your numbers.
>
> Right.
>
> >
> > 1) COPY got slower, due to:
> > 9f8377f7a27 Add a DEFAULT option to COPY  FROM
> >
> > This added a new palloc()/free() to every call to NextCopyFrom(). It's not at
> > all clear to me why this needs to happen in NextCopyFrom(), particularly
> > because it's already stored in CopyFromState?
>
> Yeah, it seems to me that we can palloc the bool array once and use it
> for the entire COPY FROM. With the attached small patch, the
> performance becomes much better:
>
> 15:
> 14.70500 sec
>
> 16:
> 17.42900 sec
>
> 16 w/ patch:
> 14.85600 sec
>
> >
> >
> > 2) pg_strtoint32_safe() got substantially slower, mainly due
> >    to
> > faff8f8e47f Allow underscores in integer and numeric constants.
> > 6fcda9aba83 Non-decimal integer literals
>
> Agreed.
>
> >
> > pinned to one cpu, turbo mode disabled, I get the following best-of-three times for
> >   copy test from '/tmp/tmp_4.data'
> > (too impatient to use the larger file every time)
> >
> > 15:
> > 6281.107 ms
> >
> > HEAD:
> > 7000.469 ms
> >
> > backing out 9f8377f7a27:
> > 6433.516 ms
> >
> > also backing out faff8f8e47f, 6fcda9aba83:
> > 6235.453 ms
> >
> >
> > I suspect 1) can relatively easily be fixed properly. But 2) seems much
> > harder. The changes increased the number of branches substantially, that's
> > gonna cost in something as (previously) tight as pg_strtoint32().
>
> I'll look at how to fix 2).

I have made some progress on dealing with performance regression on
single client COPY. I've attached a patch to fix 2). With the patch I
shared[1] to deal with 1), single client COPY performance seems to be
now as good as (or slightly better than) PG15 . Here are the results
(averages of 5 times) of loading 50M rows via COPY:

15:
7.609 sec

16:
8.637 sec

16 w/ two patches:
7.179 sec

Regards,

[1] https://www.postgresql.org/message-id/CAD21AoBb9Sbddh%2BnQk1BxUFaRHaa%2BfL8fCzO-Lvxqb6ZcpAHqw%40mail.gmail.com

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com

Attachment
On Wed, 19 Jul 2023 at 09:24, Masahiko Sawada <sawada.mshk@gmail.com> wrote:
>
> > > 2) pg_strtoint32_safe() got substantially slower, mainly due
> > >    to
> > > faff8f8e47f Allow underscores in integer and numeric constants.
> > > 6fcda9aba83 Non-decimal integer literals
> >
> > Agreed.
> >
> I have made some progress on dealing with performance regression on
> single client COPY. I've attached a patch to fix 2). With the patch I
> shared[1] to deal with 1), single client COPY performance seems to be
> now as good as (or slightly better than) PG15 . Here are the results
> (averages of 5 times) of loading 50M rows via COPY:
>

Hmm, I'm somewhat sceptical about this second patch. It's not obvious
why adding such tests would speed it up, and indeed, testing on my
machine with 50M rows, I see a noticeable speed-up from patch 1, and a
slow-down from patch 2:


PG15
====

7390.461 ms
7497.655 ms
7485.850 ms
7406.336 ms

HEAD
====

8388.707 ms
8283.484 ms
8391.638 ms
8363.306 ms

HEAD + P1
=========

7255.128 ms
7185.319 ms
7197.822 ms
7191.176 ms

HEAD + P2
=========

8687.164 ms
8654.907 ms
8641.493 ms
8668.865 ms

HEAD + P1 + P2
==============

7780.126 ms
7786.427 ms
7775.047 ms
7785.938 ms


So for me at least, just applying patch 1 gives the best results, and
makes it slightly faster than PG15 (possibly due to 6b423ec677).

Regards,
Dean



On Wed, 19 Jul 2023 at 23:14, Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
> Hmm, I'm somewhat sceptical about this second patch. It's not obvious
> why adding such tests would speed it up, and indeed, testing on my
> machine with 50M rows, I see a noticeable speed-up from patch 1, and a
> slow-down from patch 2:

I noticed that 6fcda9aba added quite a lot of conditions that need to
be checked before we process a normal decimal integer string. I think
we could likely do better and code it to assume that most strings will
be decimal and put that case first rather than last.

In the attached, I've changed that for the 32-bit version only.  A
more complete patch would need to do the 16 and 64-bit versions too.

-- setup
create table a (a int);
insert into a select x from generate_series(1,10000000)x;
copy a to '~/a.dump';

-- test
truncate a; copy a from '/tmp/a.dump';

master @ ab29a7a9c
Time: 2152.633 ms (00:02.153)
Time: 2121.091 ms (00:02.121)
Time: 2100.995 ms (00:02.101)
Time: 2101.724 ms (00:02.102)
Time: 2103.949 ms (00:02.104)

master + pg_strtoint32_base_10_first.patch
Time: 2061.464 ms (00:02.061)
Time: 2035.513 ms (00:02.036)
Time: 2028.356 ms (00:02.028)
Time: 2043.218 ms (00:02.043)
Time: 2037.035 ms (00:02.037) (~3.6% faster)

Without that, we need to check if the first digit is '0' a total of 3
times and also check if the 2nd digit is any of 'x', 'X', 'o', 'O',
'b' or 'B'. It seems to be coded with the assumption that hex strings
are the most likely. I think decimals are the most likely by far.

David

Attachment
On Thu, 20 Jul 2023 at 00:56, David Rowley <dgrowleyml@gmail.com> wrote:
>
> I noticed that 6fcda9aba added quite a lot of conditions that need to
> be checked before we process a normal decimal integer string. I think
> we could likely do better and code it to assume that most strings will
> be decimal and put that case first rather than last.

That sounds sensible, but ...

> In the attached, I've changed that for the 32-bit version only.  A
> more complete patch would need to do the 16 and 64-bit versions too.
>
> Without that, we need to check if the first digit is '0' a total of 3
> times and also check if the 2nd digit is any of 'x', 'X', 'o', 'O',
> 'b' or 'B'.

That's not what I see. For me, the compiler (gcc 11, using either -O2
or -O3) is smart enough to spot that the first part of each of the 3
checks is the same, and it only tests whether the first digit is '0'
once, before immediately jumping to the decimal parsing code. I didn't
test other compilers though, so I can believe that different compilers
might not be so smart.

OTOH, this test in your patch:

+    /* process decimal digits */
+    if (isdigit((unsigned char) ptr[0]) &&
+        (isdigit((unsigned char) ptr[1]) || ptr[1] == '_' || ptr[1]
== '\0' || isspace(ptr[1])))

is doing more work than it needs to, and actually makes things
noticeably worse for me. It needs to do a minimum of 2 isdigit()
checks before it will parse the input as a decimal, whereas before
(for me at least) it just did one simple comparison of ptr[0] against
'0'.

I agree with the principal though. In the attached updated patch, I
replaced that test with a simpler one:

+    /*
+     * Process the number's digits. We optimize for decimal input (expected to
+     * be the most common case) first. Anything that doesn't start with a base
+     * prefix indicator must be decimal.
+     */
+
+   /* process decimal digits */
+   if (likely(ptr[0] != '0' || !isalpha((unsigned char) ptr[1])))

So hopefully any compiler should only need to do the one comparison
against '0' for any non-zero decimal input.

Doing that didn't give any measurable performance improvement for me,
but it did at least not make it noticeably worse, and seems more
likely to generate better code with not-so-smart compilers. I'd be
interested to know how that performs for you (and if your compiler
really does generate 3 "first digit is '0'" tests for the unpatched
code).

Regards,
Dean

---

Here were my test results (where P1 is the "fix_COPY_DEFAULT.patch"),
and I tested COPY loading 50M rows:

HEAD + P1
=========

7137.966 ms
7193.190 ms
7094.491 ms
7123.520 ms

HEAD + P1 + pg_strtoint32_base_10_first.patch
=============================================

7561.658 ms
7548.282 ms
7551.360 ms
7560.671 ms

HEAD + P1 + pg_strtoint32_base_10_first.v2.patch
================================================

7238.775 ms
7184.937 ms
7123.257 ms
7159.618 ms

Attachment
On Thu, 20 Jul 2023 at 20:37, Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
>
> On Thu, 20 Jul 2023 at 00:56, David Rowley <dgrowleyml@gmail.com> wrote:
> I agree with the principal though. In the attached updated patch, I
> replaced that test with a simpler one:
>
> +    /*
> +     * Process the number's digits. We optimize for decimal input (expected to
> +     * be the most common case) first. Anything that doesn't start with a base
> +     * prefix indicator must be decimal.
> +     */
> +
> +   /* process decimal digits */
> +   if (likely(ptr[0] != '0' || !isalpha((unsigned char) ptr[1])))
>
> So hopefully any compiler should only need to do the one comparison
> against '0' for any non-zero decimal input.
>
> Doing that didn't give any measurable performance improvement for me,
> but it did at least not make it noticeably worse, and seems more
> likely to generate better code with not-so-smart compilers. I'd be
> interested to know how that performs for you (and if your compiler
> really does generate 3 "first digit is '0'" tests for the unpatched
> code).

That seems better.  I benchmarked it on two machines:

gcc12.2/linux/amd3990x
create table a (a int);
insert into a select x from generate_series(1,10000000)x;
copy a to '/tmp/a.dump';

master @ ab29a7a9c
postgres=# truncate a; copy a from '/tmp/a.dump';
Time: 2226.912 ms (00:02.227)
Time: 2214.168 ms (00:02.214)
Time: 2206.481 ms (00:02.206)
Time: 2219.640 ms (00:02.220)
Time: 2205.004 ms (00:02.205)

master + pg_strtoint32_base_10_first.v2.patch
postgres=# truncate a; copy a from '/tmp/a.dump';
Time: 2067.108 ms (00:02.067)
Time: 2070.401 ms (00:02.070)
Time: 2073.423 ms (00:02.073)
Time: 2065.407 ms (00:02.065)
Time: 2066.536 ms (00:02.067) (~7% faster)

apple m2 pro/clang

master @ 9089287a
postgres=# truncate a; copy a from '/tmp/a.dump';
Time: 1286.369 ms (00:01.286)
Time: 1300.534 ms (00:01.301)
Time: 1295.661 ms (00:01.296)
Time: 1296.404 ms (00:01.296)
Time: 1268.361 ms (00:01.268)
Time: 1259.321 ms (00:01.259)

master + pg_strtoint32_base_10_first.v2.patch
postgres=# truncate a; copy a from '/tmp/a.dump';
Time: 1253.519 ms (00:01.254)
Time: 1235.256 ms (00:01.235)
Time: 1269.501 ms (00:01.270)
Time: 1267.801 ms (00:01.268)
Time: 1275.758 ms (00:01.276)
Time: 1261.478 ms (00:01.261) (a bit noisy but avg of ~1.8% faster)

David



Hi,

Hm, in some cases your patch is better, but in others both the old code
(8692f6644e7) and HEAD beat yours on my machine. TBH, not entirely sure why.

prep:
COPY (SELECT generate_series(1, 2000000) a, (random() * 100000 - 50000)::int b, 3243423 c) TO '/tmp/lotsaints.copy';
DROP TABLE lotsaints; CREATE UNLOGGED TABLE lotsaints(a int, b int, c int);

benchmark:
psql -qX -c 'truncate lotsaints' && pgbench -n -P1 -f <( echo "COPY lotsaints FROM '/tmp/lotsaints.copy';") -t 15

I disabled turbo mode, pinned the server to a single core of my Xeon Gold 5215:

HEAD:                           812.690

your patch:                     821.354

strtoint from 8692f6644e7:      824.543

strtoint from 6b423ec677d^:     806.678

(when I say strtoint from, I did not replace the goto labels, so that part is
unchanged and unrelated)


IOW, for me the code from 15 is the fastest by a good bit... There's an imul,
sure, but the fact that it sets a flag makes it faster than having to add more
tests and branches.


Looking at a profile reminded me of how silly it is that we are wasting a good
chunk of the time in these isdigit() checks, even though we already rely on on
the ascii values via (via *ptr++ - '0'). I think that's done in the headers
for some platforms, but not others (glibc). And we've even done already for
octal and binary!

Open coding isdigit() gives us:


HEAD:                           797.434

your patch:                     803.570

strtoint from 8692f6644e7:      778.943

strtoint from 6b423ec677d^:     777.741


It's somewhat odd that HEAD and your patch switch position here...


> -    else if (ptr[0] == '0' && (ptr[1] == 'o' || ptr[1] == 'O'))
> +    /* process hex digits */
> +    else if (ptr[1] == 'x' || ptr[1] == 'X')
>      {
>
>          firstdigit = ptr += 2;

I find this unnecessarily hard to read. I realize it's been added in
6fcda9aba83, but I don't see a reason to use such a construct here.


I find it somewhat grating how much duplication there now is in this
code due to being repeated for all the bases...


Greetings,

Andres Freund



On Tue, 25 Jul 2023 at 17:34, Andres Freund <andres@anarazel.de> wrote:
> prep:
> COPY (SELECT generate_series(1, 2000000) a, (random() * 100000 - 50000)::int b, 3243423 c) TO '/tmp/lotsaints.copy';
> DROP TABLE lotsaints; CREATE UNLOGGED TABLE lotsaints(a int, b int, c int);
>
> benchmark:
> psql -qX -c 'truncate lotsaints' && pgbench -n -P1 -f <( echo "COPY lotsaints FROM '/tmp/lotsaints.copy';") -t 15
>
> I disabled turbo mode, pinned the server to a single core of my Xeon Gold 5215:
>
> HEAD:                           812.690
>
> your patch:                     821.354
>
> strtoint from 8692f6644e7:      824.543
>
> strtoint from 6b423ec677d^:     806.678

I'm surprised to see the imul version is faster. It's certainly not
what we found when working on 6b423ec67.

I've been fooling around a bit to try to learn what might be going on.
I wrote 2 patches:

1) pg_strtoint_imul.patch:  Effectively reverts 6b423ec67 and puts the
code how it likely would have looked had I not done that work at all.
(I've assumed that the hex, octal, binary parsing would have been
added using the overflow multiplication functions just as the base 10
parsing).

2) pg_strtoint_optimize.patch: I've made another pass over the
functions with the current overflow checks and optimized the digit
checking code so that it can be done in a single check like: if (digit
< 10).  This can be done by assigning the result of *ptr - '0' to an
unsigned char.  Anything less than '0' will wrap around and anything
above '9' will remain so.  I've also removed a few inefficiencies with
the isspace checking. We didn't need to do "while (*ptr &&
isspace(*ptr)).  It's fine just to do while (isspace(*ptr)) since '\0'
isn't a space char.  I also got rid of the isxdigit call.  The
hexlookup array contains -1 for non-hex chars. We may as well check
the digit value is >= 0.

Here are the results I get using your test as quoted above:

master @ 62e9af4c63f + fix_COPY_DEFAULT.patch

latency average = 568.102 ms

master @ 62e9af4c63f + fix_COPY_DEFAULT.patch + pg_strtoint_optimize.patch

latency average = 531.238 ms

master @ 62e9af4c63f + fix_COPY_DEFAULT.patch + pg_strtoint_imul.patch

latency average = 559.333 ms (surprisingly also faster on my machine)

The optimized version of the pg_strtoint functions wins over the imul
patch.  Could you test to see if this is also the case in your Xeon
machine?

> (when I say strtoint from, I did not replace the goto labels, so that part is
> unchanged and unrelated)

I didn't quite follow this.

I've not really studied the fix_COPY_DEFAULT.patch patch.  Is there a
reason to delay committing that?  It would be good to eliminate that
as a variable for the current performance regression.

David

Attachment
Hi,

On 2023-07-25 23:37:08 +1200, David Rowley wrote:
> On Tue, 25 Jul 2023 at 17:34, Andres Freund <andres@anarazel.de> wrote:
> I've not really studied the fix_COPY_DEFAULT.patch patch.  Is there a
> reason to delay committing that?  It would be good to eliminate that
> as a variable for the current performance regression.

Yea, I don't think there's a reason to hold off on that. Sawada-san, do you
want to commit it? Or Andrew?


> > prep:
> > COPY (SELECT generate_series(1, 2000000) a, (random() * 100000 - 50000)::int b, 3243423 c) TO
'/tmp/lotsaints.copy';
> > DROP TABLE lotsaints; CREATE UNLOGGED TABLE lotsaints(a int, b int, c int);
> >
> > benchmark:
> > psql -qX -c 'truncate lotsaints' && pgbench -n -P1 -f <( echo "COPY lotsaints FROM '/tmp/lotsaints.copy';") -t 15
> >
> > I disabled turbo mode, pinned the server to a single core of my Xeon Gold 5215:
> >
> > HEAD:                           812.690
> >
> > your patch:                     821.354
> >
> > strtoint from 8692f6644e7:      824.543
> >
> > strtoint from 6b423ec677d^:     806.678
> 
> I'm surprised to see the imul version is faster. It's certainly not
> what we found when working on 6b423ec67.

What CPUs did you test it on? I'd not be surprised if this were heavily
dependent on the microarchitecture.


> I've been fooling around a bit to try to learn what might be going on.
> I wrote 2 patches:
> 
> 1) pg_strtoint_imul.patch:  Effectively reverts 6b423ec67 and puts the
> code how it likely would have looked had I not done that work at all.
> (I've assumed that the hex, octal, binary parsing would have been
> added using the overflow multiplication functions just as the base 10
> parsing).


> 2) pg_strtoint_optimize.patch: I've made another pass over the
> functions with the current overflow checks and optimized the digit
> checking code so that it can be done in a single check like: if (digit
> < 10).  This can be done by assigning the result of *ptr - '0' to an
> unsigned char.  Anything less than '0' will wrap around and anything
> above '9' will remain so.  I've also removed a few inefficiencies with
> the isspace checking. We didn't need to do "while (*ptr &&
> isspace(*ptr)).  It's fine just to do while (isspace(*ptr)) since '\0'
> isn't a space char.  I also got rid of the isxdigit call.  The
> hexlookup array contains -1 for non-hex chars. We may as well check
> the digit value is >= 0.
> 
> Here are the results I get using your test as quoted above:
> 
> master @ 62e9af4c63f + fix_COPY_DEFAULT.patch
> 
> latency average = 568.102 ms
> 
> master @ 62e9af4c63f + fix_COPY_DEFAULT.patch + pg_strtoint_optimize.patch
> 
> latency average = 531.238 ms
> 
> master @ 62e9af4c63f + fix_COPY_DEFAULT.patch + pg_strtoint_imul.patch
> 
> latency average = 559.333 ms (surprisingly also faster on my machine)
> 
> The optimized version of the pg_strtoint functions wins over the imul
> patch.  Could you test to see if this is also the case in your Xeon
> machine?

(these are the numbers with turbo disabled, if I enable it they're all in the
6xx ms range, but the variance is higher)


fix_COPY_DEFAULT.patch
774.344

fix_COPY_DEFAULT.patch + pg_strtoint32_base_10_first.v2.patch
777.673

fix_COPY_DEFAULT.patch + pg_strtoint_optimize.patch
777.545

fix_COPY_DEFAULT.patch + pg_strtoint_imul.patch
795.298

fix_COPY_DEFAULT.patch + pg_strtoint_imul.patch + likely(isdigit())
773.477

fix_COPY_DEFAULT.patch + pg_strtoint32_base_10_first.v2.patch + pg_strtoint_imul.patch
774.443

fix_COPY_DEFAULT.patch + pg_strtoint32_base_10_first.v2.patch + pg_strtoint_imul.patch + likely(isdigit())
774.513

fix_COPY_DEFAULT.patch + pg_strtoint32_base_10_first.v2.patch + pg_strtoint_imul.patch + likely(isdigit()) +
unlikely(*ptr== '_')
 
763.879


One idea I had was to add a fastpath that won't parse all strings, but will
parse the strings that we would generate, and fall back to the more general
variant if it fails. See the attached, rough, prototype:

fix_COPY_DEFAULT.patch + fastpath.patch:
746.971

fix_COPY_DEFAULT.patch + fastpath.patch + isdigit.patch:
715.570

Now, the precise contents of this fastpath are not yet clear (wrt imul or
not), but I think the idea has promise.



> > (when I say strtoint from, I did not replace the goto labels, so that part is
> > unchanged and unrelated)
> 
> I didn't quite follow this.

I meant that I didn't undo ereport()->ereturn().

Greetings,

Andres Freund

Attachment
Hi,

On 2023-07-25 08:50:19 -0700, Andres Freund wrote:
> One idea I had was to add a fastpath that won't parse all strings, but will
> parse the strings that we would generate, and fall back to the more general
> variant if it fails. See the attached, rough, prototype:
> 
> fix_COPY_DEFAULT.patch + fastpath.patch:
> 746.971
> 
> fix_COPY_DEFAULT.patch + fastpath.patch + isdigit.patch:
> 715.570
> 
> Now, the precise contents of this fastpath are not yet clear (wrt imul or
> not), but I think the idea has promise.

Btw, I strongly suspect that fastpath wants to be branchless SSE when it grows
up.

Greetings,

Andres Freund



> On 2023-07-25 23:37:08 +1200, David Rowley wrote:
> > On Tue, 25 Jul 2023 at 17:34, Andres Freund <andres@anarazel.de> wrote:
> > > HEAD:                           812.690
> > >
> > > your patch:                     821.354
> > >
> > > strtoint from 8692f6644e7:      824.543
> > >
> > > strtoint from 6b423ec677d^:     806.678
> >
> > I'm surprised to see the imul version is faster. It's certainly not
> > what we found when working on 6b423ec67.
>
> What CPUs did you test it on? I'd not be surprised if this were heavily
> dependent on the microarchitecture.

This was on AMD 3990x.

> One idea I had was to add a fastpath that won't parse all strings, but will
> parse the strings that we would generate, and fall back to the more general
> variant if it fails. See the attached, rough, prototype:

There were a couple of problems with fastpath.patch.  You need to
reset the position of ptr at the start of the slow path and also you
were using tmp in the if (neg) part instead of tmp_s in the fast path
section.

I fixed that up and made two versions of the patch, one using the
overflow functions (pg_strtoint_fastpath1.patch) and one testing if
the number is going to overflow (same as current master)
(pg_strtoint_fastpath2.patch)

AMD 3990x:

master + fix_COPY_DEFAULT.patch:
latency average = 525.226 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath1.patch:
latency average = 488.171 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath2.patch:
latency average = 481.827 ms


Apple M2 Pro:

master + fix_COPY_DEFAULT.patch:
latency average = 348.433 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath1.patch:
latency average = 336.778 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath2.patch:
latency average = 335.992 ms

Zen 4 7945HX CPU:

master + fix_COPY_DEFAULT.patch:
latency average = 296.881 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath1.patch:
latency average = 287.052 ms

master + fix_COPY_DEFAULT.patch + pg_strtoint_fastpath2.patch:
latency average = 280.742 ms

The M2 chip does not seem to be clearly faster with the fastpath2
method of overflow checking, but both AMD CPUs seem pretty set on
fastpath2 being faster.

It would be really good if someone with another a newish intel CPU
could test this too.

David

Attachment
On Wed, 26 Jul 2023 at 03:50, Andres Freund <andres@anarazel.de> wrote:
> On 2023-07-25 23:37:08 +1200, David Rowley wrote:
> > On Tue, 25 Jul 2023 at 17:34, Andres Freund <andres@anarazel.de> wrote:
> > I've not really studied the fix_COPY_DEFAULT.patch patch.  Is there a
> > reason to delay committing that?  It would be good to eliminate that
> > as a variable for the current performance regression.
>
> Yea, I don't think there's a reason to hold off on that. Sawada-san, do you
> want to commit it? Or Andrew?

Just to keep this moving and to make it easier for people to test the
pg_strtoint patches, I've pushed the fix_COPY_DEFAULT.patch patch.
The only thing I changed was to move the line that was allocating the
array to a location more aligned with the order that the fields are
defined in the struct.

David



On Thu, 27 Jul 2023 at 14:51, David Rowley <dgrowleyml@gmail.com> wrote:
> Just to keep this moving and to make it easier for people to test the
> pg_strtoint patches, I've pushed the fix_COPY_DEFAULT.patch patch.
> The only thing I changed was to move the line that was allocating the
> array to a location more aligned with the order that the fields are
> defined in the struct.

I just did another round of benchmarking to see where we're at after
fox_COPY_DEFAULT.patch has been committed.

Below I've benchmarked REL_15_STABLE up to REL_16_STABLE with some
hand-selected key commits, many of which have been mentioned on this
thread already because they seem to affect the performance of COPY.

To summarise, REL_15_STABLE can run this benchmark in 526.014 ms on my
AMD 3990x machine.  Today's REL_16_STABLE takes 530.344 ms. We're
talking about another patch to speed up the pg_strtoint functions
which gets this down to 483.790 ms. Do we need to do this for v16 or
can we just leave this as it is already?  The slowdown does not seem
to be much above what we'd ordinarily classify as noise using this
test on my machine.

Benchmark setup:

COPY (SELECT generate_series(1, 2000000) a, (random() * 100000 -
50000)::int b, 3243423 c) TO '/tmp/lotsaints.copy';
DROP TABLE lotsaints; CREATE UNLOGGED TABLE lotsaints(a int, b int, c int);

Benchmark:
psql -qX -c 'truncate lotsaints' && pgbench -n -P1 -f <( echo "COPY
lotsaints FROM '/tmp/lotsaints.copy';") -t 15

2864eb977 REL_15_STABLE
latency average = 526.014 ms

8.84%  postgres          [.] pg_strtoint32

29452de73 Sat Dec  3 10:50:39 2022 -0500 The commit before "Improve
performance of pg_strtointNN functions"
latency average = 508.453 ms

10.21%  postgres          [.] pg_strtoint32

6b423ec67 Sun Dec  4 16:18:18 2022 +1300 Improve performance of
pg_strtointNN functions
latency average = 492.943 ms

7.73%  postgres          [.] pg_strtoint32

1939d2628 Fri Dec  9 10:08:44 2022 -0500 The commit before "Convert a
few datatype input functions to use "soft" error reporting."
latency average = 485.016 ms

8.43%  postgres          [.] pg_strtoint32

ccff2d20e Fri Dec  9 10:14:53 2022 -0500 Convert a few datatype input
functions to use "soft" error reporting.
latency average = 501.325 ms

6.90%  postgres          [.] pg_strtoint32_safe

60684dd83 Tue Dec 13 17:33:28 2022 -0800 The commit before
"Non-decimal integer literals"
latency average = 500.889 ms

8.27%  postgres          [.] pg_strtoint32_safe

6fcda9aba Wed Dec 14 05:40:38 2022 +0100 Non-decimal integer literals
latency average = 521.904 ms

9.02%  postgres          [.] pg_strtoint32_safe

1b6f632a3 Sat Feb 4 07:56:09 2023 +0100 The commit before "Allow
underscores in integer and numeric constants."
latency average = 523.195 ms

9.21%  postgres          [.] pg_strtoint32_safe

faff8f8e4 Sat Feb  4 09:48:51 2023 +0000 Allow underscores in integer
and numeric constants.
latency average = 493.064 ms

10.25%  postgres          [.] pg_strtoint32_safe

9f8377f7a Mon Mar 13 10:01:56 2023 -0400 Add a DEFAULT option to COPY  FROM
latency average = 597.617 ms

  12.91%  postgres          [.] CopyReadLine
  10.62%  postgres          [.] CopyReadAttributesText
  10.51%  postgres          [.] pg_strtoint32_safe
   7.97%  postgres          [.] NextCopyFrom

REL_16_STABLE @ c1308ce2d Thu Jul 27 14:48:44 2023 +1200 Fix
performance problem with new COPY DEFAULT code
latency average = 530.344 ms

  13.51%  postgres          [.] CopyReadLine
   9.62%  postgres          [.] pg_strtoint32_safe
   8.97%  postgres          [.] CopyReadAttributesText
   8.43%  postgres          [.] NextCopyFrom

REL_16_STABLE + pg_strtoint_fastpath1.patch
latency average = 493.136 ms

  13.79%  postgres          [.] CopyReadLine
  11.82%  postgres          [.] CopyReadAttributesText
   7.07%  postgres          [.] NextCopyFrom
   6.81%  postgres          [.] pg_strtoint32_safe

REL_16_STABLE + pg_strtoint_fastpath2.patch
latency average = 483.790 ms

  13.87%  postgres          [.] CopyReadLine
  10.40%  postgres          [.] CopyReadAttributesText
   8.22%  postgres          [.] NextCopyFrom
   5.52%  postgres          [.] pg_strtoint32_safe

David




On Thu, Jul 27, 2023 at 7:17 AM David Rowley <dgrowleyml@gmail.com> wrote:
>
> It would be really good if someone with another a newish intel CPU
> could test this too.

I ran the lotsaints test from last email on an i7-10750H (~3 years old) and got these results (gcc 13.1 , turbo off):

REL_15_STABLE:
latency average = 956.453 ms
latency stddev = 4.854 ms

REL_16_STABLE @ 695f5deb7902 (28-JUL-2023):
latency average = 999.354 ms
latency stddev = 3.611 ms

master @ 39055cb4cc (31-JUL-2023):
latency average = 995.310 ms
latency stddev = 5.176 ms

master + revert c1308ce2d (the replace-palloc0 fix)
latency average = 1080.909 ms
latency stddev = 8.707 ms

master + pg_strtoint_fastpath1.patch
latency average = 938.146 ms
latency stddev = 9.354 ms

master + pg_strtoint_fastpath2.patch
latency average = 902.808 ms
latency stddev = 3.957 ms

For me, PG16 seems to regress from PG15, and the second patch seems faster than the first. 

--
John Naylor
EDB: http://www.enterprisedb.com

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-07-27 20:53:16 +1200, David Rowley wrote:
> To summarise, REL_15_STABLE can run this benchmark in 526.014 ms on my
> AMD 3990x machine.  Today's REL_16_STABLE takes 530.344 ms. We're
> talking about another patch to speed up the pg_strtoint functions
> which gets this down to 483.790 ms. Do we need to do this for v16 or
> can we just leave this as it is already?  The slowdown does not seem
> to be much above what we'd ordinarily classify as noise using this
> test on my machine.

I think we need to do something for 16 - it appears on recent-ish AMD the
regression is quite a bit smaller than on intel.  You see something < 1%, I
see more like 4%.  I think there's also other cases where the slowdown is more
substantial.

Besides intel vs amd, it also looks like the gcc version might make a
difference. The code generated by 13 is noticeably slower than 12 for me...

> Benchmark setup:
> 
> COPY (SELECT generate_series(1, 2000000) a, (random() * 100000 -
> 50000)::int b, 3243423 c) TO '/tmp/lotsaints.copy';
> DROP TABLE lotsaints; CREATE UNLOGGED TABLE lotsaints(a int, b int, c int);

There's a lot of larger numbers in the file, which likely reduces the impact
some. And there's the overhead of actually inserting the rows into the table,
making the difference appear smaller than it is.

If I avoid the actual insert into the table and use more columns, I see an about
10% regression here.

COPY (SELECT generate_series(1, 1000) a, 10 b, 20 c, 30 d, 40 e, 50 f FROM generate_series(1, 10000)) TO
'/tmp/lotsaints_wide.copy';

psql -c 'DROP TABLE IF EXISTS lotsaints_wide; CREATE UNLOGGED TABLE lotsaints_wide(a int, b int, c int, d int, e int, f
int);'&& \
 
  pgbench -n -P1 -f <( echo "COPY lotsaints_wide FROM '/tmp/lotsaints_wide.copy' WHERE false") -t 5

15:             2992.605
HEAD:           3325.201
fastpath1.patch 2932.606
fastpath2.patch 2783.915


Interestingly fastpath1 is slower now, even though it wasn't with earlier
patches (which still is repeatable). I do not have the foggiest as to why.

Greetings,

Andres Freund



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Mon, 31 Jul 2023 at 21:39, John Naylor <john.naylor@enterprisedb.com> wrote:
> master + pg_strtoint_fastpath1.patch
> latency average = 938.146 ms
> latency stddev = 9.354 ms
>
> master + pg_strtoint_fastpath2.patch
> latency average = 902.808 ms
> latency stddev = 3.957 ms

Thanks for checking those two on your machine. I'm glad to see
fastpath2 faster on yours too.

David



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Tue, 1 Aug 2023 at 13:25, Andres Freund <andres@anarazel.de> wrote:
> There's a lot of larger numbers in the file, which likely reduces the impact
> some. And there's the overhead of actually inserting the rows into the table,
> making the difference appear smaller than it is.

It might be worth special casing the first digit as we can save doing
the multiplication by 10 and the overflow checks on the first digit.
That should make it slightly faster to parse smaller numbers.

> COPY (SELECT generate_series(1, 1000) a, 10 b, 20 c, 30 d, 40 e, 50 f FROM generate_series(1, 10000)) TO
'/tmp/lotsaints_wide.copy';
>
> psql -c 'DROP TABLE IF EXISTS lotsaints_wide; CREATE UNLOGGED TABLE lotsaints_wide(a int, b int, c int, d int, e int,
fint);' && \
 
>   pgbench -n -P1 -f <( echo "COPY lotsaints_wide FROM '/tmp/lotsaints_wide.copy' WHERE false") -t 5
>
> 15:             2992.605
> HEAD:           3325.201
> fastpath1.patch 2932.606
> fastpath2.patch 2783.915
>
> Interestingly fastpath1 is slower now, even though it wasn't with earlier
> patches (which still is repeatable). I do not have the foggiest as to why.

I'm glad to see that.

I've adjusted the patch to add the fast path for the 16 and 64-bit
versions of the function.  I also added the special case for
processing the first digit, which looks like:

/* process the first digit */
digit = (*ptr - '0');

if (likely(digit < 10))
{
    ptr++;
    tmp = digit;
}

/* process remaining digits */
for (;;)

I tried adding the "at least 1 digit check" by adding an else { goto
slow; } in the above code, but it seems to generate slower code than
just checking if (unlikely(ptr == s)) { goto slow; } after the loop.

I also noticed that I wasn't getting the same performance after
adjusting the 16 and 64 bit versions. I assume that's down to code
alignment, but unsure of that.  I ended up adjusting all the "while
(*ptr)" loops into "for (;;)" loops
since the NUL char check is handled by the "else break;".  I also
removed the needless NUL char check in the isspace loops. It can't be
isspace and '\0'. I also replaced the isdigit() function call and
replaced it for manually checking the digit range.  I see my compiler
(gcc12.2) effectively generates the same code as the unsigned char
fast path version checking if (digit < 10). Once I did that, I got the
performance back again.

With your new test with the small-sized ints, I get:

REL_15_STABLE:
latency average = 1696.390 ms

master @ d3a38318a
latency average = 1928.803 ms

master + fastpath1.patch:
latency average = 1634.736 ms

master + fastpath2.patch:
latency average = 1628.704 ms

master + fastpath3.patch
latency average = 1590.417 ms

I see no particular reason not to go ahead with the attached patch and
get this thread closed off. Any objections?

David

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Dean Rasheed
Date:
On Tue, 1 Aug 2023 at 13:55, David Rowley <dgrowleyml@gmail.com> wrote:
>
> I tried adding the "at least 1 digit check" by adding an else { goto
> slow; } in the above code, but it seems to generate slower code than
> just checking if (unlikely(ptr == s)) { goto slow; } after the loop.
>

That check isn't quite right, because "ptr" will not equal "s" if
there is a sign character, so it won't detect an input with no digits
in that case.

Regards,
Dean



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Wed, 2 Aug 2023 at 01:26, Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
>
> On Tue, 1 Aug 2023 at 13:55, David Rowley <dgrowleyml@gmail.com> wrote:
> >
> > I tried adding the "at least 1 digit check" by adding an else { goto
> > slow; } in the above code, but it seems to generate slower code than
> > just checking if (unlikely(ptr == s)) { goto slow; } after the loop.
> >
>
> That check isn't quite right, because "ptr" will not equal "s" if
> there is a sign character, so it won't detect an input with no digits
> in that case.

Ah, yeah. Thanks.

Here's a patch with an else condition when the first digit check fails.

master + fastpath4.patch:
latency average = 1579.576 ms
latency average = 1572.716 ms
latency average = 1563.398 ms

(appears slightly faster than fastpath3.patch)

David

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Dean Rasheed
Date:
On Tue, 1 Aug 2023 at 15:01, David Rowley <dgrowleyml@gmail.com> wrote:
>
> Here's a patch with an else condition when the first digit check fails.
>
> master + fastpath4.patch:
> latency average = 1579.576 ms
> latency average = 1572.716 ms
> latency average = 1563.398 ms
>
> (appears slightly faster than fastpath3.patch)
>

Running the new test on slightly older Intel hardware (i9-9900K, gcc
11.3), I get the following:

REL_15_STABLE
latency average = 1687.695 ms
latency stddev = 3.068 ms

REL_16_STABLE
latency average = 1931.756 ms
latency stddev = 2.065 ms

REL_16_STABLE + pg_strtoint_fastpath1.patch
latency average = 1635.731 ms
latency stddev = 3.074 ms

REL_16_STABLE + pg_strtoint_fastpath2.patch
latency average = 1687.303 ms
latency stddev = 4.243 ms

REL_16_STABLE + pg_strtoint_fastpath3.patch
latency average = 1610.307 ms
latency stddev = 2.193 ms

REL_16_STABLE + pg_strtoint_fastpath4.patch
latency average = 1577.604 ms
latency stddev = 4.060 ms

HEAD
latency average = 1868.737 ms
latency stddev = 6.114 ms

HEAD + pg_strtoint_fastpath1.patch
latency average = 1683.215 ms
latency stddev = 2.322 ms

HEAD + pg_strtoint_fastpath2.patch
latency average = 1650.014 ms
latency stddev = 3.920 ms

HEAD + pg_strtoint_fastpath3.patch
latency average = 1670.337 ms
latency stddev = 5.074 ms

HEAD + pg_strtoint_fastpath4.patch
latency average = 1653.568 ms
latency stddev = 8.224 ms

I don't know why HEAD and v16 aren't consistent, but it's seems to be
quite reproducible, even though the numutils source is the same in
both branches, and using gdb to dump the disassembly for
pg_strtoint32_safe() shows that it's also the same.

Anyway, insofar as these results can be trusted, fastpath4.patch looks good.

Regards,
Dean



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Wed, 2 Aug 2023 at 07:38, Dean Rasheed <dean.a.rasheed@gmail.com> wrote:
> Running the new test on slightly older Intel hardware (i9-9900K, gcc
> 11.3), I get the following:

Thanks for running those tests. I've now pushed the fastpath4.patch
after making a few adjustments to the header comments to mention the
new stuff that was added in v16.

> I don't know why HEAD and v16 aren't consistent, but it's seems to be
> quite reproducible, even though the numutils source is the same in
> both branches, and using gdb to dump the disassembly for
> pg_strtoint32_safe() shows that it's also the same.

I also see it's inconsistent, but the other way around. Here are some
fresh tests with master and REL_16_STABLE with the committed code and
the version directly prior to the commit:

master @ 3845577cb
latency average = 1575.879 ms

   6.79%  postgres          [.] pg_strtoint32_safe

master~1
latency average = 1968.004 ms

  14.28%  postgres          [.] pg_strtoint32_safe

REL_16_STABLE
latency average = 1735.163 ms

   6.04%  postgres          [.] pg_strtoint32_safe

REL_16_STABLE~1
latency average = 2188.186 ms

  13.83%  postgres          [.] pg_strtoint32_safe

David



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Wed, 2 Aug 2023 at 12:25, David Rowley <dgrowleyml@gmail.com> wrote:
> master @ 3845577cb
> latency average = 1575.879 ms
>
>    6.79%  postgres          [.] pg_strtoint32_safe
>
> master~1
> latency average = 1968.004 ms
>
>   14.28%  postgres          [.] pg_strtoint32_safe
>
> REL_16_STABLE
> latency average = 1735.163 ms
>
>    6.04%  postgres          [.] pg_strtoint32_safe
>
> REL_16_STABLE~1
> latency average = 2188.186 ms
>
>   13.83%  postgres          [.] pg_strtoint32_safe

And just to complete that set, here's the REL_15_STABLE performance
using the same test:

latency average = 1829.108 ms

15.46%  postgres          [.] pg_strtoint32

So, it looks like this item can be closed off.  I'll hold off from
doing that for a few days just in case anyone else wants to give
feedback or test themselves.

David



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
David Rowley
Date:
On Wed, 2 Aug 2023 at 13:35, David Rowley <dgrowleyml@gmail.com> wrote:
> So, it looks like this item can be closed off.  I'll hold off from
> doing that for a few days just in case anyone else wants to give
> feedback or test themselves.

Alright, closed.

David



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Mon, Aug 7, 2023 at 3:16 PM David Rowley <dgrowleyml@gmail.com> wrote:
>
> On Wed, 2 Aug 2023 at 13:35, David Rowley <dgrowleyml@gmail.com> wrote:
> > So, it looks like this item can be closed off.  I'll hold off from
> > doing that for a few days just in case anyone else wants to give
> > feedback or test themselves.
>
> Alright, closed.

IIUC the problem with multiple concurrent COPY is not resolved yet.
I've run the same benchmark that I used for the first report:

* PG15 (cb2ae5741f)
 nclients = 1, execution time = 15.213
 nclients = 2, execution time = 9.470
 nclients = 4, execution time = 6.508
 nclients = 8, execution time = 4.526
 nclients = 16, execution time = 3.788
 nclients = 32, execution time = 3.837
 nclients = 64, execution time = 4.286
 nclients = 128, execution time = 4.388
 nclients = 256, execution time = 4.333

* PG16 (67a007dc0c)
 nclients = 1, execution time = 14.494
 nclients = 2, execution time = 12.962
 nclients = 4, execution time = 17.757
 nclients = 8, execution time = 10.865
 nclients = 16, execution time = 7.371
 nclients = 32, execution time = 4.929
 nclients = 64, execution time = 2.212
 nclients = 128, execution time = 2.020
 nclients = 256, execution time = 2.196

The result of nclients = 1 became better thanks to recent fixes, but
there still seems to be the performance regression at nclient = 2~16
(on RHEL 8 and 9). Andres reported[1] that after changing
MAX_BUFFERED_TUPLES to 5000 the numbers became a lot better but it
would not be the solution, as he mentioned.

Regards,

[1] https://www.postgresql.org/message-id/20230711185159.v2j5vnyrtodnwhgz%40awork3.anarazel.de

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-08-07 23:05:39 +0900, Masahiko Sawada wrote:
> On Mon, Aug 7, 2023 at 3:16 PM David Rowley <dgrowleyml@gmail.com> wrote:
> >
> > On Wed, 2 Aug 2023 at 13:35, David Rowley <dgrowleyml@gmail.com> wrote:
> > > So, it looks like this item can be closed off.  I'll hold off from
> > > doing that for a few days just in case anyone else wants to give
> > > feedback or test themselves.
> >
> > Alright, closed.
>
> IIUC the problem with multiple concurrent COPY is not resolved yet.

Yea - it was just hard to analyze until the other regressions were fixed.


> The result of nclients = 1 became better thanks to recent fixes, but
> there still seems to be the performance regression at nclient = 2~16
> (on RHEL 8 and 9). Andres reported[1] that after changing
> MAX_BUFFERED_TUPLES to 5000 the numbers became a lot better but it
> would not be the solution, as he mentioned.

I think there could be a quite simple fix: Track by how much we've extended
the relation previously in the same bistate. If we already extended by many
blocks, it's very likey that we'll do so further.

A simple prototype patch attached. The results for me are promising. I copied
a smaller file [1], to have more accurate throughput results at shorter runs
(15s).

HEAD before:
clients         tps
1          41
2          76
4         136
8         248
16         360
32         375
64         317


HEAD after:
clients         tps
1          43
2          80
4         155
8         280
16         369
32         405
64         344

Any chance you could your benchmark? I don't see as much of a regression vs 16
as you...

Greetings,

Andres Freund

[1] COPY (SELECT generate_series(1, 100000)) TO '/tmp/data.copy';

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Masahiko Sawada
Date:
On Tue, Aug 8, 2023 at 3:10 AM Andres Freund <andres@anarazel.de> wrote:
>
> Hi,
>
> On 2023-08-07 23:05:39 +0900, Masahiko Sawada wrote:
> > On Mon, Aug 7, 2023 at 3:16 PM David Rowley <dgrowleyml@gmail.com> wrote:
> > >
> > > On Wed, 2 Aug 2023 at 13:35, David Rowley <dgrowleyml@gmail.com> wrote:
> > > > So, it looks like this item can be closed off.  I'll hold off from
> > > > doing that for a few days just in case anyone else wants to give
> > > > feedback or test themselves.
> > >
> > > Alright, closed.
> >
> > IIUC the problem with multiple concurrent COPY is not resolved yet.
>
> Yea - it was just hard to analyze until the other regressions were fixed.
>
>
> > The result of nclients = 1 became better thanks to recent fixes, but
> > there still seems to be the performance regression at nclient = 2~16
> > (on RHEL 8 and 9). Andres reported[1] that after changing
> > MAX_BUFFERED_TUPLES to 5000 the numbers became a lot better but it
> > would not be the solution, as he mentioned.
>
> I think there could be a quite simple fix: Track by how much we've extended
> the relation previously in the same bistate. If we already extended by many
> blocks, it's very likey that we'll do so further.
>
> A simple prototype patch attached. The results for me are promising. I copied
> a smaller file [1], to have more accurate throughput results at shorter runs
> (15s).

Thank you for the patch!

>
> HEAD before:
> clients      tps
> 1             41
> 2             76
> 4            136
> 8            248
> 16           360
> 32           375
> 64           317
>
>
> HEAD after:
> clients      tps
> 1             43
> 2             80
> 4            155
> 8            280
> 16           369
> 32           405
> 64           344
>
> Any chance you could your benchmark? I don't see as much of a regression vs 16
> as you...

Sure. The results are promising for me too:

 nclients = 1, execution time = 13.743
 nclients = 2, execution time = 7.552
 nclients = 4, execution time = 4.758
 nclients = 8, execution time = 3.035
 nclients = 16, execution time = 2.172
 nclients = 32, execution time = 1.959
nclients = 64, execution time = 1.819
nclients = 128, execution time = 1.583
nclients = 256, execution time = 1.631

Here are results of the same benchmark test you used:

w/o patch:
clients    tps
1       66.702
2       59.696
4       73.783
8       168.115
16      400.134
32      574.098
64      565.373
128     526.303
256     591.751

w/ patch:
clients   tps
1       67.735
2       122.534
4       240.707
8       398.944
16      541.097
32      643.083
64      614.775
128     616.007
256     577.885

Regards,

--
Masahiko Sawada
Amazon Web Services: https://aws.amazon.com



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-08-08 12:45:05 +0900, Masahiko Sawada wrote:
> > I think there could be a quite simple fix: Track by how much we've extended
> > the relation previously in the same bistate. If we already extended by many
> > blocks, it's very likey that we'll do so further.
> >
> > A simple prototype patch attached. The results for me are promising. I copied
> > a smaller file [1], to have more accurate throughput results at shorter runs
> > (15s).
> 
> Thank you for the patch!

Attached is a mildly updated version of that patch. No functional changes,
just polished comments and added a commit message.


> > Any chance you could your benchmark? I don't see as much of a regression vs 16
> > as you...
> 
> Sure. The results are promising for me too:
>
>  nclients = 1, execution time = 13.743
>  nclients = 2, execution time = 7.552
>  nclients = 4, execution time = 4.758
>  nclients = 8, execution time = 3.035
>  nclients = 16, execution time = 2.172
>  nclients = 32, execution time = 1.959
> nclients = 64, execution time = 1.819
> nclients = 128, execution time = 1.583
> nclients = 256, execution time = 1.631

Nice. We are consistently better than both 15 and "post integer parsing 16".


I'm really a bit baffled at myself for not using this approach from the get
go.

This also would make it much more beneficial to use a BulkInsertState in
nodeModifyTable.c, even without converting to table_multi_insert().


I was tempted to optimize RelationAddBlocks() a bit, by not calling
RelationExtensionLockWaiterCount() if we are already extending by
MAX_BUFFERS_TO_EXTEND_BY. Before this patch, it was pretty much impossible to
reach that case, because of the MAX_BUFFERED_* limits in copyfrom.c, but now
it's more common. But that probably ought to be done only HEAD, not 16.

A related oddity: RelationExtensionLockWaiterCount()->LockWaiterCount() uses
an exclusive lock on the lock partition - which seems not at all necessary?


Unless somebody sees a reason not to, I'm planning to push this?

Greetings,

Andres Freund

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Alvaro Herrera
Date:
Hello,

On 2023-Aug-12, Andres Freund wrote:

> On 2023-08-08 12:45:05 +0900, Masahiko Sawada wrote:

> > > Any chance you could your benchmark? I don't see as much of a regression vs 16
> > > as you...
> > 
> > Sure. The results are promising for me too:
> >
> >  nclients = 1, execution time = 13.743
> >  nclients = 2, execution time = 7.552
> >  nclients = 4, execution time = 4.758
> >  nclients = 8, execution time = 3.035
> >  nclients = 16, execution time = 2.172
> >  nclients = 32, execution time = 1.959
> > nclients = 64, execution time = 1.819
> > nclients = 128, execution time = 1.583
> > nclients = 256, execution time = 1.631
> 
> Nice. We are consistently better than both 15 and "post integer parsing 16".

Since the wins from this patch were replicated and it has been pushed, I
understand that this open item can be marked as closed, so I've done
that.

Thanks,

-- 
Álvaro Herrera        Breisgau, Deutschland  —  https://www.EnterpriseDB.com/
"Hay dos momentos en la vida de un hombre en los que no debería
especular: cuando puede permitírselo y cuando no puede" (Mark Twain)



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
On 2023-08-16 13:15:46 +0200, Alvaro Herrera wrote:
> Since the wins from this patch were replicated and it has been pushed, I
> understand that this open item can be marked as closed, so I've done
> that.

Thanks!



Andres Freund <andres@anarazel.de> writes:
> On 2023-08-16 13:15:46 +0200, Alvaro Herrera wrote:
>> Since the wins from this patch were replicated and it has been pushed, I
>> understand that this open item can be marked as closed, so I've done
>> that.

> Thanks!

It turns out that this patch is what's making buildfarm member
chipmunk fail in contrib/pg_visibility [1].  That's easily reproduced
by running the test with shared_buffers = 10MB.  I didn't dig further
than the "git bisect" result:

$ git bisect bad
82a4edabd272f70d044faec8cf7fd1eab92d9991 is the first bad commit
commit 82a4edabd272f70d044faec8cf7fd1eab92d9991
Author: Andres Freund <andres@anarazel.de>
Date:   Mon Aug 14 09:54:03 2023 -0700

    hio: Take number of prior relation extensions into account

but I imagine the problem is that the patch's more aggressive
relation-extension heuristic is causing the table to have more
pages than the test case expects.  Is it really a good idea
for such a heuristic to depend on shared_buffers?  If you don't
want to change the heuristic then we'll have to find a way to
tweak this test to avoid it.

            regards, tom lane

[1] https://buildfarm.postgresql.org/cgi-bin/show_log.pl?nm=chipmunk&dt=2023-09-06%2014%3A14%3A51



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-09-06 18:01:53 -0400, Tom Lane wrote:
> It turns out that this patch is what's making buildfarm member
> chipmunk fail in contrib/pg_visibility [1].  That's easily reproduced
> by running the test with shared_buffers = 10MB.  I didn't dig further
> than the "git bisect" result:

At first I was a bit confounded by not being able to reproduce this. My test
environment had max_connections=110 for some other reason - and the problem
doesn't reproduce with that setting...


> $ git bisect bad
> 82a4edabd272f70d044faec8cf7fd1eab92d9991 is the first bad commit
> commit 82a4edabd272f70d044faec8cf7fd1eab92d9991
> Author: Andres Freund <andres@anarazel.de>
> Date:   Mon Aug 14 09:54:03 2023 -0700
>
>     hio: Take number of prior relation extensions into account
>
> but I imagine the problem is that the patch's more aggressive
> relation-extension heuristic is causing the table to have more
> pages than the test case expects.  Is it really a good idea
> for such a heuristic to depend on shared_buffers?

The heuristic doesn't directly depend on shared buffers. However, the amount
we extend by is limited by needing to pin shared buffers covering all the
newly extended buffers.

That's what ends up limiting things here - shared_buffers = 10MB and
max_connections = 10 doesn't allow for a lot of buffers to be pinned
concurrently in each backend.  Although perhaps LimitAdditionalPins() is a bit
too conservative, due to not checking the private refcount array and just
assuming REFCOUNT_ARRAY_ENTRIES.


> If you don't want to change the heuristic then we'll have to find a way to
> tweak this test to avoid it.

We could tweak LimitAdditionalPins() by checking PrivateRefCountArray instead
of assuming the worst-case REFCOUNT_ARRAY_ENTRIES.

However, it seems that the logic in the test is pretty fragile independent of
this issue? Different alignment, block size or an optimization of the page
layout could also break the test?

Unfortunately a query that doesn't falsely alert in this case is a bit ugly,
due to needing to deal with the corner case of an empty page at the end:

select *
from pg_visibility_map('copyfreeze')
where
  (not all_visible or not all_frozen)
  -- deal with trailing empty pages due to potentially bulk-extending too aggressively
  and exists(SELECT * FROM copyfreeze WHERE ctid >= ('('||blkno||', 0)')::tid)
;

Before 82a4edabd27 this situation was rare - you'd have needed contended
extensions. But after it has become more common. I worry that that might cause
other issues :(. OTOH, I think we'll need to extend way more aggressively at
some point...

Greetings,

Andres Freund



Andres Freund <andres@anarazel.de> writes:
> On 2023-09-06 18:01:53 -0400, Tom Lane wrote:
>> It turns out that this patch is what's making buildfarm member
>> chipmunk fail in contrib/pg_visibility [1].  That's easily reproduced
>> by running the test with shared_buffers = 10MB.  I didn't dig further
>> than the "git bisect" result:

> At first I was a bit confounded by not being able to reproduce this. My test
> environment had max_connections=110 for some other reason - and the problem
> doesn't reproduce with that setting...

I just did a git bisect run to discover when the failure documented
in bug #18130 [1] started.  And the answer is commit 82a4edabd.
Now, it's pretty obvious that that commit didn't in itself cause
problems like this:

postgres=# \copy test from 'bug18130.csv' csv
ERROR:  could not read block 5 in file "base/5/17005": read only 0 of 8192 bytes
CONTEXT:  COPY test, line 472: "0,185647715,222655,489637,2,2023-07-31,9100.0000000,302110385,2023-07-30
14:16:36.750981+00,14026347..."

IMO there must be some very nasty bug lurking in the new
multiple-block extension logic, that happens to be exposed by this
test case with 82a4edabd's adjustments to the when-to-extend choices
but wasn't before that.

To save other people the trouble of extracting the in-line data
in the bug submission, I've attached the test files I was using.
The DDL is simplified slightly from what was submitted.  I'm not
entirely sure why a no-op trigger is needed to provoke the bug...

            regards, tom lane

[1] https://www.postgresql.org/message-id/18130-7a86a7356a75209d%40postgresql.org

-- run this, then \copy test from 'bug18130.csv' csv

create table if not exists test (
    a smallint,
    b bigint,
    c bigint,
    d bigint,
    e smallint,
    plan_date date,
    g numeric(18,7),
    h bigint,
    i timestamptz,
    j bigint,
    k integer,
    l smallint,
    primary key (a, b, c, d, e, plan_date)
) partition by list(a);

/* this is just to generate partition structure automatically */
create or replace function test_add_partitions(a integer, year integer)
    returns void
    volatile strict
as
$$
declare
    parent text;
    root text;
begin
    root := 'test_' || a::text;
    execute 'create table if not exists ' || root || ' partition of test for
values in (' || a::text || ') partition by hash (b);';
    for b in 0..7 loop
            parent := root || '_' || b::text;

            execute 'create table if not exists ' || parent ||
                    ' partition of ' || root || ' for values with (modulus
8, remainder ' || b::text || ')' ||
                    ' partition by range (plan_date);';

            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm1 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-01-01'') to
(''' || year::text ||
                    '-02-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm2 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-02-01'') to
(''' || year::text ||
                    '-03-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm3 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-03-01'') to
(''' || year::text ||
                    '-04-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm4 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-04-01'') to
(''' || year::text ||
                    '-05-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm5 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-05-01'') to
(''' || year::text ||
                    '-06-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm6 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-06-01'') to
(''' || year::text ||
                    '-07-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm7 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-07-01'') to
(''' || year::text ||
                    '-08-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm8 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-08-01'') to
(''' || year::text ||
                    '-09-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm9 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-09-01'') to
(''' || year::text ||
                    '-10-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm10 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-10-01'') to
(''' || year::text ||
                    '-11-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm11 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-11-01'') to
(''' || year::text ||
                    '-12-01'');';
            execute 'create table if not exists ' ||
                    parent || '_y' || year::text || 'm12 partition of ' ||
parent ||
                    ' for values from (''' || year::text || '-12-01'') to
(''' || (year + 1)::text ||
                    '-01-01'');';
        end loop;
end;
$$ language plpgsql;

select test_add_partitions(0, 2022);
select test_add_partitions(0, 2023);
select test_add_partitions(0, 2024);

create or replace function t_test_trigger_func()
    returns trigger as
$$
BEGIN
--    NEW.h := nextval(TG_ARGV[0]::regclass);
--    NEW.i := NOW();
    RETURN NEW;
END;
$$ language plpgsql volatile;

-- create sequence if not exists test_seq;

create or replace trigger t_test_trigger before insert or update on test for each row execute procedure
t_test_trigger_func();-- ('test_seq'); 
0,634055868,275174,702098,1,2023-07-30,3000.0000000,204560046,2023-07-30 14:16:36.750981+00,1729747992,720946,0
0,634055868,275174,702098,1,2023-07-31,3000.0000000,204560047,2023-07-30 14:16:36.750981+00,1729747993,720946,0
0,634055868,275174,702098,2,2023-07-30,3000.0000000,204560210,2023-07-30 14:16:36.750981+00,1729747749,720947,0
0,634055868,275174,702098,2,2023-07-31,3000.0000000,204560211,2023-07-30 14:16:36.750981+00,1729747750,720947,0
0,634055868,275183,702123,1,2023-07-30,3000.0000000,204560374,2023-07-30 14:16:36.750981+00,1729748984,720971,0
0,634055868,275183,702123,1,2023-07-31,3000.0000000,204560375,2023-07-30 14:16:36.750981+00,1729748985,720971,0
0,634055868,275183,702123,2,2023-07-30,3000.0000000,204560538,2023-07-30 14:16:36.750981+00,1729748741,720972,0
0,634055868,275183,702123,2,2023-07-31,3000.0000000,204560539,2023-07-30 14:16:36.750981+00,1729748742,720972,0
0,634055868,275282,702619,1,2023-07-30,3000.0000000,204560702,2023-07-30 14:16:36.750981+00,1438187999,721216,0
0,634055868,275282,702619,1,2023-07-31,3000.0000000,204560703,2023-07-30 14:16:36.750981+00,1438188000,721216,0
0,634055868,275282,702619,2,2023-07-30,3000.0000000,204560866,2023-07-30 14:16:36.750981+00,1438187850,721217,0
0,634055868,275282,702619,2,2023-07-31,3000.0000000,204560867,2023-07-30 14:16:36.750981+00,1438187851,721217,0
0,634055868,275283,702635,1,2023-07-30,3500.0000000,204561030,2023-07-30 14:16:36.750981+00,1729749718,721218,0
0,634055868,275283,702635,1,2023-07-31,3500.0000000,204561031,2023-07-30 14:16:36.750981+00,1729749719,721218,0
0,634055868,275283,702635,2,2023-07-30,3500.0000000,204561194,2023-07-30 14:16:36.750981+00,1729749475,721219,0
0,634055868,275283,702635,2,2023-07-31,3500.0000000,204561195,2023-07-30 14:16:36.750981+00,1729749476,721219,0
0,634055868,275284,702637,1,2023-07-30,3500.0000000,204561358,2023-07-30 14:16:36.750981+00,1729748498,721220,0
0,634055868,275284,702637,1,2023-07-31,3500.0000000,204561359,2023-07-30 14:16:36.750981+00,1729748499,721220,0
0,634055868,275284,702637,2,2023-07-30,3500.0000000,204561522,2023-07-30 14:16:36.750981+00,1729748255,721221,0
0,634055868,275284,702637,2,2023-07-31,3500.0000000,204561523,2023-07-30 14:16:36.750981+00,1729748256,721221,0
0,120894640,306460,830190,1,2023-07-30,1900.0000000,230145128,2023-07-30 14:16:36.750981+00,1586279154,813424,0
0,120894640,306460,830190,1,2023-07-31,1900.0000000,230145129,2023-07-30 14:16:36.750981+00,1586279621,813424,0
0,120894640,306460,830190,2,2023-07-30,1900.0000000,230145283,2023-07-30 14:16:36.750981+00,1586279125,813425,0
0,120894640,306460,830190,2,2023-07-31,1900.0000000,230145284,2023-07-30 14:16:36.750981+00,1586279591,813425,0
0,120894640,306481,830248,1,2023-07-30,1100.0000000,230145438,2023-07-30 14:16:36.750981+00,1586279212,813497,0
0,120894640,306481,830248,1,2023-07-31,1100.0000000,230145439,2023-07-30 14:16:36.750981+00,1586279681,813497,0
0,120894640,306481,830248,2,2023-07-30,1600.0000000,230145593,2023-07-30 14:16:36.750981+00,1586279183,813498,0
0,120894640,306481,830248,2,2023-07-31,1600.0000000,230145594,2023-07-30 14:16:36.750981+00,1586279651,813498,0
0,120894640,306482,830249,1,2023-07-30,2600.0000000,230145748,2023-07-30 14:16:36.750981+00,1586279328,813499,0
0,120894640,306482,830249,1,2023-07-31,2600.0000000,230145749,2023-07-30 14:16:36.750981+00,1586279801,813499,0
0,120894640,306482,830249,2,2023-07-30,2600.0000000,230145903,2023-07-30 14:16:36.750981+00,1586279299,813500,0
0,120894640,306482,830249,2,2023-07-31,2600.0000000,230145904,2023-07-30 14:16:36.750981+00,1586279771,813500,0
0,120894640,306482,830249,3,2023-07-30,3000.0000000,230146058,2023-07-30 14:16:36.750981+00,1586279270,813501,0
0,120894640,306482,830249,3,2023-07-31,3000.0000000,230146059,2023-07-30 14:16:36.750981+00,1586279741,813501,0
0,120894640,306482,830249,4,2023-07-30,3000.0000000,230146213,2023-07-30 14:16:36.750981+00,1586279241,813502,0
0,120894640,306482,830249,4,2023-07-31,3000.0000000,230146214,2023-07-30 14:16:36.750981+00,1586279711,813502,0
0,120894640,306487,830254,1,2023-07-30,1100.0000000,230146368,2023-07-30 14:16:36.750981+00,1586279415,813509,0
0,120894640,306487,830254,1,2023-07-31,1100.0000000,230146369,2023-07-30 14:16:36.750981+00,1586279891,813509,0
0,120894640,306487,830254,2,2023-07-30,1600.0000000,230146523,2023-07-30 14:16:36.750981+00,1586279386,813510,0
0,120894640,306487,830254,2,2023-07-31,1600.0000000,230146524,2023-07-30 14:16:36.750981+00,1586279861,813510,0
0,120894640,306487,830254,3,2023-07-30,1950.0000000,230146678,2023-07-30 14:16:36.750981+00,1586279357,813511,0
0,120894640,306487,830254,3,2023-07-31,1950.0000000,230146679,2023-07-30 14:16:36.750981+00,1586279831,813511,0
0,120894640,306491,830265,1,2023-07-30,1900.0000000,230146833,2023-07-30 14:16:36.750981+00,1586279473,813520,0
0,120894640,306491,830265,1,2023-07-31,1900.0000000,230146834,2023-07-30 14:16:36.750981+00,1586279951,813520,0
0,120894640,306491,830265,2,2023-07-30,1900.0000000,230146988,2023-07-30 14:16:36.750981+00,1586279444,813521,0
0,120894640,306491,830265,2,2023-07-31,1900.0000000,230146989,2023-07-30 14:16:36.750981+00,1586279921,813521,0
0,120894640,306536,830463,1,2023-07-30,2000.0000000,230147143,2023-07-30 14:16:36.750981+00,1586279589,813659,0
0,120894640,306536,830463,1,2023-07-31,2000.0000000,230147144,2023-07-30 14:16:36.750981+00,1586280071,813659,0
0,120894640,306536,830463,2,2023-07-30,2000.0000000,230147298,2023-07-30 14:16:36.750981+00,1586279560,813660,0
0,120894640,306536,830463,2,2023-07-31,2000.0000000,230147299,2023-07-30 14:16:36.750981+00,1586280041,813660,0
0,120894640,306536,830463,3,2023-07-30,2000.0000000,230147453,2023-07-30 14:16:36.750981+00,1586279531,813661,0
0,120894640,306536,830463,3,2023-07-31,2000.0000000,230147454,2023-07-30 14:16:36.750981+00,1586280011,813661,0
0,120894640,306536,830463,4,2023-07-30,2000.0000000,230147608,2023-07-30 14:16:36.750981+00,1586279502,813662,0
0,120894640,306536,830463,4,2023-07-31,2000.0000000,230147609,2023-07-30 14:16:36.750981+00,1586279981,813662,0
0,954493183,216176,461514,1,2023-07-30,5500.0000000,204562378,2023-07-30 14:16:36.750981+00,1183374851,548487,0
0,954493183,216176,461514,1,2023-07-31,5500.0000000,204562379,2023-07-30 14:16:36.750981+00,1183374855,548487,0
0,954493183,216176,461514,2,2023-07-30,5500.0000000,204562899,2023-07-30 14:16:36.750981+00,1183375018,548488,0
0,954493183,216176,461514,2,2023-07-31,5500.0000000,204562900,2023-07-30 14:16:36.750981+00,1183375021,548488,0
0,954493183,216312,462120,1,2023-07-30,4500.0000000,204563420,2023-07-30 14:16:36.750981+00,1183375244,548882,0
0,954493183,216312,462120,1,2023-07-31,4500.0000000,204563421,2023-07-30 14:16:36.750981+00,1183375245,548882,0
0,954493183,216312,462120,2,2023-07-30,4500.0000000,204563941,2023-07-30 14:16:36.750981+00,1183375142,548883,0
0,954493183,216312,462120,2,2023-07-31,4500.0000000,204563942,2023-07-30 14:16:36.750981+00,1183375145,548883,0
0,954493183,216439,462715,1,2023-07-30,3600.0000000,204564462,2023-07-30 14:16:36.750981+00,1183375449,549233,0
0,954493183,216439,462715,1,2023-07-31,3600.0000000,204564463,2023-07-30 14:16:36.750981+00,1183375451,549233,0
0,954493183,216439,462715,2,2023-07-30,3600.0000000,204564983,2023-07-30 14:16:36.750981+00,1183375337,549234,0
0,954493183,216439,462715,2,2023-07-31,3600.0000000,204564984,2023-07-30 14:16:36.750981+00,1183375341,549234,0
0,954493183,216441,462727,1,2023-07-30,3600.0000000,204565504,2023-07-30 14:16:36.750981+00,1183375594,549237,0
0,954493183,216441,462727,1,2023-07-31,3600.0000000,204565505,2023-07-30 14:16:36.750981+00,1183375598,549237,0
0,954493183,216441,462727,2,2023-07-30,3600.0000000,204566025,2023-07-30 14:16:36.750981+00,1183375729,549238,0
0,954493183,216441,462727,2,2023-07-31,3600.0000000,204566026,2023-07-30 14:16:36.750981+00,1183375732,549238,0
0,954493183,216442,462742,1,2023-07-30,3000.0000000,204566546,2023-07-30 14:16:36.750981+00,1183373103,549239,0
0,954493183,216442,462742,1,2023-07-31,3000.0000000,204566547,2023-07-30 14:16:36.750981+00,1183373107,549239,0
0,954493183,216442,462742,2,2023-07-30,3000.0000000,204567067,2023-07-30 14:16:36.750981+00,1183372939,549240,0
0,954493183,216442,462742,2,2023-07-31,3000.0000000,204567068,2023-07-30 14:16:36.750981+00,1183372942,549240,0
0,954493183,216462,462836,1,2023-07-30,810.0000000,204567588,2023-07-30 14:16:36.750981+00,1183373274,549302,0
0,954493183,216462,462836,1,2023-07-31,810.0000000,204567589,2023-07-30 14:16:36.750981+00,1183373277,549302,0
0,954493183,289707,762166,1,2023-07-30,2000.0000000,204568109,2023-07-30 14:16:36.750981+00,1183374685,763816,0
0,954493183,289707,762166,1,2023-07-31,2000.0000000,204568110,2023-07-30 14:16:36.750981+00,1183374690,763816,0
0,954493183,289707,762166,2,2023-07-30,2500.0000000,204568630,2023-07-30 14:16:36.750981+00,1183373464,763817,0
0,954493183,289707,762166,2,2023-07-31,2500.0000000,204568631,2023-07-30 14:16:36.750981+00,1183373467,763817,0
0,185647715,222578,489241,1,2023-07-30,3300.0000000,302101023,2023-07-30 14:16:36.750981+00,1401895960,567261,0
0,640725189,101742,203163,1,2023-08-01,2700.0000000,286017479,2023-07-30 14:16:36.750981+00,1403251616,257550,0
0,640725189,101742,203163,1,2023-08-02,2700.0000000,286017480,2023-07-30 14:16:36.750981+00,1404302246,257550,0
0,640725189,101742,203163,1,2023-08-03,2700.0000000,286017481,2023-07-30 14:16:36.750981+00,1405471662,257550,0
0,640725189,101742,203163,1,2023-08-04,2700.0000000,286017482,2023-07-30 14:16:36.750981+00,1406677101,257550,0
0,640725189,101742,203163,1,2023-08-05,2700.0000000,286017483,2023-07-30 14:16:36.750981+00,1407621363,257550,0
0,640725189,101742,203163,1,2023-08-06,2700.0000000,286017484,2023-07-30 14:16:36.750981+00,1408532966,257550,0
0,640725189,101742,203163,1,2023-08-07,2700.0000000,286017485,2023-07-30 14:16:36.750981+00,1409248611,257550,0
0,640725189,101742,203163,1,2023-08-08,2700.0000000,286017486,2023-07-30 14:16:36.750981+00,1409861546,257550,0
0,640725189,101742,203163,1,2023-08-09,2700.0000000,286017487,2023-07-30 14:16:36.750981+00,1410801637,257550,0
0,640725189,101742,203163,1,2023-08-10,2700.0000000,286017488,2023-07-30 14:16:36.750981+00,1411840671,257550,0
0,640725189,101742,203163,1,2023-08-11,2700.0000000,286017489,2023-07-30 14:16:36.750981+00,1412852354,257550,0
0,640725189,101742,203163,1,2023-08-12,2700.0000000,286017490,2023-07-30 14:16:36.750981+00,1413988755,257550,0
0,640725189,101742,203163,1,2023-08-13,2700.0000000,286017491,2023-07-30 14:16:36.750981+00,1414738233,257550,0
0,640725189,101742,203163,1,2023-08-14,2700.0000000,286017492,2023-07-30 14:16:36.750981+00,1415333532,257550,0
0,640725189,101742,203163,1,2023-08-15,2700.0000000,286017493,2023-07-30 14:16:36.750981+00,1415991454,257550,0
0,640725189,101742,203163,1,2023-08-16,2700.0000000,286017494,2023-07-30 14:16:36.750981+00,1417133229,257550,0
0,640725189,101742,203163,1,2023-08-17,2700.0000000,286017495,2023-07-30 14:16:36.750981+00,1417827139,257550,0
0,640725189,101742,203163,1,2023-08-18,2700.0000000,286017496,2023-07-30 14:16:36.750981+00,1418815182,257550,0
0,640725189,101742,203163,1,2023-08-19,2700.0000000,286017497,2023-07-30 14:16:36.750981+00,1420121236,257550,0
0,640725189,101742,203163,1,2023-08-20,2700.0000000,286017498,2023-07-30 14:16:36.750981+00,1421302951,257550,0
0,640725189,101742,203163,1,2023-08-21,2700.0000000,286017499,2023-07-30 14:16:36.750981+00,1421893783,257550,0
0,640725189,101742,203163,1,2023-08-22,2700.0000000,286017500,2023-07-30 14:16:36.750981+00,1422574736,257550,0
0,640725189,101742,203163,1,2023-08-23,2700.0000000,286017501,2023-07-30 14:16:36.750981+00,1423641864,257550,0
0,640725189,101742,203163,1,2023-08-24,2700.0000000,286017502,2023-07-30 14:16:36.750981+00,1425001752,257550,0
0,640725189,101742,203163,1,2023-08-25,2700.0000000,286017503,2023-07-30 14:16:36.750981+00,1426189082,257550,0
0,640725189,101742,203163,1,2023-08-26,2700.0000000,286017504,2023-07-30 14:16:36.750981+00,1426909542,257550,0
0,640725189,101742,203163,1,2023-08-27,2700.0000000,286017505,2023-07-30 14:16:36.750981+00,1427745853,257550,0
0,640725189,101742,203163,1,2023-08-28,2700.0000000,286017506,2023-07-30 14:16:36.750981+00,1428251161,257550,0
0,640725189,101742,203163,1,2023-08-29,2700.0000000,286017507,2023-07-30 14:16:36.750981+00,1429371327,257550,0
0,640725189,101742,203163,1,2023-08-30,2700.0000000,286017508,2023-07-30 14:16:36.750981+00,1430351705,257550,0
0,640725189,101742,203163,1,2023-08-31,2700.0000000,286017509,2023-07-30 14:16:36.750981+00,1431233924,257550,0
0,640725189,101742,549736,1,2023-08-01,2350.0000000,286017634,2023-07-30 14:16:36.750981+00,1403251631,257550,0
0,640725189,101742,549736,1,2023-08-02,2350.0000000,286017635,2023-07-30 14:16:36.750981+00,1404302253,257550,0
0,640725189,101742,549736,1,2023-08-03,2350.0000000,286017636,2023-07-30 14:16:36.750981+00,1405471669,257550,0
0,640725189,101742,549736,1,2023-08-04,2350.0000000,286017637,2023-07-30 14:16:36.750981+00,1406677108,257550,0
0,640725189,101742,549736,1,2023-08-05,2350.0000000,286017638,2023-07-30 14:16:36.750981+00,1407621370,257550,0
0,640725189,101742,549736,1,2023-08-06,2350.0000000,286017639,2023-07-30 14:16:36.750981+00,1408532973,257550,0
0,640725189,101742,549736,1,2023-08-07,2350.0000000,286017640,2023-07-30 14:16:36.750981+00,1409248618,257550,0
0,640725189,101742,549736,1,2023-08-08,2350.0000000,286017641,2023-07-30 14:16:36.750981+00,1409861553,257550,0
0,640725189,101742,549736,1,2023-08-09,2350.0000000,286017642,2023-07-30 14:16:36.750981+00,1410801644,257550,0
0,640725189,101742,549736,1,2023-08-10,2350.0000000,286017643,2023-07-30 14:16:36.750981+00,1411840678,257550,0
0,640725189,101742,549736,1,2023-08-11,2350.0000000,286017644,2023-07-30 14:16:36.750981+00,1412852362,257550,0
0,640725189,101742,549736,1,2023-08-12,2350.0000000,286017645,2023-07-30 14:16:36.750981+00,1413988762,257550,0
0,640725189,101742,549736,1,2023-08-13,2350.0000000,286017646,2023-07-30 14:16:36.750981+00,1414738251,257550,0
0,640725189,101742,549736,1,2023-08-14,2350.0000000,286017647,2023-07-30 14:16:36.750981+00,1415333539,257550,0
0,640725189,101742,549736,1,2023-08-15,2350.0000000,286017648,2023-07-30 14:16:36.750981+00,1415991461,257550,0
0,640725189,101742,549736,1,2023-08-16,2350.0000000,286017649,2023-07-30 14:16:36.750981+00,1417133255,257550,0
0,640725189,101742,549736,1,2023-08-17,2350.0000000,286017650,2023-07-30 14:16:36.750981+00,1417827146,257550,0
0,640725189,101742,549736,1,2023-08-18,2350.0000000,286017651,2023-07-30 14:16:36.750981+00,1418815189,257550,0
0,640725189,101742,549736,1,2023-08-19,2350.0000000,286017652,2023-07-30 14:16:36.750981+00,1420121243,257550,0
0,640725189,101742,549736,1,2023-08-20,2350.0000000,286017653,2023-07-30 14:16:36.750981+00,1421302958,257550,0
0,640725189,101742,549736,1,2023-08-21,2350.0000000,286017654,2023-07-30 14:16:36.750981+00,1421893790,257550,0
0,640725189,101742,549736,1,2023-08-22,2350.0000000,286017655,2023-07-30 14:16:36.750981+00,1422574743,257550,0
0,640725189,101742,549736,1,2023-08-23,2350.0000000,286017656,2023-07-30 14:16:36.750981+00,1423641871,257550,0
0,640725189,101742,549736,1,2023-08-24,2350.0000000,286017657,2023-07-30 14:16:36.750981+00,1425001759,257550,0
0,640725189,101742,549736,1,2023-08-25,2350.0000000,286017658,2023-07-30 14:16:36.750981+00,1426189089,257550,0
0,640725189,101742,549736,1,2023-08-26,2350.0000000,286017659,2023-07-30 14:16:36.750981+00,1426909549,257550,0
0,640725189,101742,549736,1,2023-08-27,2350.0000000,286017660,2023-07-30 14:16:36.750981+00,1427745860,257550,0
0,640725189,101742,549736,1,2023-08-28,2350.0000000,286017661,2023-07-30 14:16:36.750981+00,1428251168,257550,0
0,640725189,101742,549736,1,2023-08-29,2350.0000000,286017662,2023-07-30 14:16:36.750981+00,1429371334,257550,0
0,640725189,101742,549736,1,2023-08-30,2350.0000000,286017663,2023-07-30 14:16:36.750981+00,1430351712,257550,0
0,640725189,101742,549736,1,2023-08-31,2350.0000000,286017664,2023-07-30 14:16:36.750981+00,1431233931,257550,0
0,640725189,101743,203164,1,2023-08-01,3350.0000000,286017789,2023-07-30 14:16:36.750981+00,1403251618,257551,0
0,640725189,101743,203164,1,2023-08-02,3350.0000000,286017790,2023-07-30 14:16:36.750981+00,1404302247,257551,0
0,640725189,101743,203164,1,2023-08-03,3350.0000000,286017791,2023-07-30 14:16:36.750981+00,1405471663,257551,0
0,640725189,101743,203164,1,2023-08-04,3350.0000000,286017792,2023-07-30 14:16:36.750981+00,1406677102,257551,0
0,640725189,101743,203164,1,2023-08-05,3350.0000000,286017793,2023-07-30 14:16:36.750981+00,1407621364,257551,0
0,640725189,101743,203164,1,2023-08-06,3350.0000000,286017794,2023-07-30 14:16:36.750981+00,1408532967,257551,0
0,640725189,101743,203164,1,2023-08-07,3350.0000000,286017795,2023-07-30 14:16:36.750981+00,1409248612,257551,0
0,640725189,101743,203164,1,2023-08-08,3350.0000000,286017796,2023-07-30 14:16:36.750981+00,1409861547,257551,0
0,640725189,101743,203164,1,2023-08-09,3350.0000000,286017797,2023-07-30 14:16:36.750981+00,1410801638,257551,0
0,640725189,101743,203164,1,2023-08-10,3350.0000000,286017798,2023-07-30 14:16:36.750981+00,1411840672,257551,0
0,640725189,101743,203164,1,2023-08-11,3350.0000000,286017799,2023-07-30 14:16:36.750981+00,1412852355,257551,0
0,640725189,101743,203164,1,2023-08-12,3350.0000000,286017800,2023-07-30 14:16:36.750981+00,1413988756,257551,0
0,640725189,101743,203164,1,2023-08-13,3350.0000000,286017801,2023-07-30 14:16:36.750981+00,1414738235,257551,0
0,640725189,101743,203164,1,2023-08-14,3350.0000000,286017802,2023-07-30 14:16:36.750981+00,1415333533,257551,0
0,640725189,101743,203164,1,2023-08-15,3350.0000000,286017803,2023-07-30 14:16:36.750981+00,1415991455,257551,0
0,640725189,101743,203164,1,2023-08-16,3350.0000000,286017804,2023-07-30 14:16:36.750981+00,1417133235,257551,0
0,640725189,101743,203164,1,2023-08-17,3350.0000000,286017805,2023-07-30 14:16:36.750981+00,1417827140,257551,0
0,640725189,101743,203164,1,2023-08-18,3350.0000000,286017806,2023-07-30 14:16:36.750981+00,1418815183,257551,0
0,640725189,101743,203164,1,2023-08-19,3350.0000000,286017807,2023-07-30 14:16:36.750981+00,1420121237,257551,0
0,640725189,101743,203164,1,2023-08-20,3350.0000000,286017808,2023-07-30 14:16:36.750981+00,1421302952,257551,0
0,640725189,101743,203164,1,2023-08-21,3350.0000000,286017809,2023-07-30 14:16:36.750981+00,1421893784,257551,0
0,640725189,101743,203164,1,2023-08-22,3350.0000000,286017810,2023-07-30 14:16:36.750981+00,1422574737,257551,0
0,640725189,101743,203164,1,2023-08-23,3350.0000000,286017811,2023-07-30 14:16:36.750981+00,1423641865,257551,0
0,640725189,101743,203164,1,2023-08-24,3350.0000000,286017812,2023-07-30 14:16:36.750981+00,1425001753,257551,0
0,640725189,101743,203164,1,2023-08-25,3350.0000000,286017813,2023-07-30 14:16:36.750981+00,1426189083,257551,0
0,640725189,101743,203164,1,2023-08-26,3350.0000000,286017814,2023-07-30 14:16:36.750981+00,1426909543,257551,0
0,640725189,101743,203164,1,2023-08-27,3350.0000000,286017815,2023-07-30 14:16:36.750981+00,1427745854,257551,0
0,640725189,101743,203164,1,2023-08-28,3350.0000000,286017816,2023-07-30 14:16:36.750981+00,1428251162,257551,0
0,640725189,101743,203164,1,2023-08-29,3350.0000000,286017817,2023-07-30 14:16:36.750981+00,1429371328,257551,0
0,640725189,101743,203164,1,2023-08-30,3350.0000000,286017818,2023-07-30 14:16:36.750981+00,1430351706,257551,0
0,640725189,101743,203164,1,2023-08-31,3350.0000000,286017819,2023-07-30 14:16:36.750981+00,1431233925,257551,0
0,640725189,101743,549737,1,2023-08-01,3000.0000000,286017944,2023-07-30 14:16:36.750981+00,1403251632,257551,0
0,640725189,101743,549737,1,2023-08-02,3000.0000000,286017945,2023-07-30 14:16:36.750981+00,1404302254,257551,0
0,640725189,101743,549737,1,2023-08-03,3000.0000000,286017946,2023-07-30 14:16:36.750981+00,1405471670,257551,0
0,640725189,101743,549737,1,2023-08-04,3000.0000000,286017947,2023-07-30 14:16:36.750981+00,1406677109,257551,0
0,640725189,101743,549737,1,2023-08-05,3000.0000000,286017948,2023-07-30 14:16:36.750981+00,1407621371,257551,0
0,640725189,101743,549737,1,2023-08-06,3000.0000000,286017949,2023-07-30 14:16:36.750981+00,1408532974,257551,0
0,640725189,101743,549737,1,2023-08-07,3000.0000000,286017950,2023-07-30 14:16:36.750981+00,1409248619,257551,0
0,640725189,101743,549737,1,2023-08-08,3000.0000000,286017951,2023-07-30 14:16:36.750981+00,1409861554,257551,0
0,640725189,101743,549737,1,2023-08-09,3000.0000000,286017952,2023-07-30 14:16:36.750981+00,1410801645,257551,0
0,640725189,101743,549737,1,2023-08-10,3000.0000000,286017953,2023-07-30 14:16:36.750981+00,1411840679,257551,0
0,640725189,101743,549737,1,2023-08-11,3000.0000000,286017954,2023-07-30 14:16:36.750981+00,1412852363,257551,0
0,640725189,101743,549737,1,2023-08-12,3000.0000000,286017955,2023-07-30 14:16:36.750981+00,1413988763,257551,0
0,640725189,101743,549737,1,2023-08-13,3000.0000000,286017956,2023-07-30 14:16:36.750981+00,1414738253,257551,0
0,640725189,101743,549737,1,2023-08-14,3000.0000000,286017957,2023-07-30 14:16:36.750981+00,1415333540,257551,0
0,640725189,101743,549737,1,2023-08-15,3000.0000000,286017958,2023-07-30 14:16:36.750981+00,1415991462,257551,0
0,640725189,101743,549737,1,2023-08-16,3000.0000000,286017959,2023-07-30 14:16:36.750981+00,1417133258,257551,0
0,640725189,101743,549737,1,2023-08-17,3000.0000000,286017960,2023-07-30 14:16:36.750981+00,1417827147,257551,0
0,640725189,101743,549737,1,2023-08-18,3000.0000000,286017961,2023-07-30 14:16:36.750981+00,1418815190,257551,0
0,640725189,101743,549737,1,2023-08-19,3000.0000000,286017962,2023-07-30 14:16:36.750981+00,1420121244,257551,0
0,640725189,101743,549737,1,2023-08-20,3000.0000000,286017963,2023-07-30 14:16:36.750981+00,1421302959,257551,0
0,640725189,101743,549737,1,2023-08-21,3000.0000000,286017964,2023-07-30 14:16:36.750981+00,1421893791,257551,0
0,640725189,101743,549737,1,2023-08-22,3000.0000000,286017965,2023-07-30 14:16:36.750981+00,1422574744,257551,0
0,640725189,101743,549737,1,2023-08-23,3000.0000000,286017966,2023-07-30 14:16:36.750981+00,1423641872,257551,0
0,640725189,101743,549737,1,2023-08-24,3000.0000000,286017967,2023-07-30 14:16:36.750981+00,1425001760,257551,0
0,640725189,101743,549737,1,2023-08-25,3000.0000000,286017968,2023-07-30 14:16:36.750981+00,1426189090,257551,0
0,640725189,101743,549737,1,2023-08-26,3000.0000000,286017969,2023-07-30 14:16:36.750981+00,1426909550,257551,0
0,640725189,101743,549737,1,2023-08-27,3000.0000000,286017970,2023-07-30 14:16:36.750981+00,1427745861,257551,0
0,640725189,101743,549737,1,2023-08-28,3000.0000000,286017971,2023-07-30 14:16:36.750981+00,1428251169,257551,0
0,640725189,101743,549737,1,2023-08-29,3000.0000000,286017972,2023-07-30 14:16:36.750981+00,1429371335,257551,0
0,640725189,101743,549737,1,2023-08-30,3000.0000000,286017973,2023-07-30 14:16:36.750981+00,1430351713,257551,0
0,640725189,101743,549737,1,2023-08-31,3000.0000000,286017974,2023-07-30 14:16:36.750981+00,1431233932,257551,0
0,640725189,101744,203165,2,2023-08-01,3950.0000000,286018099,2023-07-30 14:16:36.750981+00,1403251621,257553,0
0,640725189,101744,203165,2,2023-08-02,3950.0000000,286018100,2023-07-30 14:16:36.750981+00,1404302248,257553,0
0,640725189,101744,203165,2,2023-08-03,3950.0000000,286018101,2023-07-30 14:16:36.750981+00,1405471664,257553,0
0,640725189,101744,203165,2,2023-08-04,3950.0000000,286018102,2023-07-30 14:16:36.750981+00,1406677103,257553,0
0,640725189,101744,203165,2,2023-08-05,3950.0000000,286018103,2023-07-30 14:16:36.750981+00,1407621365,257553,0
0,640725189,101744,203165,2,2023-08-06,3950.0000000,286018104,2023-07-30 14:16:36.750981+00,1408532968,257553,0
0,640725189,101744,203165,2,2023-08-07,3950.0000000,286018105,2023-07-30 14:16:36.750981+00,1409248613,257553,0
0,640725189,101744,203165,2,2023-08-08,3950.0000000,286018106,2023-07-30 14:16:36.750981+00,1409861548,257553,0
0,640725189,101744,203165,2,2023-08-09,3950.0000000,286018107,2023-07-30 14:16:36.750981+00,1410801639,257553,0
0,640725189,101744,203165,2,2023-08-10,3950.0000000,286018108,2023-07-30 14:16:36.750981+00,1411840673,257553,0
0,640725189,101744,203165,2,2023-08-11,3950.0000000,286018109,2023-07-30 14:16:36.750981+00,1412852356,257553,0
0,640725189,101744,203165,2,2023-08-12,3950.0000000,286018110,2023-07-30 14:16:36.750981+00,1413988757,257553,0
0,640725189,101744,203165,2,2023-08-13,3950.0000000,286018111,2023-07-30 14:16:36.750981+00,1414738238,257553,0
0,640725189,101744,203165,2,2023-08-14,3950.0000000,286018112,2023-07-30 14:16:36.750981+00,1415333534,257553,0
0,640725189,101744,203165,2,2023-08-15,3950.0000000,286018113,2023-07-30 14:16:36.750981+00,1415991456,257553,0
0,640725189,101744,203165,2,2023-08-16,3950.0000000,286018114,2023-07-30 14:16:36.750981+00,1417133238,257553,0
0,640725189,101744,203165,2,2023-08-17,3950.0000000,286018115,2023-07-30 14:16:36.750981+00,1417827141,257553,0
0,640725189,101744,203165,2,2023-08-18,3950.0000000,286018116,2023-07-30 14:16:36.750981+00,1418815184,257553,0
0,640725189,101744,203165,2,2023-08-19,3950.0000000,286018117,2023-07-30 14:16:36.750981+00,1420121238,257553,0
0,640725189,101744,203165,2,2023-08-20,3950.0000000,286018118,2023-07-30 14:16:36.750981+00,1421302953,257553,0
0,640725189,101744,203165,2,2023-08-21,3950.0000000,286018119,2023-07-30 14:16:36.750981+00,1421893785,257553,0
0,640725189,101744,203165,2,2023-08-22,3950.0000000,286018120,2023-07-30 14:16:36.750981+00,1422574738,257553,0
0,640725189,101744,203165,2,2023-08-23,3950.0000000,286018121,2023-07-30 14:16:36.750981+00,1423641866,257553,0
0,640725189,101744,203165,2,2023-08-24,3950.0000000,286018122,2023-07-30 14:16:36.750981+00,1425001754,257553,0
0,640725189,101744,203165,2,2023-08-25,3950.0000000,286018123,2023-07-30 14:16:36.750981+00,1426189084,257553,0
0,640725189,101744,203165,2,2023-08-26,3950.0000000,286018124,2023-07-30 14:16:36.750981+00,1426909544,257553,0
0,640725189,101744,203165,2,2023-08-27,3950.0000000,286018125,2023-07-30 14:16:36.750981+00,1427745855,257553,0
0,640725189,101744,203165,2,2023-08-28,3950.0000000,286018126,2023-07-30 14:16:36.750981+00,1428251163,257553,0
0,640725189,101744,203165,2,2023-08-29,3950.0000000,286018127,2023-07-30 14:16:36.750981+00,1429371329,257553,0
0,640725189,101744,203165,2,2023-08-30,3950.0000000,286018128,2023-07-30 14:16:36.750981+00,1430351707,257553,0
0,640725189,101744,203165,2,2023-08-31,3950.0000000,286018129,2023-07-30 14:16:36.750981+00,1431233926,257553,0
0,640725189,101744,549738,2,2023-08-01,3250.0000000,286018254,2023-07-30 14:16:36.750981+00,1403251633,257553,0
0,640725189,101744,549738,2,2023-08-02,3250.0000000,286018255,2023-07-30 14:16:36.750981+00,1404302255,257553,0
0,640725189,101744,549738,2,2023-08-03,3250.0000000,286018256,2023-07-30 14:16:36.750981+00,1405471671,257553,0
0,640725189,101744,549738,2,2023-08-04,3250.0000000,286018257,2023-07-30 14:16:36.750981+00,1406677110,257553,0
0,640725189,101744,549738,2,2023-08-05,3250.0000000,286018258,2023-07-30 14:16:36.750981+00,1407621372,257553,0
0,640725189,101744,549738,2,2023-08-06,3250.0000000,286018259,2023-07-30 14:16:36.750981+00,1408532975,257553,0
0,640725189,101744,549738,2,2023-08-07,3250.0000000,286018260,2023-07-30 14:16:36.750981+00,1409248620,257553,0
0,640725189,101744,549738,2,2023-08-08,3250.0000000,286018261,2023-07-30 14:16:36.750981+00,1409861555,257553,0
0,640725189,101744,549738,2,2023-08-09,3250.0000000,286018262,2023-07-30 14:16:36.750981+00,1410801646,257553,0
0,640725189,101744,549738,2,2023-08-10,3250.0000000,286018263,2023-07-30 14:16:36.750981+00,1411840680,257553,0
0,640725189,101744,549738,2,2023-08-11,3250.0000000,286018264,2023-07-30 14:16:36.750981+00,1412852365,257553,0
0,640725189,101744,549738,2,2023-08-12,3250.0000000,286018265,2023-07-30 14:16:36.750981+00,1413988764,257553,0
0,640725189,101744,549738,2,2023-08-13,3250.0000000,286018266,2023-07-30 14:16:36.750981+00,1414738255,257553,0
0,640725189,101744,549738,2,2023-08-14,3250.0000000,286018267,2023-07-30 14:16:36.750981+00,1415333541,257553,0
0,640725189,101744,549738,2,2023-08-15,3250.0000000,286018268,2023-07-30 14:16:36.750981+00,1415991463,257553,0
0,640725189,101744,549738,2,2023-08-16,3250.0000000,286018269,2023-07-30 14:16:36.750981+00,1417133261,257553,0
0,640725189,101744,549738,2,2023-08-17,3250.0000000,286018270,2023-07-30 14:16:36.750981+00,1417827148,257553,0
0,640725189,101744,549738,2,2023-08-18,3250.0000000,286018271,2023-07-30 14:16:36.750981+00,1418815191,257553,0
0,640725189,101744,549738,2,2023-08-19,3250.0000000,286018272,2023-07-30 14:16:36.750981+00,1420121245,257553,0
0,640725189,101744,549738,2,2023-08-20,3250.0000000,286018273,2023-07-30 14:16:36.750981+00,1421302960,257553,0
0,640725189,101744,549738,2,2023-08-21,3250.0000000,286018274,2023-07-30 14:16:36.750981+00,1421893792,257553,0
0,640725189,101744,549738,2,2023-08-22,3250.0000000,286018275,2023-07-30 14:16:36.750981+00,1422574745,257553,0
0,640725189,101744,549738,2,2023-08-23,3250.0000000,286018276,2023-07-30 14:16:36.750981+00,1423641873,257553,0
0,640725189,101744,549738,2,2023-08-24,3250.0000000,286018277,2023-07-30 14:16:36.750981+00,1425001761,257553,0
0,640725189,101744,549738,2,2023-08-25,3250.0000000,286018278,2023-07-30 14:16:36.750981+00,1426189091,257553,0
0,640725189,101744,549738,2,2023-08-26,3250.0000000,286018279,2023-07-30 14:16:36.750981+00,1426909551,257553,0
0,640725189,101744,549738,2,2023-08-27,3250.0000000,286018280,2023-07-30 14:16:36.750981+00,1427745862,257553,0
0,640725189,101744,549738,2,2023-08-28,3250.0000000,286018281,2023-07-30 14:16:36.750981+00,1428251170,257553,0
0,640725189,101744,549738,2,2023-08-29,3250.0000000,286018282,2023-07-30 14:16:36.750981+00,1429371336,257553,0
0,640725189,101744,549738,2,2023-08-30,3250.0000000,286018283,2023-07-30 14:16:36.750981+00,1430351714,257553,0
0,640725189,101744,549738,2,2023-08-31,3250.0000000,286018284,2023-07-30 14:16:36.750981+00,1431233933,257553,0
0,640725189,101745,203166,1,2023-08-01,3650.0000000,286018409,2023-07-30 14:16:36.750981+00,1403251623,257557,0
0,640725189,101745,203166,1,2023-08-02,3650.0000000,286018410,2023-07-30 14:16:36.750981+00,1404302249,257557,0
0,640725189,101745,203166,1,2023-08-03,3650.0000000,286018411,2023-07-30 14:16:36.750981+00,1405471665,257557,0
0,640725189,101745,203166,1,2023-08-04,3650.0000000,286018412,2023-07-30 14:16:36.750981+00,1406677104,257557,0
0,640725189,101745,203166,1,2023-08-05,3650.0000000,286018413,2023-07-30 14:16:36.750981+00,1407621366,257557,0
0,640725189,101745,203166,1,2023-08-06,3650.0000000,286018414,2023-07-30 14:16:36.750981+00,1408532969,257557,0
0,640725189,101745,203166,1,2023-08-07,3650.0000000,286018415,2023-07-30 14:16:36.750981+00,1409248614,257557,0
0,640725189,101745,203166,1,2023-08-08,3650.0000000,286018416,2023-07-30 14:16:36.750981+00,1409861549,257557,0
0,640725189,101745,203166,1,2023-08-09,3650.0000000,286018417,2023-07-30 14:16:36.750981+00,1410801640,257557,0
0,640725189,101745,203166,1,2023-08-10,3650.0000000,286018418,2023-07-30 14:16:36.750981+00,1411840674,257557,0
0,640725189,101745,203166,1,2023-08-11,3650.0000000,286018419,2023-07-30 14:16:36.750981+00,1412852357,257557,0
0,640725189,101745,203166,1,2023-08-12,3650.0000000,286018420,2023-07-30 14:16:36.750981+00,1413988758,257557,0
0,640725189,101745,203166,1,2023-08-13,3650.0000000,286018421,2023-07-30 14:16:36.750981+00,1414738241,257557,0
0,640725189,101745,203166,1,2023-08-14,3650.0000000,286018422,2023-07-30 14:16:36.750981+00,1415333535,257557,0
0,640725189,101745,203166,1,2023-08-15,3650.0000000,286018423,2023-07-30 14:16:36.750981+00,1415991457,257557,0
0,640725189,101745,203166,1,2023-08-16,3650.0000000,286018424,2023-07-30 14:16:36.750981+00,1417133242,257557,0
0,640725189,101745,203166,1,2023-08-17,3650.0000000,286018425,2023-07-30 14:16:36.750981+00,1417827142,257557,0
0,640725189,101745,203166,1,2023-08-18,3650.0000000,286018426,2023-07-30 14:16:36.750981+00,1418815185,257557,0
0,640725189,101745,203166,1,2023-08-19,3650.0000000,286018427,2023-07-30 14:16:36.750981+00,1420121239,257557,0
0,640725189,101745,203166,1,2023-08-20,3650.0000000,286018428,2023-07-30 14:16:36.750981+00,1421302954,257557,0
0,640725189,101745,203166,1,2023-08-21,3650.0000000,286018429,2023-07-30 14:16:36.750981+00,1421893786,257557,0
0,640725189,101745,203166,1,2023-08-22,3650.0000000,286018430,2023-07-30 14:16:36.750981+00,1422574739,257557,0
0,640725189,101745,203166,1,2023-08-23,3650.0000000,286018431,2023-07-30 14:16:36.750981+00,1423641867,257557,0
0,640725189,101745,203166,1,2023-08-24,3650.0000000,286018432,2023-07-30 14:16:36.750981+00,1425001755,257557,0
0,640725189,101745,203166,1,2023-08-25,3650.0000000,286018433,2023-07-30 14:16:36.750981+00,1426189085,257557,0
0,640725189,101745,203166,1,2023-08-26,3650.0000000,286018434,2023-07-30 14:16:36.750981+00,1426909545,257557,0
0,640725189,101745,203166,1,2023-08-27,3650.0000000,286018435,2023-07-30 14:16:36.750981+00,1427745856,257557,0
0,640725189,101745,203166,1,2023-08-28,3650.0000000,286018436,2023-07-30 14:16:36.750981+00,1428251164,257557,0
0,640725189,101745,203166,1,2023-08-29,3650.0000000,286018437,2023-07-30 14:16:36.750981+00,1429371330,257557,0
0,640725189,101745,203166,1,2023-08-30,3650.0000000,286018438,2023-07-30 14:16:36.750981+00,1430351708,257557,0
0,640725189,101745,203166,1,2023-08-31,3650.0000000,286018439,2023-07-30 14:16:36.750981+00,1431233927,257557,0
0,640725189,101745,203166,2,2023-08-01,4400.0000000,286018564,2023-07-30 14:16:36.750981+00,1403251627,257558,0
0,640725189,101745,203166,2,2023-08-02,4400.0000000,286018565,2023-07-30 14:16:36.750981+00,1404302250,257558,0
0,640725189,101745,203166,2,2023-08-03,4400.0000000,286018566,2023-07-30 14:16:36.750981+00,1405471666,257558,0
0,640725189,101745,203166,2,2023-08-04,4400.0000000,286018567,2023-07-30 14:16:36.750981+00,1406677105,257558,0
0,640725189,101745,203166,2,2023-08-05,4400.0000000,286018568,2023-07-30 14:16:36.750981+00,1407621367,257558,0
0,640725189,101745,203166,2,2023-08-06,4400.0000000,286018569,2023-07-30 14:16:36.750981+00,1408532970,257558,0
0,640725189,101745,203166,2,2023-08-07,4400.0000000,286018570,2023-07-30 14:16:36.750981+00,1409248615,257558,0
0,640725189,101745,203166,2,2023-08-08,4400.0000000,286018571,2023-07-30 14:16:36.750981+00,1409861550,257558,0
0,640725189,101745,203166,2,2023-08-09,4400.0000000,286018572,2023-07-30 14:16:36.750981+00,1410801641,257558,0
0,640725189,101745,203166,2,2023-08-10,4400.0000000,286018573,2023-07-30 14:16:36.750981+00,1411840675,257558,0
0,640725189,101745,203166,2,2023-08-11,4400.0000000,286018574,2023-07-30 14:16:36.750981+00,1412852358,257558,0
0,640725189,101745,203166,2,2023-08-12,4400.0000000,286018575,2023-07-30 14:16:36.750981+00,1413988759,257558,0
0,640725189,101745,203166,2,2023-08-13,4400.0000000,286018576,2023-07-30 14:16:36.750981+00,1414738244,257558,0
0,640725189,101745,203166,2,2023-08-14,4400.0000000,286018577,2023-07-30 14:16:36.750981+00,1415333536,257558,0
0,640725189,101745,203166,2,2023-08-15,4400.0000000,286018578,2023-07-30 14:16:36.750981+00,1415991458,257558,0
0,640725189,101745,203166,2,2023-08-16,4400.0000000,286018579,2023-07-30 14:16:36.750981+00,1417133246,257558,0
0,640725189,101745,203166,2,2023-08-17,4400.0000000,286018580,2023-07-30 14:16:36.750981+00,1417827143,257558,0
0,640725189,101745,203166,2,2023-08-18,4400.0000000,286018581,2023-07-30 14:16:36.750981+00,1418815186,257558,0
0,640725189,101745,203166,2,2023-08-19,4400.0000000,286018582,2023-07-30 14:16:36.750981+00,1420121240,257558,0
0,640725189,101745,203166,2,2023-08-20,4400.0000000,286018583,2023-07-30 14:16:36.750981+00,1421302955,257558,0
0,640725189,101745,203166,2,2023-08-21,4400.0000000,286018584,2023-07-30 14:16:36.750981+00,1421893787,257558,0
0,640725189,101745,203166,2,2023-08-22,4400.0000000,286018585,2023-07-30 14:16:36.750981+00,1422574740,257558,0
0,640725189,101745,203166,2,2023-08-23,4400.0000000,286018586,2023-07-30 14:16:36.750981+00,1423641868,257558,0
0,640725189,101745,203166,2,2023-08-24,4400.0000000,286018587,2023-07-30 14:16:36.750981+00,1425001756,257558,0
0,640725189,101745,203166,2,2023-08-25,4400.0000000,286018588,2023-07-30 14:16:36.750981+00,1426189086,257558,0
0,640725189,101745,203166,2,2023-08-26,4400.0000000,286018589,2023-07-30 14:16:36.750981+00,1426909546,257558,0
0,640725189,101745,203166,2,2023-08-27,4400.0000000,286018590,2023-07-30 14:16:36.750981+00,1427745857,257558,0
0,640725189,101745,203166,2,2023-08-28,4400.0000000,286018591,2023-07-30 14:16:36.750981+00,1428251165,257558,0
0,640725189,101745,203166,2,2023-08-29,4400.0000000,286018592,2023-07-30 14:16:36.750981+00,1429371331,257558,0
0,640725189,101745,203166,2,2023-08-30,4400.0000000,286018593,2023-07-30 14:16:36.750981+00,1430351709,257558,0
0,640725189,101745,203166,2,2023-08-31,4400.0000000,286018594,2023-07-30 14:16:36.750981+00,1431233928,257558,0
0,640725189,101745,549739,1,2023-08-01,3300.0000000,286018719,2023-07-30 14:16:36.750981+00,1403251635,257557,0
0,640725189,101745,549739,1,2023-08-02,3300.0000000,286018720,2023-07-30 14:16:36.750981+00,1404302257,257557,0
0,640725189,101745,549739,1,2023-08-03,3300.0000000,286018721,2023-07-30 14:16:36.750981+00,1405471673,257557,0
0,640725189,101745,549739,1,2023-08-04,3300.0000000,286018722,2023-07-30 14:16:36.750981+00,1406677112,257557,0
0,640725189,101745,549739,1,2023-08-05,3300.0000000,286018723,2023-07-30 14:16:36.750981+00,1407621374,257557,0
0,640725189,101745,549739,1,2023-08-06,3300.0000000,286018724,2023-07-30 14:16:36.750981+00,1408532977,257557,0
0,640725189,101745,549739,1,2023-08-07,3300.0000000,286018725,2023-07-30 14:16:36.750981+00,1409248622,257557,0
0,640725189,101745,549739,1,2023-08-08,3300.0000000,286018726,2023-07-30 14:16:36.750981+00,1409861557,257557,0
0,640725189,101745,549739,1,2023-08-09,3300.0000000,286018727,2023-07-30 14:16:36.750981+00,1410801648,257557,0
0,640725189,101745,549739,1,2023-08-10,3300.0000000,286018728,2023-07-30 14:16:36.750981+00,1411840682,257557,0
0,640725189,101745,549739,1,2023-08-11,3300.0000000,286018729,2023-07-30 14:16:36.750981+00,1412852368,257557,0
0,640725189,101745,549739,1,2023-08-12,3300.0000000,286018730,2023-07-30 14:16:36.750981+00,1413988766,257557,0
0,640725189,101745,549739,1,2023-08-13,3300.0000000,286018731,2023-07-30 14:16:36.750981+00,1414738261,257557,0
0,640725189,101745,549739,1,2023-08-14,3300.0000000,286018732,2023-07-30 14:16:36.750981+00,1415333543,257557,0
0,640725189,101745,549739,1,2023-08-15,3300.0000000,286018733,2023-07-30 14:16:36.750981+00,1415991465,257557,0
0,640725189,101745,549739,1,2023-08-16,3300.0000000,286018734,2023-07-30 14:16:36.750981+00,1417133267,257557,0
0,640725189,101745,549739,1,2023-08-17,3300.0000000,286018735,2023-07-30 14:16:36.750981+00,1417827150,257557,0
0,640725189,101745,549739,1,2023-08-18,3300.0000000,286018736,2023-07-30 14:16:36.750981+00,1418815193,257557,0
0,640725189,101745,549739,1,2023-08-19,3300.0000000,286018737,2023-07-30 14:16:36.750981+00,1420121247,257557,0
0,640725189,101745,549739,1,2023-08-20,3300.0000000,286018738,2023-07-30 14:16:36.750981+00,1421302962,257557,0
0,640725189,101745,549739,1,2023-08-21,3300.0000000,286018739,2023-07-30 14:16:36.750981+00,1421893794,257557,0
0,640725189,101745,549739,1,2023-08-22,3300.0000000,286018740,2023-07-30 14:16:36.750981+00,1422574747,257557,0
0,640725189,101745,549739,1,2023-08-23,3300.0000000,286018741,2023-07-30 14:16:36.750981+00,1423641875,257557,0
0,640725189,101745,549739,1,2023-08-24,3300.0000000,286018742,2023-07-30 14:16:36.750981+00,1425001763,257557,0
0,640725189,101745,549739,1,2023-08-25,3300.0000000,286018743,2023-07-30 14:16:36.750981+00,1426189093,257557,0
0,640725189,101745,549739,1,2023-08-26,3300.0000000,286018744,2023-07-30 14:16:36.750981+00,1426909553,257557,0
0,640725189,101745,549739,1,2023-08-27,3300.0000000,286018745,2023-07-30 14:16:36.750981+00,1427745864,257557,0
0,640725189,101745,549739,1,2023-08-28,3300.0000000,286018746,2023-07-30 14:16:36.750981+00,1428251172,257557,0
0,640725189,101745,549739,1,2023-08-29,3300.0000000,286018747,2023-07-30 14:16:36.750981+00,1429371338,257557,0
0,640725189,101745,549739,1,2023-08-30,3300.0000000,286018748,2023-07-30 14:16:36.750981+00,1430351716,257557,0
0,640725189,101745,549739,1,2023-08-31,3300.0000000,286018749,2023-07-30 14:16:36.750981+00,1431233935,257557,0
0,640725189,101745,549739,2,2023-08-01,3700.0000000,286018874,2023-07-30 14:16:36.750981+00,1403251634,257558,0
0,640725189,101745,549739,2,2023-08-02,3700.0000000,286018875,2023-07-30 14:16:36.750981+00,1404302256,257558,0
0,640725189,101745,549739,2,2023-08-03,3700.0000000,286018876,2023-07-30 14:16:36.750981+00,1405471672,257558,0
0,640725189,101745,549739,2,2023-08-04,3700.0000000,286018877,2023-07-30 14:16:36.750981+00,1406677111,257558,0
0,640725189,101745,549739,2,2023-08-05,3700.0000000,286018878,2023-07-30 14:16:36.750981+00,1407621373,257558,0
0,640725189,101745,549739,2,2023-08-06,3700.0000000,286018879,2023-07-30 14:16:36.750981+00,1408532976,257558,0
0,640725189,101745,549739,2,2023-08-07,3700.0000000,286018880,2023-07-30 14:16:36.750981+00,1409248621,257558,0
0,640725189,101745,549739,2,2023-08-08,3700.0000000,286018881,2023-07-30 14:16:36.750981+00,1409861556,257558,0
0,640725189,101745,549739,2,2023-08-09,3700.0000000,286018882,2023-07-30 14:16:36.750981+00,1410801647,257558,0
0,640725189,101745,549739,2,2023-08-10,3700.0000000,286018883,2023-07-30 14:16:36.750981+00,1411840681,257558,0
0,640725189,101745,549739,2,2023-08-11,3700.0000000,286018884,2023-07-30 14:16:36.750981+00,1412852367,257558,0
0,640725189,101745,549739,2,2023-08-12,3700.0000000,286018885,2023-07-30 14:16:36.750981+00,1413988765,257558,0
0,640725189,101745,549739,2,2023-08-13,3700.0000000,286018886,2023-07-30 14:16:36.750981+00,1414738258,257558,0
0,640725189,101745,549739,2,2023-08-14,3700.0000000,286018887,2023-07-30 14:16:36.750981+00,1415333542,257558,0
0,640725189,101745,549739,2,2023-08-15,3700.0000000,286018888,2023-07-30 14:16:36.750981+00,1415991464,257558,0
0,640725189,101745,549739,2,2023-08-16,3700.0000000,286018889,2023-07-30 14:16:36.750981+00,1417133264,257558,0
0,640725189,101745,549739,2,2023-08-17,3700.0000000,286018890,2023-07-30 14:16:36.750981+00,1417827149,257558,0
0,640725189,101745,549739,2,2023-08-18,3700.0000000,286018891,2023-07-30 14:16:36.750981+00,1418815192,257558,0
0,640725189,101745,549739,2,2023-08-19,3700.0000000,286018892,2023-07-30 14:16:36.750981+00,1420121246,257558,0
0,640725189,101745,549739,2,2023-08-20,3700.0000000,286018893,2023-07-30 14:16:36.750981+00,1421302961,257558,0
0,640725189,101745,549739,2,2023-08-21,3700.0000000,286018894,2023-07-30 14:16:36.750981+00,1421893793,257558,0
0,640725189,101745,549739,2,2023-08-22,3700.0000000,286018895,2023-07-30 14:16:36.750981+00,1422574746,257558,0
0,640725189,101745,549739,2,2023-08-23,3700.0000000,286018896,2023-07-30 14:16:36.750981+00,1423641874,257558,0
0,640725189,101745,549739,2,2023-08-24,3700.0000000,286018897,2023-07-30 14:16:36.750981+00,1425001762,257558,0
0,640725189,101745,549739,2,2023-08-25,3700.0000000,286018898,2023-07-30 14:16:36.750981+00,1426189092,257558,0
0,640725189,101745,549739,2,2023-08-26,3700.0000000,286018899,2023-07-30 14:16:36.750981+00,1426909552,257558,0
0,640725189,101745,549739,2,2023-08-27,3700.0000000,286018900,2023-07-30 14:16:36.750981+00,1427745863,257558,0
0,640725189,101745,549739,2,2023-08-28,3700.0000000,286018901,2023-07-30 14:16:36.750981+00,1428251171,257558,0
0,640725189,101745,549739,2,2023-08-29,3700.0000000,286018902,2023-07-30 14:16:36.750981+00,1429371337,257558,0
0,640725189,101745,549739,2,2023-08-30,3700.0000000,286018903,2023-07-30 14:16:36.750981+00,1430351715,257558,0
0,640725189,101745,549739,2,2023-08-31,3700.0000000,286018904,2023-07-30 14:16:36.750981+00,1431233934,257558,0
0,640725189,101747,203168,1,2023-08-01,5300.0000000,286019029,2023-07-30 14:16:36.750981+00,1403251629,257561,0
0,640725189,101747,203168,1,2023-08-02,5300.0000000,286019030,2023-07-30 14:16:36.750981+00,1404302251,257561,0
0,640725189,101747,203168,1,2023-08-03,5300.0000000,286019031,2023-07-30 14:16:36.750981+00,1405471667,257561,0
0,640725189,101747,203168,1,2023-08-04,5300.0000000,286019032,2023-07-30 14:16:36.750981+00,1406677106,257561,0
0,640725189,101747,203168,1,2023-08-05,5300.0000000,286019033,2023-07-30 14:16:36.750981+00,1407621368,257561,0
0,640725189,101747,203168,1,2023-08-06,5300.0000000,286019034,2023-07-30 14:16:36.750981+00,1408532971,257561,0
0,185647715,222578,489241,1,2023-07-31,3300.0000000,302101024,2023-07-30 14:16:36.750981+00,1402634706,567261,0
0,185647715,222578,896171,1,2023-07-30,4000.0000000,302101276,2023-07-30 14:16:36.750981+00,1401895973,567261,0
0,185647715,222578,896171,1,2023-07-31,4000.0000000,302101277,2023-07-30 14:16:36.750981+00,1402634719,567261,0
0,185647715,222578,896172,1,2023-07-30,4700.0000000,302101529,2023-07-30 14:16:36.750981+00,1401895986,567261,0
0,185647715,222578,896172,1,2023-07-31,4700.0000000,302101530,2023-07-30 14:16:36.750981+00,1402634732,567261,0
0,185647715,222578,1016845,1,2023-07-30,2750.0000000,302101782,2023-07-30 14:16:36.750981+00,1401895999,567261,0
0,185647715,222578,1016845,1,2023-07-31,2750.0000000,302101783,2023-07-30 14:16:36.750981+00,1402634745,567261,0
0,185647715,222639,489556,1,2023-07-30,3700.0000000,302102035,2023-07-30 14:16:36.750981+00,1401895962,567421,0
0,185647715,222639,489556,1,2023-07-31,3700.0000000,302102036,2023-07-30 14:16:36.750981+00,1402634708,567421,0
0,185647715,222639,489556,2,2023-07-30,5200.0000000,302102288,2023-07-30 14:16:36.750981+00,1401895961,567422,0
0,185647715,222639,489556,2,2023-07-31,5200.0000000,302102289,2023-07-30 14:16:36.750981+00,1402634707,567422,0
0,185647715,222639,896171,1,2023-07-30,4400.0000000,302102541,2023-07-30 14:16:36.750981+00,1401895975,567421,0
0,185647715,222639,896171,1,2023-07-31,4400.0000000,302102542,2023-07-30 14:16:36.750981+00,1402634721,567421,0
0,185647715,222639,896171,2,2023-07-30,6600.0000000,302102794,2023-07-30 14:16:36.750981+00,1401895974,567422,0
0,185647715,222639,896171,2,2023-07-31,6600.0000000,302102795,2023-07-30 14:16:36.750981+00,1402634720,567422,0
0,185647715,222639,896172,1,2023-07-30,5100.0000000,302103047,2023-07-30 14:16:36.750981+00,1401895988,567421,0
0,185647715,222639,896172,1,2023-07-31,5100.0000000,302103048,2023-07-30 14:16:36.750981+00,1402634734,567421,0
0,185647715,222639,896172,2,2023-07-30,8000.0000000,302103300,2023-07-30 14:16:36.750981+00,1401895987,567422,0
0,185647715,222639,896172,2,2023-07-31,8000.0000000,302103301,2023-07-30 14:16:36.750981+00,1402634733,567422,0
0,185647715,222639,1016845,1,2023-07-30,3150.0000000,302103553,2023-07-30 14:16:36.750981+00,1401896001,567421,0
0,185647715,222639,1016845,1,2023-07-31,3150.0000000,302103554,2023-07-30 14:16:36.750981+00,1402634747,567421,0
0,185647715,222639,1016845,2,2023-07-30,4100.0000000,302103806,2023-07-30 14:16:36.750981+00,1401896000,567422,0
0,185647715,222639,1016845,2,2023-07-31,4100.0000000,302103807,2023-07-30 14:16:36.750981+00,1402634746,567422,0
0,185647715,222648,489600,1,2023-07-30,3700.0000000,302104059,2023-07-30 14:16:36.750981+00,1401895964,567436,0
0,185647715,222648,489600,1,2023-07-31,3700.0000000,302104060,2023-07-30 14:16:36.750981+00,1402634710,567436,0
0,185647715,222648,489600,2,2023-07-30,5200.0000000,302104312,2023-07-30 14:16:36.750981+00,1401895963,567437,0
0,185647715,222648,489600,2,2023-07-31,5200.0000000,302104313,2023-07-30 14:16:36.750981+00,1402634709,567437,0
0,185647715,222648,896171,1,2023-07-30,4400.0000000,302104565,2023-07-30 14:16:36.750981+00,1401895977,567436,0
0,185647715,222648,896171,1,2023-07-31,4400.0000000,302104566,2023-07-30 14:16:36.750981+00,1402634723,567436,0
0,185647715,222648,896171,2,2023-07-30,6600.0000000,302104818,2023-07-30 14:16:36.750981+00,1401895976,567437,0
0,185647715,222648,896171,2,2023-07-31,6600.0000000,302104819,2023-07-30 14:16:36.750981+00,1402634722,567437,0
0,185647715,222648,896172,1,2023-07-30,5100.0000000,302105071,2023-07-30 14:16:36.750981+00,1401895990,567436,0
0,185647715,222648,896172,1,2023-07-31,5100.0000000,302105072,2023-07-30 14:16:36.750981+00,1402634736,567436,0
0,185647715,222648,896172,2,2023-07-30,8000.0000000,302105324,2023-07-30 14:16:36.750981+00,1401895989,567437,0
0,185647715,222648,896172,2,2023-07-31,8000.0000000,302105325,2023-07-30 14:16:36.750981+00,1402634735,567437,0
0,185647715,222648,1016845,1,2023-07-30,3150.0000000,302105577,2023-07-30 14:16:36.750981+00,1401896003,567436,0
0,185647715,222648,1016845,1,2023-07-31,3150.0000000,302105578,2023-07-30 14:16:36.750981+00,1402634749,567436,0
0,185647715,222648,1016845,2,2023-07-30,4100.0000000,302105830,2023-07-30 14:16:36.750981+00,1401896002,567437,0
0,185647715,222648,1016845,2,2023-07-31,4100.0000000,302105831,2023-07-30 14:16:36.750981+00,1402634748,567437,0
0,185647715,222653,489627,1,2023-07-30,4800.0000000,302106083,2023-07-30 14:16:36.750981+00,1401895966,567446,0
0,185647715,222653,489627,1,2023-07-31,4800.0000000,302106084,2023-07-30 14:16:36.750981+00,1402634712,567446,0
0,185647715,222653,489627,2,2023-07-30,5800.0000000,302106336,2023-07-30 14:16:36.750981+00,1401895965,567447,0
0,185647715,222653,489627,2,2023-07-31,5800.0000000,302106337,2023-07-30 14:16:36.750981+00,1402634711,567447,0
0,185647715,222653,896171,1,2023-07-30,5500.0000000,302106589,2023-07-30 14:16:36.750981+00,1401895979,567446,0
0,185647715,222653,896171,1,2023-07-31,5500.0000000,302106590,2023-07-30 14:16:36.750981+00,1402634725,567446,0
0,185647715,222653,896171,2,2023-07-30,7200.0000000,302106842,2023-07-30 14:16:36.750981+00,1401895978,567447,0
0,185647715,222653,896171,2,2023-07-31,7200.0000000,302106843,2023-07-30 14:16:36.750981+00,1402634724,567447,0
0,185647715,222653,896172,1,2023-07-30,6200.0000000,302107095,2023-07-30 14:16:36.750981+00,1401895992,567446,0
0,185647715,222653,896172,1,2023-07-31,6200.0000000,302107096,2023-07-30 14:16:36.750981+00,1402634738,567446,0
0,185647715,222653,896172,2,2023-07-30,8600.0000000,302107348,2023-07-30 14:16:36.750981+00,1401895991,567447,0
0,185647715,222653,896172,2,2023-07-31,8600.0000000,302107349,2023-07-30 14:16:36.750981+00,1402634737,567447,0
0,185647715,222653,1016845,1,2023-07-30,4250.0000000,302107601,2023-07-30 14:16:36.750981+00,1401896005,567446,0
0,185647715,222653,1016845,1,2023-07-31,4250.0000000,302107602,2023-07-30 14:16:36.750981+00,1402634751,567446,0
0,185647715,222653,1016845,2,2023-07-30,4700.0000000,302107854,2023-07-30 14:16:36.750981+00,1401896004,567447,0
0,185647715,222653,1016845,2,2023-07-31,4700.0000000,302107855,2023-07-30 14:16:36.750981+00,1402634750,567447,0
0,185647715,222654,489632,1,2023-07-30,7200.0000000,302108107,2023-07-30 14:16:36.750981+00,1401895968,567449,0
0,185647715,222654,489632,1,2023-07-31,7200.0000000,302108108,2023-07-30 14:16:36.750981+00,1402634714,567449,0
0,185647715,222654,489632,2,2023-07-30,7200.0000000,302108360,2023-07-30 14:16:36.750981+00,1401895967,567450,0
0,185647715,222654,489632,2,2023-07-31,7200.0000000,302108361,2023-07-30 14:16:36.750981+00,1402634713,567450,0
0,185647715,222654,896171,1,2023-07-30,6900.0000000,302108613,2023-07-30 14:16:36.750981+00,1401895981,567449,0
0,185647715,222654,896171,1,2023-07-31,6900.0000000,302108614,2023-07-30 14:16:36.750981+00,1402634727,567449,0
0,185647715,222654,896171,2,2023-07-30,8600.0000000,302108866,2023-07-30 14:16:36.750981+00,1401895980,567450,0
0,185647715,222654,896171,2,2023-07-31,8600.0000000,302108867,2023-07-30 14:16:36.750981+00,1402634726,567450,0
0,185647715,222654,896172,1,2023-07-30,7600.0000000,302109119,2023-07-30 14:16:36.750981+00,1401895994,567449,0
0,185647715,222654,896172,1,2023-07-31,7600.0000000,302109120,2023-07-30 14:16:36.750981+00,1402634740,567449,0
0,185647715,222654,896172,2,2023-07-30,10000.0000000,302109372,2023-07-30 14:16:36.750981+00,1401895993,567450,0
0,185647715,222654,896172,2,2023-07-31,10000.0000000,302109373,2023-07-30 14:16:36.750981+00,1402634739,567450,0
0,185647715,222654,1016845,1,2023-07-30,5650.0000000,302109625,2023-07-30 14:16:36.750981+00,1401896007,567449,0
0,185647715,222654,1016845,1,2023-07-31,5650.0000000,302109626,2023-07-30 14:16:36.750981+00,1402634753,567449,0
0,185647715,222654,1016845,2,2023-07-30,6100.0000000,302109878,2023-07-30 14:16:36.750981+00,1401896006,567450,0
0,185647715,222654,1016845,2,2023-07-31,6100.0000000,302109879,2023-07-30 14:16:36.750981+00,1402634752,567450,0
0,185647715,222655,489637,1,2023-07-30,7800.0000000,302110131,2023-07-30 14:16:36.750981+00,1401895970,567452,0
0,185647715,222655,489637,1,2023-07-31,7800.0000000,302110132,2023-07-30 14:16:36.750981+00,1402634716,567452,0
0,185647715,222655,489637,2,2023-07-30,9100.0000000,302110384,2023-07-30 14:16:36.750981+00,1401895969,567453,0
0,185647715,222655,489637,2,2023-07-31,9100.0000000,302110385,2023-07-30 14:16:36.750981+00,1402634715,567453,0
0,185647715,222655,896171,1,2023-07-30,8500.0000000,302110637,2023-07-30 14:16:36.750981+00,1401895983,567452,0
0,185647715,222655,896171,1,2023-07-31,8500.0000000,302110638,2023-07-30 14:16:36.750981+00,1402634729,567452,0
0,185647715,222655,896171,2,2023-07-30,10500.0000000,302110890,2023-07-30 14:16:36.750981+00,1401895982,567453,0
0,185647715,222655,896171,2,2023-07-31,10500.0000000,302110891,2023-07-30 14:16:36.750981+00,1402634728,567453,0
0,185647715,222655,896172,1,2023-07-30,9200.0000000,302111143,2023-07-30 14:16:36.750981+00,1401895996,567452,0
0,185647715,222655,896172,1,2023-07-31,9200.0000000,302111144,2023-07-30 14:16:36.750981+00,1402634742,567452,0
0,185647715,222655,896172,2,2023-07-30,11900.0000000,302111396,2023-07-30 14:16:36.750981+00,1401895995,567453,0
0,185647715,222655,896172,2,2023-07-31,11900.0000000,302111397,2023-07-30 14:16:36.750981+00,1402634741,567453,0
0,185647715,222655,1016845,1,2023-07-30,7250.0000000,302111649,2023-07-30 14:16:36.750981+00,1401896009,567452,0
0,185647715,222655,1016845,1,2023-07-31,7250.0000000,302111650,2023-07-30 14:16:36.750981+00,1402634755,567452,0
0,185647715,222655,1016845,2,2023-07-30,8000.0000000,302111902,2023-07-30 14:16:36.750981+00,1401896008,567453,0
0,185647715,222655,1016845,2,2023-07-31,8000.0000000,302111903,2023-07-30 14:16:36.750981+00,1402634754,567453,0
0,185647715,222656,489642,1,2023-07-30,12000.0000000,302112155,2023-07-30 14:16:36.750981+00,1401895972,567455,0
0,185647715,222656,489642,1,2023-07-31,12000.0000000,302112156,2023-07-30 14:16:36.750981+00,1402634718,567455,0
0,185647715,222656,489642,2,2023-07-30,14500.0000000,302112408,2023-07-30 14:16:36.750981+00,1401895971,567456,0
0,185647715,222656,489642,2,2023-07-31,14500.0000000,302112409,2023-07-30 14:16:36.750981+00,1402634717,567456,0
0,185647715,222656,896171,1,2023-07-30,12700.0000000,302112661,2023-07-30 14:16:36.750981+00,1401895985,567455,0
0,185647715,222656,896171,1,2023-07-31,12700.0000000,302112662,2023-07-30 14:16:36.750981+00,1402634731,567455,0
0,185647715,222656,896171,2,2023-07-30,15900.0000000,302112914,2023-07-30 14:16:36.750981+00,1401895984,567456,0
0,185647715,222656,896171,2,2023-07-31,15900.0000000,302112915,2023-07-30 14:16:36.750981+00,1402634730,567456,0
0,185647715,222656,896172,1,2023-07-30,13400.0000000,302113167,2023-07-30 14:16:36.750981+00,1401895998,567455,0
0,185647715,222656,896172,1,2023-07-31,13400.0000000,302113168,2023-07-30 14:16:36.750981+00,1402634744,567455,0
0,185647715,222656,896172,2,2023-07-30,17300.0000000,302113420,2023-07-30 14:16:36.750981+00,1401895997,567456,0
0,185647715,222656,896172,2,2023-07-31,17300.0000000,302113421,2023-07-30 14:16:36.750981+00,1402634743,567456,0
0,185647715,222656,1016845,1,2023-07-30,11450.0000000,302113673,2023-07-30 14:16:36.750981+00,1401896011,567455,0
0,185647715,222656,1016845,1,2023-07-31,11450.0000000,302113674,2023-07-30 14:16:36.750981+00,1402634757,567455,0
0,185647715,222656,1016845,2,2023-07-30,13400.0000000,302113926,2023-07-30 14:16:36.750981+00,1401896010,567456,0
0,185647715,222656,1016845,2,2023-07-31,13400.0000000,302113927,2023-07-30 14:16:36.750981+00,1402634756,567456,0
0,640725189,101742,203163,1,2023-07-30,2700.0000000,286017477,2023-07-30 14:16:36.750981+00,1401882107,257550,0
0,640725189,101742,203163,1,2023-07-31,2700.0000000,286017478,2023-07-30 14:16:36.750981+00,1402623424,257550,0
0,640725189,101742,549736,1,2023-07-30,2350.0000000,286017632,2023-07-30 14:16:36.750981+00,1401882114,257550,0
0,640725189,101742,549736,1,2023-07-31,2350.0000000,286017633,2023-07-30 14:16:36.750981+00,1402623431,257550,0
0,640725189,101743,203164,1,2023-07-30,3350.0000000,286017787,2023-07-30 14:16:36.750981+00,1401882108,257551,0
0,640725189,101743,203164,1,2023-07-31,3350.0000000,286017788,2023-07-30 14:16:36.750981+00,1402623425,257551,0
0,640725189,101743,549737,1,2023-07-30,3000.0000000,286017942,2023-07-30 14:16:36.750981+00,1401882115,257551,0
0,640725189,101743,549737,1,2023-07-31,3000.0000000,286017943,2023-07-30 14:16:36.750981+00,1402623432,257551,0
0,640725189,101744,203165,2,2023-07-30,3950.0000000,286018097,2023-07-30 14:16:36.750981+00,1401882109,257553,0
0,640725189,101744,203165,2,2023-07-31,3950.0000000,286018098,2023-07-30 14:16:36.750981+00,1402623426,257553,0
0,640725189,101744,549738,2,2023-07-30,3250.0000000,286018252,2023-07-30 14:16:36.750981+00,1401882116,257553,0
0,640725189,101744,549738,2,2023-07-31,3250.0000000,286018253,2023-07-30 14:16:36.750981+00,1402623433,257553,0
0,640725189,101745,203166,1,2023-07-30,3650.0000000,286018407,2023-07-30 14:16:36.750981+00,1401882110,257557,0
0,640725189,101745,203166,1,2023-07-31,3650.0000000,286018408,2023-07-30 14:16:36.750981+00,1402623427,257557,0
0,640725189,101745,203166,2,2023-07-30,4400.0000000,286018562,2023-07-30 14:16:36.750981+00,1401882111,257558,0
0,640725189,101745,203166,2,2023-07-31,4400.0000000,286018563,2023-07-30 14:16:36.750981+00,1402623428,257558,0
0,640725189,101745,549739,1,2023-07-30,3300.0000000,286018717,2023-07-30 14:16:36.750981+00,1401882118,257557,0
0,640725189,101745,549739,1,2023-07-31,3300.0000000,286018718,2023-07-30 14:16:36.750981+00,1402623436,257557,0
0,640725189,101745,549739,2,2023-07-30,3700.0000000,286018872,2023-07-30 14:16:36.750981+00,1401882117,257558,0
0,640725189,101745,549739,2,2023-07-31,3700.0000000,286018873,2023-07-30 14:16:36.750981+00,1402623435,257558,0
0,640725189,101747,203168,1,2023-07-30,5300.0000000,286019027,2023-07-30 14:16:36.750981+00,1401882112,257561,0
0,640725189,101747,203168,1,2023-07-31,5300.0000000,286019028,2023-07-30 14:16:36.750981+00,1402623429,257561,0
0,640725189,101747,203168,2,2023-07-30,5800.0000000,286019182,2023-07-30 14:16:36.750981+00,1401882113,257562,0
0,640725189,101747,203168,2,2023-07-31,5800.0000000,286019183,2023-07-30 14:16:36.750981+00,1402623430,257562,0
0,640725189,101747,549740,1,2023-07-30,4950.0000000,286019337,2023-07-30 14:16:36.750981+00,1401882120,257561,0
0,640725189,101747,549740,1,2023-07-31,4950.0000000,286019338,2023-07-30 14:16:36.750981+00,1402623440,257561,0
0,640725189,101747,549740,2,2023-07-30,5100.0000000,286019492,2023-07-30 14:16:36.750981+00,1401882119,257562,0
0,640725189,101747,549740,2,2023-07-31,5100.0000000,286019493,2023-07-30 14:16:36.750981+00,1402623438,257562,0
0,961513435,345079,972890,1,2023-07-30,2500.0000000,230140479,2023-07-30 14:16:36.750981+00,1165235851,925030,0
0,961513435,345079,972890,1,2023-07-31,2500.0000000,230140480,2023-07-30 14:16:36.750981+00,1165235852,925030,0
0,961513435,355770,972890,1,2023-07-30,1300.0000000,230140944,2023-07-30 14:16:36.750981+00,1184969008,955856,0
0,961513435,355770,972890,1,2023-07-31,1300.0000000,230140945,2023-07-30 14:16:36.750981+00,1184969011,955856,0
0,961513435,355770,1012400,1,2023-07-30,1300.0000000,230141409,2023-07-30 14:16:36.750981+00,1165236070,955856,0
0,961513435,355770,1012400,1,2023-07-31,1300.0000000,230141410,2023-07-30 14:16:36.750981+00,1165236071,955856,0
0,961513435,355771,972890,1,2023-07-30,1300.0000000,230141431,2023-07-30 14:16:36.750981+00,1184970062,955857,0
0,961513435,355771,972890,1,2023-07-31,1300.0000000,230141432,2023-07-30 14:16:36.750981+00,1184970063,955857,0
0,961513435,355771,1012401,1,2023-07-30,1300.0000000,230141896,2023-07-30 14:16:36.750981+00,1165236293,955857,0
0,961513435,355771,1012401,1,2023-07-31,1300.0000000,230141897,2023-07-30 14:16:36.750981+00,1165236295,955857,0
0,954493183,216176,461514,1,2024-12-01,5500.0000000,204562868,2023-07-30 14:16:36.750981+00,1756312461,548487,0
0,640725189,101747,203168,1,2023-08-07,5300.0000000,286019035,2023-07-30 14:16:36.750981+00,1409248616,257561,0
0,640725189,101747,203168,1,2023-08-08,5300.0000000,286019036,2023-07-30 14:16:36.750981+00,1409861551,257561,0
0,640725189,101747,203168,1,2023-08-09,5300.0000000,286019037,2023-07-30 14:16:36.750981+00,1410801642,257561,0
0,640725189,101747,203168,1,2023-08-10,5300.0000000,286019038,2023-07-30 14:16:36.750981+00,1411840676,257561,0
0,640725189,101747,203168,1,2023-08-11,5300.0000000,286019039,2023-07-30 14:16:36.750981+00,1412852359,257561,0
0,640725189,101747,203168,1,2023-08-12,5300.0000000,286019040,2023-07-30 14:16:36.750981+00,1413988760,257561,0
0,640725189,101747,203168,1,2023-08-13,5300.0000000,286019041,2023-07-30 14:16:36.750981+00,1414738246,257561,0
0,640725189,101747,203168,1,2023-08-14,5300.0000000,286019042,2023-07-30 14:16:36.750981+00,1415333537,257561,0
0,640725189,101747,203168,1,2023-08-15,5300.0000000,286019043,2023-07-30 14:16:36.750981+00,1415991459,257561,0
0,640725189,101747,203168,1,2023-08-16,5300.0000000,286019044,2023-07-30 14:16:36.750981+00,1417133249,257561,0
0,640725189,101747,203168,1,2023-08-17,5300.0000000,286019045,2023-07-30 14:16:36.750981+00,1417827144,257561,0
0,640725189,101747,203168,1,2023-08-18,5300.0000000,286019046,2023-07-30 14:16:36.750981+00,1418815187,257561,0
0,640725189,101747,203168,1,2023-08-19,5300.0000000,286019047,2023-07-30 14:16:36.750981+00,1420121241,257561,0
0,640725189,101747,203168,1,2023-08-20,5300.0000000,286019048,2023-07-30 14:16:36.750981+00,1421302956,257561,0
0,640725189,101747,203168,1,2023-08-21,5300.0000000,286019049,2023-07-30 14:16:36.750981+00,1421893788,257561,0
0,640725189,101747,203168,1,2023-08-22,5300.0000000,286019050,2023-07-30 14:16:36.750981+00,1422574741,257561,0
0,640725189,101747,203168,1,2023-08-23,5300.0000000,286019051,2023-07-30 14:16:36.750981+00,1423641869,257561,0
0,640725189,101747,203168,1,2023-08-24,5300.0000000,286019052,2023-07-30 14:16:36.750981+00,1425001757,257561,0
0,640725189,101747,203168,1,2023-08-25,5300.0000000,286019053,2023-07-30 14:16:36.750981+00,1426189087,257561,0
0,640725189,101747,203168,1,2023-08-26,5300.0000000,286019054,2023-07-30 14:16:36.750981+00,1426909547,257561,0
0,640725189,101747,203168,1,2023-08-27,5300.0000000,286019055,2023-07-30 14:16:36.750981+00,1427745858,257561,0
0,640725189,101747,203168,1,2023-08-28,5300.0000000,286019056,2023-07-30 14:16:36.750981+00,1428251166,257561,0
0,640725189,101747,203168,1,2023-08-29,5300.0000000,286019057,2023-07-30 14:16:36.750981+00,1429371332,257561,0
0,640725189,101747,203168,1,2023-08-30,5300.0000000,286019058,2023-07-30 14:16:36.750981+00,1430351710,257561,0
0,640725189,101747,203168,1,2023-08-31,5300.0000000,286019059,2023-07-30 14:16:36.750981+00,1431233929,257561,0
0,640725189,101747,203168,2,2023-08-01,5800.0000000,286019184,2023-07-30 14:16:36.750981+00,1403251630,257562,0
0,640725189,101747,203168,2,2023-08-02,5800.0000000,286019185,2023-07-30 14:16:36.750981+00,1404302252,257562,0
0,640725189,101747,203168,2,2023-08-03,5800.0000000,286019186,2023-07-30 14:16:36.750981+00,1405471668,257562,0
0,640725189,101747,203168,2,2023-08-04,5800.0000000,286019187,2023-07-30 14:16:36.750981+00,1406677107,257562,0
0,640725189,101747,203168,2,2023-08-05,5800.0000000,286019188,2023-07-30 14:16:36.750981+00,1407621369,257562,0
0,640725189,101747,203168,2,2023-08-06,5800.0000000,286019189,2023-07-30 14:16:36.750981+00,1408532972,257562,0
0,640725189,101747,203168,2,2023-08-07,5800.0000000,286019190,2023-07-30 14:16:36.750981+00,1409248617,257562,0
0,640725189,101747,203168,2,2023-08-08,5800.0000000,286019191,2023-07-30 14:16:36.750981+00,1409861552,257562,0
0,640725189,101747,203168,2,2023-08-09,5800.0000000,286019192,2023-07-30 14:16:36.750981+00,1410801643,257562,0
0,640725189,101747,203168,2,2023-08-10,5800.0000000,286019193,2023-07-30 14:16:36.750981+00,1411840677,257562,0
0,640725189,101747,203168,2,2023-08-11,5800.0000000,286019194,2023-07-30 14:16:36.750981+00,1412852360,257562,0
0,640725189,101747,203168,2,2023-08-12,5800.0000000,286019195,2023-07-30 14:16:36.750981+00,1413988761,257562,0
0,640725189,101747,203168,2,2023-08-13,5800.0000000,286019196,2023-07-30 14:16:36.750981+00,1414738249,257562,0
0,640725189,101747,203168,2,2023-08-14,5800.0000000,286019197,2023-07-30 14:16:36.750981+00,1415333538,257562,0
0,640725189,101747,203168,2,2023-08-15,5800.0000000,286019198,2023-07-30 14:16:36.750981+00,1415991460,257562,0
0,640725189,101747,203168,2,2023-08-16,5800.0000000,286019199,2023-07-30 14:16:36.750981+00,1417133252,257562,0
0,640725189,101747,203168,2,2023-08-17,5800.0000000,286019200,2023-07-30 14:16:36.750981+00,1417827145,257562,0
0,640725189,101747,203168,2,2023-08-18,5800.0000000,286019201,2023-07-30 14:16:36.750981+00,1418815188,257562,0
0,640725189,101747,203168,2,2023-08-19,5800.0000000,286019202,2023-07-30 14:16:36.750981+00,1420121242,257562,0
0,640725189,101747,203168,2,2023-08-20,5800.0000000,286019203,2023-07-30 14:16:36.750981+00,1421302957,257562,0
0,640725189,101747,203168,2,2023-08-21,5800.0000000,286019204,2023-07-30 14:16:36.750981+00,1421893789,257562,0
0,640725189,101747,203168,2,2023-08-22,5800.0000000,286019205,2023-07-30 14:16:36.750981+00,1422574742,257562,0
0,640725189,101747,203168,2,2023-08-23,5800.0000000,286019206,2023-07-30 14:16:36.750981+00,1423641870,257562,0
0,640725189,101747,203168,2,2023-08-24,5800.0000000,286019207,2023-07-30 14:16:36.750981+00,1425001758,257562,0
0,640725189,101747,203168,2,2023-08-25,5800.0000000,286019208,2023-07-30 14:16:36.750981+00,1426189088,257562,0
0,640725189,101747,203168,2,2023-08-26,5800.0000000,286019209,2023-07-30 14:16:36.750981+00,1426909548,257562,0
0,640725189,101747,203168,2,2023-08-27,5800.0000000,286019210,2023-07-30 14:16:36.750981+00,1427745859,257562,0
0,640725189,101747,203168,2,2023-08-28,5800.0000000,286019211,2023-07-30 14:16:36.750981+00,1428251167,257562,0
0,640725189,101747,203168,2,2023-08-29,5800.0000000,286019212,2023-07-30 14:16:36.750981+00,1429371333,257562,0
0,640725189,101747,203168,2,2023-08-30,5800.0000000,286019213,2023-07-30 14:16:36.750981+00,1430351711,257562,0
0,640725189,101747,203168,2,2023-08-31,5800.0000000,286019214,2023-07-30 14:16:36.750981+00,1431233930,257562,0
0,640725189,101747,549740,1,2023-08-01,4950.0000000,286019339,2023-07-30 14:16:36.750981+00,1403251637,257561,0
0,640725189,101747,549740,1,2023-08-02,4950.0000000,286019340,2023-07-30 14:16:36.750981+00,1404302259,257561,0
0,640725189,101747,549740,1,2023-08-03,4950.0000000,286019341,2023-07-30 14:16:36.750981+00,1405471675,257561,0
0,640725189,101747,549740,1,2023-08-04,4950.0000000,286019342,2023-07-30 14:16:36.750981+00,1406677114,257561,0
0,640725189,101747,549740,1,2023-08-05,4950.0000000,286019343,2023-07-30 14:16:36.750981+00,1407621376,257561,0
0,640725189,101747,549740,1,2023-08-06,4950.0000000,286019344,2023-07-30 14:16:36.750981+00,1408532979,257561,0
0,640725189,101747,549740,1,2023-08-07,4950.0000000,286019345,2023-07-30 14:16:36.750981+00,1409248624,257561,0
0,640725189,101747,549740,1,2023-08-08,4950.0000000,286019346,2023-07-30 14:16:36.750981+00,1409861559,257561,0
0,640725189,101747,549740,1,2023-08-09,4950.0000000,286019347,2023-07-30 14:16:36.750981+00,1410801650,257561,0
0,640725189,101747,549740,1,2023-08-10,4950.0000000,286019348,2023-07-30 14:16:36.750981+00,1411840684,257561,0
0,640725189,101747,549740,1,2023-08-11,4950.0000000,286019349,2023-07-30 14:16:36.750981+00,1412852372,257561,0
0,640725189,101747,549740,1,2023-08-12,4950.0000000,286019350,2023-07-30 14:16:36.750981+00,1413988768,257561,0
0,640725189,101747,549740,1,2023-08-13,4950.0000000,286019351,2023-07-30 14:16:36.750981+00,1414738265,257561,0
0,640725189,101747,549740,1,2023-08-14,4950.0000000,286019352,2023-07-30 14:16:36.750981+00,1415333545,257561,0
0,640725189,101747,549740,1,2023-08-15,4950.0000000,286019353,2023-07-30 14:16:36.750981+00,1415991467,257561,0
0,640725189,101747,549740,1,2023-08-16,4950.0000000,286019354,2023-07-30 14:16:36.750981+00,1417133272,257561,0
0,640725189,101747,549740,1,2023-08-17,4950.0000000,286019355,2023-07-30 14:16:36.750981+00,1417827152,257561,0
0,640725189,101747,549740,1,2023-08-18,4950.0000000,286019356,2023-07-30 14:16:36.750981+00,1418815195,257561,0
0,640725189,101747,549740,1,2023-08-19,4950.0000000,286019357,2023-07-30 14:16:36.750981+00,1420121249,257561,0
0,640725189,101747,549740,1,2023-08-20,4950.0000000,286019358,2023-07-30 14:16:36.750981+00,1421302964,257561,0
0,640725189,101747,549740,1,2023-08-21,4950.0000000,286019359,2023-07-30 14:16:36.750981+00,1421893796,257561,0
0,640725189,101747,549740,1,2023-08-22,4950.0000000,286019360,2023-07-30 14:16:36.750981+00,1422574749,257561,0
0,640725189,101747,549740,1,2023-08-23,4950.0000000,286019361,2023-07-30 14:16:36.750981+00,1423641877,257561,0
0,640725189,101747,549740,1,2023-08-24,4950.0000000,286019362,2023-07-30 14:16:36.750981+00,1425001765,257561,0
0,640725189,101747,549740,1,2023-08-25,4950.0000000,286019363,2023-07-30 14:16:36.750981+00,1426189095,257561,0
0,640725189,101747,549740,1,2023-08-26,4950.0000000,286019364,2023-07-30 14:16:36.750981+00,1426909555,257561,0
0,640725189,101747,549740,1,2023-08-27,4950.0000000,286019365,2023-07-30 14:16:36.750981+00,1427745866,257561,0
0,640725189,101747,549740,1,2023-08-28,4950.0000000,286019366,2023-07-30 14:16:36.750981+00,1428251174,257561,0
0,640725189,101747,549740,1,2023-08-29,4950.0000000,286019367,2023-07-30 14:16:36.750981+00,1429371340,257561,0
0,640725189,101747,549740,1,2023-08-30,4950.0000000,286019368,2023-07-30 14:16:36.750981+00,1430351718,257561,0
0,640725189,101747,549740,1,2023-08-31,4950.0000000,286019369,2023-07-30 14:16:36.750981+00,1431233937,257561,0
0,640725189,101747,549740,2,2023-08-01,5100.0000000,286019494,2023-07-30 14:16:36.750981+00,1403251636,257562,0
0,640725189,101747,549740,2,2023-08-02,5100.0000000,286019495,2023-07-30 14:16:36.750981+00,1404302258,257562,0
0,640725189,101747,549740,2,2023-08-03,5100.0000000,286019496,2023-07-30 14:16:36.750981+00,1405471674,257562,0
0,640725189,101747,549740,2,2023-08-04,5100.0000000,286019497,2023-07-30 14:16:36.750981+00,1406677113,257562,0
0,640725189,101747,549740,2,2023-08-05,5100.0000000,286019498,2023-07-30 14:16:36.750981+00,1407621375,257562,0
0,640725189,101747,549740,2,2023-08-06,5100.0000000,286019499,2023-07-30 14:16:36.750981+00,1408532978,257562,0
0,640725189,101747,549740,2,2023-08-07,5100.0000000,286019500,2023-07-30 14:16:36.750981+00,1409248623,257562,0
0,640725189,101747,549740,2,2023-08-08,5100.0000000,286019501,2023-07-30 14:16:36.750981+00,1409861558,257562,0
0,640725189,101747,549740,2,2023-08-09,5100.0000000,286019502,2023-07-30 14:16:36.750981+00,1410801649,257562,0
0,640725189,101747,549740,2,2023-08-10,5100.0000000,286019503,2023-07-30 14:16:36.750981+00,1411840683,257562,0
0,640725189,101747,549740,2,2023-08-11,5100.0000000,286019504,2023-07-30 14:16:36.750981+00,1412852370,257562,0
0,640725189,101747,549740,2,2023-08-12,5100.0000000,286019505,2023-07-30 14:16:36.750981+00,1413988767,257562,0
0,640725189,101747,549740,2,2023-08-13,5100.0000000,286019506,2023-07-30 14:16:36.750981+00,1414738263,257562,0
0,640725189,101747,549740,2,2023-08-14,5100.0000000,286019507,2023-07-30 14:16:36.750981+00,1415333544,257562,0
0,640725189,101747,549740,2,2023-08-15,5100.0000000,286019508,2023-07-30 14:16:36.750981+00,1415991466,257562,0
0,640725189,101747,549740,2,2023-08-16,5100.0000000,286019509,2023-07-30 14:16:36.750981+00,1417133270,257562,0
0,640725189,101747,549740,2,2023-08-17,5100.0000000,286019510,2023-07-30 14:16:36.750981+00,1417827151,257562,0
0,640725189,101747,549740,2,2023-08-18,5100.0000000,286019511,2023-07-30 14:16:36.750981+00,1418815194,257562,0
0,640725189,101747,549740,2,2023-08-19,5100.0000000,286019512,2023-07-30 14:16:36.750981+00,1420121248,257562,0
0,640725189,101747,549740,2,2023-08-20,5100.0000000,286019513,2023-07-30 14:16:36.750981+00,1421302963,257562,0
0,640725189,101747,549740,2,2023-08-21,5100.0000000,286019514,2023-07-30 14:16:36.750981+00,1421893795,257562,0
0,640725189,101747,549740,2,2023-08-22,5100.0000000,286019515,2023-07-30 14:16:36.750981+00,1422574748,257562,0
0,640725189,101747,549740,2,2023-08-23,5100.0000000,286019516,2023-07-30 14:16:36.750981+00,1423641876,257562,0
0,640725189,101747,549740,2,2023-08-24,5100.0000000,286019517,2023-07-30 14:16:36.750981+00,1425001764,257562,0
0,640725189,101747,549740,2,2023-08-25,5100.0000000,286019518,2023-07-30 14:16:36.750981+00,1426189094,257562,0
0,640725189,101747,549740,2,2023-08-26,5100.0000000,286019519,2023-07-30 14:16:36.750981+00,1426909554,257562,0
0,640725189,101747,549740,2,2023-08-27,5100.0000000,286019520,2023-07-30 14:16:36.750981+00,1427745865,257562,0
0,640725189,101747,549740,2,2023-08-28,5100.0000000,286019521,2023-07-30 14:16:36.750981+00,1428251173,257562,0
0,640725189,101747,549740,2,2023-08-29,5100.0000000,286019522,2023-07-30 14:16:36.750981+00,1429371339,257562,0
0,640725189,101747,549740,2,2023-08-30,5100.0000000,286019523,2023-07-30 14:16:36.750981+00,1430351717,257562,0
0,640725189,101747,549740,2,2023-08-31,5100.0000000,286019524,2023-07-30 14:16:36.750981+00,1431233936,257562,0
0,954493183,216176,461514,1,2023-08-01,5500.0000000,204562380,2023-07-30 14:16:36.750981+00,1183374858,548487,0
0,954493183,216176,461514,1,2023-08-02,5500.0000000,204562381,2023-07-30 14:16:36.750981+00,1183374861,548487,0
0,954493183,216176,461514,1,2023-08-03,5500.0000000,204562382,2023-07-30 14:16:36.750981+00,1183374869,548487,0
0,954493183,216176,461514,1,2023-08-04,5500.0000000,204562383,2023-07-30 14:16:36.750981+00,1183374870,548487,0
0,954493183,216176,461514,1,2023-08-05,5500.0000000,204562384,2023-07-30 14:16:36.750981+00,1183374873,548487,0
0,954493183,216176,461514,1,2023-08-06,5500.0000000,204562385,2023-07-30 14:16:36.750981+00,1183374877,548487,0
0,954493183,216176,461514,1,2023-08-07,5500.0000000,204562386,2023-07-30 14:16:36.750981+00,1183374881,548487,0
0,954493183,216176,461514,1,2023-08-08,5500.0000000,204562387,2023-07-30 14:16:36.750981+00,1183374883,548487,0
0,954493183,216176,461514,1,2023-08-09,5500.0000000,204562388,2023-07-30 14:16:36.750981+00,1183374887,548487,0
0,954493183,216176,461514,1,2023-08-10,5500.0000000,204562389,2023-07-30 14:16:36.750981+00,1183374890,548487,0
0,954493183,216176,461514,1,2023-08-11,5500.0000000,204562390,2023-07-30 14:16:36.750981+00,1183374896,548487,0
0,954493183,216176,461514,1,2023-08-12,5500.0000000,204562391,2023-07-30 14:16:36.750981+00,1183374902,548487,0
0,954493183,216176,461514,1,2023-08-13,5500.0000000,204562392,2023-07-30 14:16:36.750981+00,1183374908,548487,0
0,954493183,216176,461514,1,2023-08-14,5500.0000000,204562393,2023-07-30 14:16:36.750981+00,1183374910,548487,0
0,954493183,216176,461514,1,2023-08-15,5500.0000000,204562394,2023-07-30 14:16:36.750981+00,1183374916,548487,0
0,954493183,216176,461514,1,2023-08-16,5500.0000000,204562395,2023-07-30 14:16:36.750981+00,1183374921,548487,0
0,954493183,216176,461514,1,2023-08-17,5500.0000000,204562396,2023-07-30 14:16:36.750981+00,1183374925,548487,0
0,954493183,216176,461514,1,2023-08-18,5500.0000000,204562397,2023-07-30 14:16:36.750981+00,1183374931,548487,0
0,954493183,216176,461514,1,2023-08-19,5500.0000000,204562398,2023-07-30 14:16:36.750981+00,1183374938,548487,0
0,954493183,216176,461514,1,2023-08-20,5500.0000000,204562399,2023-07-30 14:16:36.750981+00,1183374943,548487,0
0,954493183,216176,461514,1,2023-08-21,5500.0000000,204562400,2023-07-30 14:16:36.750981+00,1183374945,548487,0
0,954493183,216176,461514,1,2023-08-22,5500.0000000,204562401,2023-07-30 14:16:36.750981+00,1183374951,548487,0
0,954493183,216176,461514,1,2023-08-23,5500.0000000,204562402,2023-07-30 14:16:36.750981+00,1183374955,548487,0
0,954493183,216176,461514,1,2023-08-24,5500.0000000,204562403,2023-07-30 14:16:36.750981+00,1183374960,548487,0
0,954493183,216176,461514,1,2023-08-25,5500.0000000,204562404,2023-07-30 14:16:36.750981+00,1183374963,548487,0
0,954493183,216176,461514,1,2023-08-26,5500.0000000,204562405,2023-07-30 14:16:36.750981+00,1183374967,548487,0
0,954493183,216176,461514,1,2023-08-27,5500.0000000,204562406,2023-07-30 14:16:36.750981+00,1183374971,548487,0
0,954493183,216176,461514,1,2023-08-28,5500.0000000,204562407,2023-07-30 14:16:36.750981+00,1183374974,548487,0
0,954493183,216176,461514,1,2023-08-29,5500.0000000,204562408,2023-07-30 14:16:36.750981+00,1183374976,548487,0
0,954493183,216176,461514,1,2023-08-30,5500.0000000,204562409,2023-07-30 14:16:36.750981+00,1183374979,548487,0
0,954493183,216176,461514,1,2023-08-31,5500.0000000,204562410,2023-07-30 14:16:36.750981+00,1183374981,548487,0
0,954493183,216176,461514,2,2023-08-01,5500.0000000,204562901,2023-07-30 14:16:36.750981+00,1183375024,548488,0
0,954493183,216176,461514,2,2023-08-02,5500.0000000,204562902,2023-07-30 14:16:36.750981+00,1183375029,548488,0
0,954493183,216176,461514,2,2023-08-03,5500.0000000,204562903,2023-07-30 14:16:36.750981+00,1183375033,548488,0
0,954493183,216176,461514,2,2023-08-04,5500.0000000,204562904,2023-07-30 14:16:36.750981+00,1183375035,548488,0
0,954493183,216176,461514,2,2023-08-05,5500.0000000,204562905,2023-07-30 14:16:36.750981+00,1183375038,548488,0
0,954493183,216176,461514,2,2023-08-06,5500.0000000,204562906,2023-07-30 14:16:36.750981+00,1183375042,548488,0
0,954493183,216176,461514,2,2023-08-07,5500.0000000,204562907,2023-07-30 14:16:36.750981+00,1183375046,548488,0
0,954493183,216176,461514,2,2023-08-08,5500.0000000,204562908,2023-07-30 14:16:36.750981+00,1183375049,548488,0
0,954493183,216176,461514,2,2023-08-09,5500.0000000,204562909,2023-07-30 14:16:36.750981+00,1183375052,548488,0
0,954493183,216176,461514,2,2023-08-10,5500.0000000,204562910,2023-07-30 14:16:36.750981+00,1183375056,548488,0
0,954493183,216176,461514,2,2023-08-11,5500.0000000,204562911,2023-07-30 14:16:36.750981+00,1183375060,548488,0
0,954493183,216176,461514,2,2023-08-12,5500.0000000,204562912,2023-07-30 14:16:36.750981+00,1183375064,548488,0
0,954493183,216176,461514,2,2023-08-13,5500.0000000,204562913,2023-07-30 14:16:36.750981+00,1183375068,548488,0
0,954493183,216176,461514,2,2023-08-14,5500.0000000,204562914,2023-07-30 14:16:36.750981+00,1183375072,548488,0
0,954493183,216176,461514,2,2023-08-15,5500.0000000,204562915,2023-07-30 14:16:36.750981+00,1183375074,548488,0
0,954493183,216176,461514,2,2023-08-16,5500.0000000,204562916,2023-07-30 14:16:36.750981+00,1183375075,548488,0
0,954493183,216176,461514,2,2023-08-17,5500.0000000,204562917,2023-07-30 14:16:36.750981+00,1183375078,548488,0
0,954493183,216176,461514,2,2023-08-18,5500.0000000,204562918,2023-07-30 14:16:36.750981+00,1183375079,548488,0
0,954493183,216176,461514,2,2023-08-19,5500.0000000,204562919,2023-07-30 14:16:36.750981+00,1183375082,548488,0
0,954493183,216176,461514,2,2023-08-20,5500.0000000,204562920,2023-07-30 14:16:36.750981+00,1183375083,548488,0
0,954493183,216176,461514,2,2023-08-21,5500.0000000,204562921,2023-07-30 14:16:36.750981+00,1183375085,548488,0
0,954493183,216176,461514,2,2023-08-22,5500.0000000,204562922,2023-07-30 14:16:36.750981+00,1183375088,548488,0
0,954493183,216176,461514,2,2023-08-23,5500.0000000,204562923,2023-07-30 14:16:36.750981+00,1183375090,548488,0
0,954493183,216176,461514,2,2023-08-24,5500.0000000,204562924,2023-07-30 14:16:36.750981+00,1183375093,548488,0
0,954493183,216176,461514,2,2023-08-25,5500.0000000,204562925,2023-07-30 14:16:36.750981+00,1183375098,548488,0
0,954493183,216176,461514,2,2023-08-26,5500.0000000,204562926,2023-07-30 14:16:36.750981+00,1183375099,548488,0
0,954493183,216176,461514,2,2023-08-27,5500.0000000,204562927,2023-07-30 14:16:36.750981+00,1183375101,548488,0
0,954493183,216176,461514,2,2023-08-28,5500.0000000,204562928,2023-07-30 14:16:36.750981+00,1183375104,548488,0
0,954493183,216176,461514,2,2023-08-29,5500.0000000,204562929,2023-07-30 14:16:36.750981+00,1183375106,548488,0
0,954493183,216176,461514,2,2023-08-30,5500.0000000,204562930,2023-07-30 14:16:36.750981+00,1183375110,548488,0
0,954493183,216176,461514,2,2023-08-31,5500.0000000,204562931,2023-07-30 14:16:36.750981+00,1183375111,548488,0
0,954493183,216312,462120,1,2023-08-01,4500.0000000,204563422,2023-07-30 14:16:36.750981+00,1183375246,548882,0
0,954493183,216312,462120,1,2023-08-02,4500.0000000,204563423,2023-07-30 14:16:36.750981+00,1183375248,548882,0
0,954493183,216312,462120,1,2023-08-03,4500.0000000,204563424,2023-07-30 14:16:36.750981+00,1183375251,548882,0
0,954493183,216312,462120,1,2023-08-04,4500.0000000,204563425,2023-07-30 14:16:36.750981+00,1183375253,548882,0
0,954493183,216312,462120,1,2023-08-05,4500.0000000,204563426,2023-07-30 14:16:36.750981+00,1183375256,548882,0
0,954493183,216312,462120,1,2023-08-06,4500.0000000,204563427,2023-07-30 14:16:36.750981+00,1183375257,548882,0
0,954493183,216312,462120,1,2023-08-07,4500.0000000,204563428,2023-07-30 14:16:36.750981+00,1183375258,548882,0
0,954493183,216312,462120,1,2023-08-08,4500.0000000,204563429,2023-07-30 14:16:36.750981+00,1183375260,548882,0
0,954493183,216312,462120,1,2023-08-09,4500.0000000,204563430,2023-07-30 14:16:36.750981+00,1183375263,548882,0
0,954493183,216312,462120,1,2023-08-10,4500.0000000,204563431,2023-07-30 14:16:36.750981+00,1183375264,548882,0
0,954493183,216312,462120,1,2023-08-11,4500.0000000,204563432,2023-07-30 14:16:36.750981+00,1183375267,548882,0
0,954493183,216312,462120,1,2023-08-12,4500.0000000,204563433,2023-07-30 14:16:36.750981+00,1183375269,548882,0
0,954493183,216312,462120,1,2023-08-13,4500.0000000,204563434,2023-07-30 14:16:36.750981+00,1183375270,548882,0
0,954493183,216312,462120,1,2023-08-14,4500.0000000,204563435,2023-07-30 14:16:36.750981+00,1183375273,548882,0
0,954493183,216312,462120,1,2023-08-15,4500.0000000,204563436,2023-07-30 14:16:36.750981+00,1183375274,548882,0
0,954493183,216312,462120,1,2023-08-16,4500.0000000,204563437,2023-07-30 14:16:36.750981+00,1183375277,548882,0
0,954493183,216312,462120,1,2023-08-17,4500.0000000,204563438,2023-07-30 14:16:36.750981+00,1183375278,548882,0
0,954493183,216312,462120,1,2023-08-18,4500.0000000,204563439,2023-07-30 14:16:36.750981+00,1183375279,548882,0
0,954493183,216312,462120,1,2023-08-19,4500.0000000,204563440,2023-07-30 14:16:36.750981+00,1183375280,548882,0
0,954493183,216312,462120,1,2023-08-20,4500.0000000,204563441,2023-07-30 14:16:36.750981+00,1183375283,548882,0
0,954493183,216312,462120,1,2023-08-21,4500.0000000,204563442,2023-07-30 14:16:36.750981+00,1183375285,548882,0
0,954493183,216312,462120,1,2023-08-22,4500.0000000,204563443,2023-07-30 14:16:36.750981+00,1183375288,548882,0
0,954493183,216312,462120,1,2023-08-23,4500.0000000,204563444,2023-07-30 14:16:36.750981+00,1183375289,548882,0
0,954493183,216312,462120,1,2023-08-24,4500.0000000,204563445,2023-07-30 14:16:36.750981+00,1183375291,548882,0
0,954493183,216312,462120,1,2023-08-25,4500.0000000,204563446,2023-07-30 14:16:36.750981+00,1183375292,548882,0
0,954493183,216312,462120,1,2023-08-26,4500.0000000,204563447,2023-07-30 14:16:36.750981+00,1183375294,548882,0
0,954493183,216312,462120,1,2023-08-27,4500.0000000,204563448,2023-07-30 14:16:36.750981+00,1183375297,548882,0
0,954493183,216312,462120,1,2023-08-28,4500.0000000,204563449,2023-07-30 14:16:36.750981+00,1183375299,548882,0
0,954493183,216312,462120,1,2023-08-29,4500.0000000,204563450,2023-07-30 14:16:36.750981+00,1183375301,548882,0
0,954493183,216312,462120,1,2023-08-30,4500.0000000,204563451,2023-07-30 14:16:36.750981+00,1183375305,548882,0
0,954493183,216312,462120,1,2023-08-31,4500.0000000,204563452,2023-07-30 14:16:36.750981+00,1183375306,548882,0
0,954493183,216312,462120,2,2023-08-01,4500.0000000,204563943,2023-07-30 14:16:36.750981+00,1183375148,548883,0
0,954493183,216312,462120,2,2023-08-02,4500.0000000,204563944,2023-07-30 14:16:36.750981+00,1183375152,548883,0
0,954493183,216312,462120,2,2023-08-03,4500.0000000,204563945,2023-07-30 14:16:36.750981+00,1183375154,548883,0
0,954493183,216312,462120,2,2023-08-04,4500.0000000,204563946,2023-07-30 14:16:36.750981+00,1183375157,548883,0
0,954493183,216312,462120,2,2023-08-05,4500.0000000,204563947,2023-07-30 14:16:36.750981+00,1183375162,548883,0
0,954493183,216312,462120,2,2023-08-06,4500.0000000,204563948,2023-07-30 14:16:36.750981+00,1183375164,548883,0
0,954493183,216312,462120,2,2023-08-07,4500.0000000,204563949,2023-07-30 14:16:36.750981+00,1183375170,548883,0
0,954493183,216312,462120,2,2023-08-08,4500.0000000,204563950,2023-07-30 14:16:36.750981+00,1183375172,548883,0
0,954493183,216312,462120,2,2023-08-09,4500.0000000,204563951,2023-07-30 14:16:36.750981+00,1183375174,548883,0
0,954493183,216312,462120,2,2023-08-10,4500.0000000,204563952,2023-07-30 14:16:36.750981+00,1183375178,548883,0
0,954493183,216312,462120,2,2023-08-11,4500.0000000,204563953,2023-07-30 14:16:36.750981+00,1183375180,548883,0
0,954493183,216312,462120,2,2023-08-12,4500.0000000,204563954,2023-07-30 14:16:36.750981+00,1183375184,548883,0
0,954493183,216312,462120,2,2023-08-13,4500.0000000,204563955,2023-07-30 14:16:36.750981+00,1183375186,548883,0
0,954493183,216312,462120,2,2023-08-14,4500.0000000,204563956,2023-07-30 14:16:36.750981+00,1183375189,548883,0
0,954493183,216312,462120,2,2023-08-15,4500.0000000,204563957,2023-07-30 14:16:36.750981+00,1183375192,548883,0
0,954493183,216312,462120,2,2023-08-16,4500.0000000,204563958,2023-07-30 14:16:36.750981+00,1183375194,548883,0
0,954493183,216312,462120,2,2023-08-17,4500.0000000,204563959,2023-07-30 14:16:36.750981+00,1183375195,548883,0
0,954493183,216312,462120,2,2023-08-18,4500.0000000,204563960,2023-07-30 14:16:36.750981+00,1183375197,548883,0
0,954493183,216312,462120,2,2023-08-19,4500.0000000,204563961,2023-07-30 14:16:36.750981+00,1183375199,548883,0
0,954493183,216312,462120,2,2023-08-20,4500.0000000,204563962,2023-07-30 14:16:36.750981+00,1183375201,548883,0
0,954493183,216312,462120,2,2023-08-21,4500.0000000,204563963,2023-07-30 14:16:36.750981+00,1183375203,548883,0
0,954493183,216312,462120,2,2023-08-22,4500.0000000,204563964,2023-07-30 14:16:36.750981+00,1183375205,548883,0
0,954493183,216312,462120,2,2023-08-23,4500.0000000,204563965,2023-07-30 14:16:36.750981+00,1183375208,548883,0
0,954493183,216312,462120,2,2023-08-24,4500.0000000,204563966,2023-07-30 14:16:36.750981+00,1183375209,548883,0
0,954493183,216312,462120,2,2023-08-25,4500.0000000,204563967,2023-07-30 14:16:36.750981+00,1183375213,548883,0
0,954493183,216312,462120,2,2023-08-26,4500.0000000,204563968,2023-07-30 14:16:36.750981+00,1183375216,548883,0
0,954493183,216312,462120,2,2023-08-27,4500.0000000,204563969,2023-07-30 14:16:36.750981+00,1183375218,548883,0
0,954493183,216312,462120,2,2023-08-28,4500.0000000,204563970,2023-07-30 14:16:36.750981+00,1183375219,548883,0
0,954493183,216312,462120,2,2023-08-29,4500.0000000,204563971,2023-07-30 14:16:36.750981+00,1183375220,548883,0
0,954493183,216312,462120,2,2023-08-30,4500.0000000,204563972,2023-07-30 14:16:36.750981+00,1183375221,548883,0
0,954493183,216312,462120,2,2023-08-31,4500.0000000,204563973,2023-07-30 14:16:36.750981+00,1183375223,548883,0
0,954493183,216439,462715,1,2023-08-01,3600.0000000,204564464,2023-07-30 14:16:36.750981+00,1183375453,549233,0
0,954493183,216439,462715,1,2023-08-02,3600.0000000,204564465,2023-07-30 14:16:36.750981+00,1183375456,549233,0
0,954493183,216439,462715,1,2023-08-03,3600.0000000,204564466,2023-07-30 14:16:36.750981+00,1183375458,549233,0
0,954493183,216439,462715,1,2023-08-04,3600.0000000,204564467,2023-07-30 14:16:36.750981+00,1183375460,549233,0
0,954493183,216439,462715,1,2023-08-05,3600.0000000,204564468,2023-07-30 14:16:36.750981+00,1183375462,549233,0
0,954493183,216439,462715,1,2023-08-06,3600.0000000,204564469,2023-07-30 14:16:36.750981+00,1183375465,549233,0
0,954493183,216439,462715,1,2023-08-07,3600.0000000,204564470,2023-07-30 14:16:36.750981+00,1183375469,549233,0
0,954493183,216439,462715,1,2023-08-08,3600.0000000,204564471,2023-07-30 14:16:36.750981+00,1183375472,549233,0
0,954493183,216439,462715,1,2023-08-09,3600.0000000,204564472,2023-07-30 14:16:36.750981+00,1183375474,549233,0
0,954493183,216439,462715,1,2023-08-10,3600.0000000,204564473,2023-07-30 14:16:36.750981+00,1183375477,549233,0
0,954493183,216439,462715,1,2023-08-11,3600.0000000,204564474,2023-07-30 14:16:36.750981+00,1183375481,549233,0
0,954493183,216439,462715,1,2023-08-12,3600.0000000,204564475,2023-07-30 14:16:36.750981+00,1183375485,549233,0
0,954493183,216439,462715,1,2023-08-13,3600.0000000,204564476,2023-07-30 14:16:36.750981+00,1183375489,549233,0
0,954493183,216439,462715,1,2023-08-14,3600.0000000,204564477,2023-07-30 14:16:36.750981+00,1183375493,549233,0
0,954493183,216439,462715,1,2023-08-15,3600.0000000,204564478,2023-07-30 14:16:36.750981+00,1183375497,549233,0
0,954493183,216439,462715,1,2023-08-16,3600.0000000,204564479,2023-07-30 14:16:36.750981+00,1183375501,549233,0
0,954493183,216439,462715,1,2023-08-17,3600.0000000,204564480,2023-07-30 14:16:36.750981+00,1183375504,549233,0
0,954493183,216439,462715,1,2023-08-18,3600.0000000,204564481,2023-07-30 14:16:36.750981+00,1183375506,549233,0
0,954493183,216439,462715,1,2023-08-19,3600.0000000,204564482,2023-07-30 14:16:36.750981+00,1183375508,549233,0
0,954493183,216439,462715,1,2023-08-20,3600.0000000,204564483,2023-07-30 14:16:36.750981+00,1183375511,549233,0
0,954493183,216439,462715,1,2023-08-21,3600.0000000,204564484,2023-07-30 14:16:36.750981+00,1183375514,549233,0
0,954493183,216439,462715,1,2023-08-22,3600.0000000,204564485,2023-07-30 14:16:36.750981+00,1183375518,549233,0
0,954493183,216439,462715,1,2023-08-23,3600.0000000,204564486,2023-07-30 14:16:36.750981+00,1183375520,549233,0
0,954493183,216439,462715,1,2023-08-24,3600.0000000,204564487,2023-07-30 14:16:36.750981+00,1183375525,549233,0
0,954493183,216439,462715,1,2023-08-25,3600.0000000,204564488,2023-07-30 14:16:36.750981+00,1183375527,549233,0
0,954493183,216439,462715,1,2023-08-26,3600.0000000,204564489,2023-07-30 14:16:36.750981+00,1183375531,549233,0
0,954493183,216439,462715,1,2023-08-27,3600.0000000,204564490,2023-07-30 14:16:36.750981+00,1183375535,549233,0
0,954493183,216439,462715,1,2023-08-28,3600.0000000,204564491,2023-07-30 14:16:36.750981+00,1183375540,549233,0
0,954493183,216439,462715,1,2023-08-29,3600.0000000,204564492,2023-07-30 14:16:36.750981+00,1183375546,549233,0
0,954493183,216439,462715,1,2023-08-30,3600.0000000,204564493,2023-07-30 14:16:36.750981+00,1183375552,549233,0
0,954493183,216439,462715,1,2023-08-31,3600.0000000,204564494,2023-07-30 14:16:36.750981+00,1183375558,549233,0
0,954493183,216439,462715,2,2023-08-01,3600.0000000,204564985,2023-07-30 14:16:36.750981+00,1183375344,549234,0
0,954493183,216439,462715,2,2023-08-02,3600.0000000,204564986,2023-07-30 14:16:36.750981+00,1183375346,549234,0
0,954493183,216439,462715,2,2023-08-03,3600.0000000,204564987,2023-07-30 14:16:36.750981+00,1183375347,549234,0
0,954493183,216439,462715,2,2023-08-04,3600.0000000,204564988,2023-07-30 14:16:36.750981+00,1183375350,549234,0
0,954493183,216439,462715,2,2023-08-05,3600.0000000,204564989,2023-07-30 14:16:36.750981+00,1183375353,549234,0
0,954493183,216439,462715,2,2023-08-06,3600.0000000,204564990,2023-07-30 14:16:36.750981+00,1183375357,549234,0
0,954493183,216439,462715,2,2023-08-07,3600.0000000,204564991,2023-07-30 14:16:36.750981+00,1183375360,549234,0
0,954493183,216439,462715,2,2023-08-08,3600.0000000,204564992,2023-07-30 14:16:36.750981+00,1183375364,549234,0
0,954493183,216439,462715,2,2023-08-09,3600.0000000,204564993,2023-07-30 14:16:36.750981+00,1183375367,549234,0
0,954493183,216439,462715,2,2023-08-10,3600.0000000,204564994,2023-07-30 14:16:36.750981+00,1183375371,549234,0
0,954493183,216439,462715,2,2023-08-11,3600.0000000,204564995,2023-07-30 14:16:36.750981+00,1183375374,549234,0
0,954493183,216439,462715,2,2023-08-12,3600.0000000,204564996,2023-07-30 14:16:36.750981+00,1183375376,549234,0
0,954493183,216439,462715,2,2023-08-13,3600.0000000,204564997,2023-07-30 14:16:36.750981+00,1183375379,549234,0
0,954493183,216439,462715,2,2023-08-14,3600.0000000,204564998,2023-07-30 14:16:36.750981+00,1183375382,549234,0
0,954493183,216439,462715,2,2023-08-15,3600.0000000,204564999,2023-07-30 14:16:36.750981+00,1183375385,549234,0
0,954493183,216439,462715,2,2023-08-16,3600.0000000,204565000,2023-07-30 14:16:36.750981+00,1183375386,549234,0
0,954493183,216439,462715,2,2023-08-17,3600.0000000,204565001,2023-07-30 14:16:36.750981+00,1183375387,549234,0
0,954493183,216439,462715,2,2023-08-18,3600.0000000,204565002,2023-07-30 14:16:36.750981+00,1183375390,549234,0
0,954493183,216439,462715,2,2023-08-19,3600.0000000,204565003,2023-07-30 14:16:36.750981+00,1183375391,549234,0
0,954493183,216439,462715,2,2023-08-20,3600.0000000,204565004,2023-07-30 14:16:36.750981+00,1183375393,549234,0
0,954493183,216439,462715,2,2023-08-21,3600.0000000,204565005,2023-07-30 14:16:36.750981+00,1183375395,549234,0
0,954493183,216439,462715,2,2023-08-22,3600.0000000,204565006,2023-07-30 14:16:36.750981+00,1183375398,549234,0
0,954493183,216439,462715,2,2023-08-23,3600.0000000,204565007,2023-07-30 14:16:36.750981+00,1183375399,549234,0
0,954493183,216439,462715,2,2023-08-24,3600.0000000,204565008,2023-07-30 14:16:36.750981+00,1183375401,549234,0
0,954493183,216439,462715,2,2023-08-25,3600.0000000,204565009,2023-07-30 14:16:36.750981+00,1183375403,549234,0
0,954493183,216439,462715,2,2023-08-26,3600.0000000,204565010,2023-07-30 14:16:36.750981+00,1183375405,549234,0
0,954493183,216439,462715,2,2023-08-27,3600.0000000,204565011,2023-07-30 14:16:36.750981+00,1183375407,549234,0
0,954493183,216439,462715,2,2023-08-28,3600.0000000,204565012,2023-07-30 14:16:36.750981+00,1183375408,549234,0
0,954493183,216439,462715,2,2023-08-29,3600.0000000,204565013,2023-07-30 14:16:36.750981+00,1183375410,549234,0
0,954493183,216439,462715,2,2023-08-30,3600.0000000,204565014,2023-07-30 14:16:36.750981+00,1183375412,549234,0
0,954493183,216439,462715,2,2023-08-31,3600.0000000,204565015,2023-07-30 14:16:36.750981+00,1183375413,549234,0
0,954493183,216441,462727,1,2023-08-01,3600.0000000,204565506,2023-07-30 14:16:36.750981+00,1183375601,549237,0
0,954493183,216441,462727,1,2023-08-02,3600.0000000,204565507,2023-07-30 14:16:36.750981+00,1183375605,549237,0
0,954493183,216441,462727,1,2023-08-03,3600.0000000,204565508,2023-07-30 14:16:36.750981+00,1183375607,549237,0
0,954493183,216441,462727,1,2023-08-04,3600.0000000,204565509,2023-07-30 14:16:36.750981+00,1183375610,549237,0
0,954493183,216441,462727,1,2023-08-05,3600.0000000,204565510,2023-07-30 14:16:36.750981+00,1183375612,549237,0
0,954493183,216441,462727,1,2023-08-06,3600.0000000,204565511,2023-07-30 14:16:36.750981+00,1183375614,549237,0
0,954493183,216441,462727,1,2023-08-07,3600.0000000,204565512,2023-07-30 14:16:36.750981+00,1183375617,549237,0
0,954493183,216441,462727,1,2023-08-08,3600.0000000,204565513,2023-07-30 14:16:36.750981+00,1183375620,549237,0
0,954493183,216441,462727,1,2023-08-09,3600.0000000,204565514,2023-07-30 14:16:36.750981+00,1183375621,549237,0
0,954493183,216441,462727,1,2023-08-10,3600.0000000,204565515,2023-07-30 14:16:36.750981+00,1183375624,549237,0
0,954493183,216441,462727,1,2023-08-11,3600.0000000,204565516,2023-07-30 14:16:36.750981+00,1183375626,549237,0
0,954493183,216441,462727,1,2023-08-12,3600.0000000,204565517,2023-07-30 14:16:36.750981+00,1183375630,549237,0
0,954493183,216441,462727,1,2023-08-13,3600.0000000,204565518,2023-07-30 14:16:36.750981+00,1183375633,549237,0
0,954493183,216441,462727,1,2023-08-14,3600.0000000,204565519,2023-07-30 14:16:36.750981+00,1183375637,549237,0
0,954493183,216441,462727,1,2023-08-15,3600.0000000,204565520,2023-07-30 14:16:36.750981+00,1183375640,549237,0
0,954493183,216441,462727,1,2023-08-16,3600.0000000,204565521,2023-07-30 14:16:36.750981+00,1183375643,549237,0
0,954493183,216441,462727,1,2023-08-17,3600.0000000,204565522,2023-07-30 14:16:36.750981+00,1183375646,549237,0
0,954493183,216441,462727,1,2023-08-18,3600.0000000,204565523,2023-07-30 14:16:36.750981+00,1183375650,549237,0
0,954493183,216441,462727,1,2023-08-19,3600.0000000,204565524,2023-07-30 14:16:36.750981+00,1183375653,549237,0
0,954493183,216441,462727,1,2023-08-20,3600.0000000,204565525,2023-07-30 14:16:36.750981+00,1183375657,549237,0
0,954493183,216441,462727,1,2023-08-21,3600.0000000,204565526,2023-07-30 14:16:36.750981+00,1183375661,549237,0
0,954493183,216441,462727,1,2023-08-22,3600.0000000,204565527,2023-07-30 14:16:36.750981+00,1183375664,549237,0
0,954493183,216441,462727,1,2023-08-23,3600.0000000,204565528,2023-07-30 14:16:36.750981+00,1183375666,549237,0
0,954493183,216441,462727,1,2023-08-24,3600.0000000,204565529,2023-07-30 14:16:36.750981+00,1183375671,549237,0
0,954493183,216441,462727,1,2023-08-25,3600.0000000,204565530,2023-07-30 14:16:36.750981+00,1183375678,549237,0
0,954493183,216441,462727,1,2023-08-26,3600.0000000,204565531,2023-07-30 14:16:36.750981+00,1183375680,549237,0
0,954493183,216441,462727,1,2023-08-27,3600.0000000,204565532,2023-07-30 14:16:36.750981+00,1183375684,549237,0
0,954493183,216441,462727,1,2023-08-28,3600.0000000,204565533,2023-07-30 14:16:36.750981+00,1183375687,549237,0
0,954493183,216441,462727,1,2023-08-29,3600.0000000,204565534,2023-07-30 14:16:36.750981+00,1183375692,549237,0
0,954493183,216441,462727,1,2023-08-30,3600.0000000,204565535,2023-07-30 14:16:36.750981+00,1183375693,549237,0
0,954493183,216441,462727,1,2023-08-31,3600.0000000,204565536,2023-07-30 14:16:36.750981+00,1183375697,549237,0
0,954493183,216441,462727,2,2023-08-01,3600.0000000,204566027,2023-07-30 14:16:36.750981+00,1183375734,549238,0
0,954493183,216441,462727,2,2023-08-02,3600.0000000,204566028,2023-07-30 14:16:36.750981+00,1183375737,549238,0
0,954493183,216441,462727,2,2023-08-03,3600.0000000,204566029,2023-07-30 14:16:36.750981+00,1183375741,549238,0
0,954493183,216441,462727,2,2023-08-04,3600.0000000,204566030,2023-07-30 14:16:36.750981+00,1183375744,549238,0
0,954493183,216441,462727,2,2023-08-05,3600.0000000,204566031,2023-07-30 14:16:36.750981+00,1183375746,549238,0
0,954493183,216441,462727,2,2023-08-06,3600.0000000,204566032,2023-07-30 14:16:36.750981+00,1183375749,549238,0
0,954493183,216441,462727,2,2023-08-07,3600.0000000,204566033,2023-07-30 14:16:36.750981+00,1183375752,549238,0

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-09-25 15:42:26 -0400, Tom Lane wrote:
> I just did a git bisect run to discover when the failure documented
> in bug #18130 [1] started.  And the answer is commit 82a4edabd.
> Now, it's pretty obvious that that commit didn't in itself cause
> problems like this:
> 
> postgres=# \copy test from 'bug18130.csv' csv
> ERROR:  could not read block 5 in file "base/5/17005": read only 0 of 8192 bytes
> CONTEXT:  COPY test, line 472: "0,185647715,222655,489637,2,2023-07-31,9100.0000000,302110385,2023-07-30
14:16:36.750981+00,14026347..."

Ugh.


> IMO there must be some very nasty bug lurking in the new
> multiple-block extension logic, that happens to be exposed by this
> test case with 82a4edabd's adjustments to the when-to-extend choices
> but wasn't before that.

> To save other people the trouble of extracting the in-line data
> in the bug submission, I've attached the test files I was using.

Thanks, looking at this now.


> The DDL is simplified slightly from what was submitted.  I'm not
> entirely sure why a no-op trigger is needed to provoke the bug...

A trigger might prevent using the multi-insert API, which would lead to
different execution paths...


Greetings,

Andres Freund



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-09-25 12:48:30 -0700, Andres Freund wrote:
> On 2023-09-25 15:42:26 -0400, Tom Lane wrote:
> > I just did a git bisect run to discover when the failure documented
> > in bug #18130 [1] started.  And the answer is commit 82a4edabd.
> > Now, it's pretty obvious that that commit didn't in itself cause
> > problems like this:
> > 
> > postgres=# \copy test from 'bug18130.csv' csv
> > ERROR:  could not read block 5 in file "base/5/17005": read only 0 of 8192 bytes
> > CONTEXT:  COPY test, line 472: "0,185647715,222655,489637,2,2023-07-31,9100.0000000,302110385,2023-07-30
14:16:36.750981+00,14026347..."
> 
> Ugh.
> 
> 
> > IMO there must be some very nasty bug lurking in the new
> > multiple-block extension logic, that happens to be exposed by this
> > test case with 82a4edabd's adjustments to the when-to-extend choices
> > but wasn't before that.
> 
> > To save other people the trouble of extracting the in-line data
> > in the bug submission, I've attached the test files I was using.
> 
> Thanks, looking at this now.

(had to switch locations in between)

Uh, huh.  The problem is that COPY uses a single BulkInsertState for multiple
partitions. Which to me seems to run counter to the following comment:
 *    The caller can also provide a BulkInsertState object to optimize many
 *    insertions into the same relation.  This keeps a pin on the current
 *    insertion target page (to save pin/unpin cycles) and also passes a
 *    BULKWRITE buffer selection strategy object to the buffer manager.
 *    Passing NULL for bistate selects the default behavior.

The reason this doesn't cause straight up corruption due to reusing a pin from
another relation is that b1ecb9b3fcfb added ReleaseBulkInsertStatePin() and a
call to it. But I didn't make ReleaseBulkInsertStatePin() reset the bulk
insertion state, which is what leads to the errors from the bug report.

Resetting the relevant BulkInsertState fields fixes the problem. But I'm not
sure that's the right fix. ISTM that independent of whether we fix this via
ReleaseBulkInsertStatePin() resetting the fields or via not reusing
BulkInsertState, we should add assertions defending against future issues like
this (e.g. by adding a relation field to BulkInsertState in cassert builds,
and asserting that the relation is the same as in prior calls unless
ReleaseBulkInsertStatePin() has been called).

Greetings,

Andres Freund



Andres Freund <andres@anarazel.de> writes:
>> On 2023-09-25 15:42:26 -0400, Tom Lane wrote:
>>> I just did a git bisect run to discover when the failure documented
>>> in bug #18130 [1] started.  And the answer is commit 82a4edabd.

> Uh, huh.  The problem is that COPY uses a single BulkInsertState for multiple
> partitions. Which to me seems to run counter to the following comment:
>  *    The caller can also provide a BulkInsertState object to optimize many
>  *    insertions into the same relation.  This keeps a pin on the current
>  *    insertion target page (to save pin/unpin cycles) and also passes a
>  *    BULKWRITE buffer selection strategy object to the buffer manager.
>  *    Passing NULL for bistate selects the default behavior.

> The reason this doesn't cause straight up corruption due to reusing a pin from
> another relation is that b1ecb9b3fcfb added ReleaseBulkInsertStatePin() and a
> call to it. But I didn't make ReleaseBulkInsertStatePin() reset the bulk
> insertion state, which is what leads to the errors from the bug report.

> Resetting the relevant BulkInsertState fields fixes the problem. But I'm not
> sure that's the right fix. ISTM that independent of whether we fix this via
> ReleaseBulkInsertStatePin() resetting the fields or via not reusing
> BulkInsertState, we should add assertions defending against future issues like
> this (e.g. by adding a relation field to BulkInsertState in cassert builds,
> and asserting that the relation is the same as in prior calls unless
> ReleaseBulkInsertStatePin() has been called).

Ping?  We really ought to have a fix for this committed in time for
16.1.

            regards, tom lane



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-10-12 11:44:09 -0400, Tom Lane wrote:
> Andres Freund <andres@anarazel.de> writes:
> >> On 2023-09-25 15:42:26 -0400, Tom Lane wrote:
> >>> I just did a git bisect run to discover when the failure documented
> >>> in bug #18130 [1] started.  And the answer is commit 82a4edabd.
> 
> > Uh, huh.  The problem is that COPY uses a single BulkInsertState for multiple
> > partitions. Which to me seems to run counter to the following comment:
> >  *    The caller can also provide a BulkInsertState object to optimize many
> >  *    insertions into the same relation.  This keeps a pin on the current
> >  *    insertion target page (to save pin/unpin cycles) and also passes a
> >  *    BULKWRITE buffer selection strategy object to the buffer manager.
> >  *    Passing NULL for bistate selects the default behavior.
> 
> > The reason this doesn't cause straight up corruption due to reusing a pin from
> > another relation is that b1ecb9b3fcfb added ReleaseBulkInsertStatePin() and a
> > call to it. But I didn't make ReleaseBulkInsertStatePin() reset the bulk
> > insertion state, which is what leads to the errors from the bug report.
> 
> > Resetting the relevant BulkInsertState fields fixes the problem. But I'm not
> > sure that's the right fix. ISTM that independent of whether we fix this via
> > ReleaseBulkInsertStatePin() resetting the fields or via not reusing
> > BulkInsertState, we should add assertions defending against future issues like
> > this (e.g. by adding a relation field to BulkInsertState in cassert builds,
> > and asserting that the relation is the same as in prior calls unless
> > ReleaseBulkInsertStatePin() has been called).
> 
> Ping?  We really ought to have a fix for this committed in time for
> 16.1.

I kind of had hoped somebody would comment on the approach.  Given that nobody
has, I'll push the minimal fix of resetting the state in
ReleaseBulkInsertStatePin(), even though I think architecturally that's not
great.

Greetings,

Andres Freund



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-10-12 09:24:19 -0700, Andres Freund wrote:
> On 2023-10-12 11:44:09 -0400, Tom Lane wrote:
> > Andres Freund <andres@anarazel.de> writes:
> > >> On 2023-09-25 15:42:26 -0400, Tom Lane wrote:
> > >>> I just did a git bisect run to discover when the failure documented
> > >>> in bug #18130 [1] started.  And the answer is commit 82a4edabd.
> > 
> > > Uh, huh.  The problem is that COPY uses a single BulkInsertState for multiple
> > > partitions. Which to me seems to run counter to the following comment:
> > >  *    The caller can also provide a BulkInsertState object to optimize many
> > >  *    insertions into the same relation.  This keeps a pin on the current
> > >  *    insertion target page (to save pin/unpin cycles) and also passes a
> > >  *    BULKWRITE buffer selection strategy object to the buffer manager.
> > >  *    Passing NULL for bistate selects the default behavior.
> > 
> > > The reason this doesn't cause straight up corruption due to reusing a pin from
> > > another relation is that b1ecb9b3fcfb added ReleaseBulkInsertStatePin() and a
> > > call to it. But I didn't make ReleaseBulkInsertStatePin() reset the bulk
> > > insertion state, which is what leads to the errors from the bug report.
> > 
> > > Resetting the relevant BulkInsertState fields fixes the problem. But I'm not
> > > sure that's the right fix. ISTM that independent of whether we fix this via
> > > ReleaseBulkInsertStatePin() resetting the fields or via not reusing
> > > BulkInsertState, we should add assertions defending against future issues like
> > > this (e.g. by adding a relation field to BulkInsertState in cassert builds,
> > > and asserting that the relation is the same as in prior calls unless
> > > ReleaseBulkInsertStatePin() has been called).
> > 
> > Ping?  We really ought to have a fix for this committed in time for
> > 16.1.
> 
> I kind of had hoped somebody would comment on the approach.  Given that nobody
> has, I'll push the minimal fix of resetting the state in
> ReleaseBulkInsertStatePin(), even though I think architecturally that's not
> great.

I spent some time working on a test that shows the problem more cheaply than
the case upthread. I think it'd be desirable to have a test that's likely to
catch an issue like this fairly quickly. We've had other problems in this
realm before - there's only a single test that fails if I remove the
ReleaseBulkInsertStatePin() call, and I don't think that's guaranteed at all.

I'm a bit on the fence on how large to make the relation. For me the bug
triggers when filling both relations up to the 3rd block, but how many rows
that takes is somewhat dependent on space utilization on the page and stuff.

Right now the test uses data/desc.data and ends up with 328kB and 312kB in two
partitions. Alternatively I could make the test create a new file to load with
copy that has fewer rows than data/desc.data - I didn't see another data file
that works conveniently and has fewer rows.  The copy is reasonably fast, even
under something as expensive as rr (~60ms). So I'm inclined to just go with
that?

Greetings,

Andres Freund



Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-10-13 10:39:10 -0700, Andres Freund wrote:
> On 2023-10-12 09:24:19 -0700, Andres Freund wrote:
> > I kind of had hoped somebody would comment on the approach.  Given that nobody
> > has, I'll push the minimal fix of resetting the state in
> > ReleaseBulkInsertStatePin(), even though I think architecturally that's not
> > great.
> 
> I spent some time working on a test that shows the problem more cheaply than
> the case upthread. I think it'd be desirable to have a test that's likely to
> catch an issue like this fairly quickly. We've had other problems in this
> realm before - there's only a single test that fails if I remove the
> ReleaseBulkInsertStatePin() call, and I don't think that's guaranteed at all.
> 
> I'm a bit on the fence on how large to make the relation. For me the bug
> triggers when filling both relations up to the 3rd block, but how many rows
> that takes is somewhat dependent on space utilization on the page and stuff.
> 
> Right now the test uses data/desc.data and ends up with 328kB and 312kB in two
> partitions. Alternatively I could make the test create a new file to load with
> copy that has fewer rows than data/desc.data - I didn't see another data file
> that works conveniently and has fewer rows.  The copy is reasonably fast, even
> under something as expensive as rr (~60ms). So I'm inclined to just go with
> that?

Patch with fix and test attached (0001).

Given how easy a missing ReleaseBulkInsertStatePin() can cause corruption (not
due to this bug, but the issue fixed in b1ecb9b3fcf), I think we should
consider adding an assertion along the lines of 0002 to HEAD. Perhaps adding a
new bufmgr.c function to avoid having to get the fields in the buffer tag we
don't care about. Or perhaps we should just promote the check to an elog, we
already call BufferGetBlockNumber(), using BufferGetTag() instead doesn't cost
much more.

Greetings,

Andres Freund

Attachment

Re: Performance degradation on concurrent COPY into a single relation in PG16.

From
Andres Freund
Date:
Hi,

On 2023-10-13 11:30:35 -0700, Andres Freund wrote:
> On 2023-10-13 10:39:10 -0700, Andres Freund wrote:
> > On 2023-10-12 09:24:19 -0700, Andres Freund wrote:
> > > I kind of had hoped somebody would comment on the approach.  Given that nobody
> > > has, I'll push the minimal fix of resetting the state in
> > > ReleaseBulkInsertStatePin(), even though I think architecturally that's not
> > > great.
> > 
> > I spent some time working on a test that shows the problem more cheaply than
> > the case upthread. I think it'd be desirable to have a test that's likely to
> > catch an issue like this fairly quickly. We've had other problems in this
> > realm before - there's only a single test that fails if I remove the
> > ReleaseBulkInsertStatePin() call, and I don't think that's guaranteed at all.
> > 
> > I'm a bit on the fence on how large to make the relation. For me the bug
> > triggers when filling both relations up to the 3rd block, but how many rows
> > that takes is somewhat dependent on space utilization on the page and stuff.
> > 
> > Right now the test uses data/desc.data and ends up with 328kB and 312kB in two
> > partitions. Alternatively I could make the test create a new file to load with
> > copy that has fewer rows than data/desc.data - I didn't see another data file
> > that works conveniently and has fewer rows.  The copy is reasonably fast, even
> > under something as expensive as rr (~60ms). So I'm inclined to just go with
> > that?
> 
> Patch with fix and test attached (0001).

Pushed that.

Greetings,

Andres