>What does your working copy look like?  Do you have svn:externals? Do
>you have the sqlite3 tool?  What do these commands show:
>
> sqlite3 .svn/wc.db "select count (*) from actual_node"
> sqlite3 .svn/wc.db "select count (*) from nodes"

I think my working copy is fairly typical for a very large project, a
well-balanced tree.  I can get you numbers of files and folders, max
depth, etc., if that's what you're looking for.

I do not have any svn:externals.

Here are my results from sqlite3 for those two queries:
 - actual_node count: 49
 - nodes: 514957

Interestingly, and not surprisingly given the number of rows, the count
from the nodes table took a long time to come back on the first attempt,
maybe a minute.  Doing it again came back in about 2 seconds.  But with
such a large table it certainly makes sense that an index could have a
significant impact on performance.


On Fri, May 4, 2012 at 2:55 PM, Philip Martin <philip.mar...@wandisco.com>wrote:

> Bob Cardillo <bob.cardi...@gmail.com> writes:
>
> > I'm running Subversion 1.7.4.50525 (r1295709) on Windows 7 Pro SP1.
> >
> > I have a large repository, and for clean development flow I've checked
> > out the root locally.  But because of this, when I do:
> >   svn status C:\mycheckout\trunk\folder1\file1.ext
> >
> > it takes a very long time, around 5-6 seconds, to finish.  It doesn't
> > matter if the given file is modified or not.
> >
> > I've run Sysinternals Process Monitor and found that there are hundreds
> > of thousands of ReadFile operations done on \_svn\wc.db.  There are no
> > network accesses of course, and from an analysis of the procmon results
> > it's clear the slowness is from these many wc.db accesses.
> >
> > But why?  I could not find any issue related to this in the issue
> > tracker nor any mention of it in the forums, mailing lists, or elsewhere
> > on the web.
> >
> > One more point of interest.  If I throw --non-recursive in there, as in:
> >   svn status --non-recursive C:\mycheckout\trunk\folder1\file1.ext
> >
> > it comes back immediately, no delay whatsoever.  Since this is a file, I
> > don't get why --non-recursive should make a difference, but there it is.
> >
> > Has anyone seen this?  Any reason I should not add this to the issue
> > tracker for Subversion?
>
> Hmm, I'm not seeing a huge time difference but --non-recursive does have
> a similar effect on Linux:
>
> $ strace -cetrace=read svn st --non-recursive
> subversion/tests/libsvn_wc/wc_db.c
> % time     seconds  usecs/call     calls    errors syscall
> ------ ----------- ----------- --------- --------- ----------------
>  -nan    0.000000           0        99           read
> ------ ----------- ----------- --------- --------- ----------------
> 100.00    0.000000                    99           total
>
> $ strace -cetrace=read svn st ../src/subversion/tests/libsvn_wc/wc_db.c
> % time     seconds  usecs/call     calls    errors syscall
> ------ ----------- ----------- --------- --------- ----------------
> 100.00    0.000025           0      1193           read
> ------ ----------- ----------- --------- --------- ----------------
> 100.00    0.000025                  1193           total
>
> So that has increased the number of read() calls from 99 to 1193!
>
> Using -DSQLITE_DEBUG the difference is this:
>
> DBG: sqlite.c:  66: sql="SELECT IFNULL((SELECT properties FROM actual_node
> a                WHERE a.wc_id = 1 AND A.local_relpath = n.local_relpath),
>               properties),        local_relpath, depth FROM nodes n WHERE
> wc_id = 1   AND ('A/f' = ''        OR local_relpath = 'A/f'        OR
> ((local_relpath) > ('A/f') || '/' AND (local_relpath) < ('A/f') || '0') )
> AND kind = 'dir' AND presence='normal'   AND op_depth=(SELECT MAX(op_depth)
> FROM nodes o                 WHERE o.wc_id = 1 AND o.local_relpath =
> n.local_relpath) "
>
> which is this statement in svn_wc__db_externals_gather_definitions:
>
> -- STMT_SELECT_EXTERNAL_PROPERTIES
> SELECT IFNULL((SELECT properties FROM actual_node a
>               WHERE a.wc_id = ?1 AND A.local_relpath = n.local_relpath),
>              properties),
>       local_relpath, depth
> FROM nodes n
> WHERE wc_id = ?1
>  AND (?2 = ''
>       OR local_relpath = ?2
>       OR IS_STRICT_DESCENDANT_OF(local_relpath, ?2))
>  AND kind = 'dir' AND presence='normal'
>  AND op_depth=(SELECT MAX(op_depth) FROM nodes o
>                WHERE o.wc_id = ?1 AND o.local_relpath = n.local_relpath)
>
> Taking that query out reduces the read() calls back to 99.  Do we need
> another SQLite index?  Can we improve that query?
>
> What does your working copy look like?  Do you have svn:externals? Do
> you have the sqlite3 tool?  What do these commands show:
>
>  sqlite3 .svn/wc.db "select count (*) from actual_node"
>  sqlite3 .svn/wc.db "select count (*) from nodes"
>
> --
> uberSVN: Apache Subversion Made Easy
> http://www.uberSVN.com
>

Reply via email to