I don't even know where to begin in terms of designing the delivery chain
around transactions. Could we do it as simply as adding functions...

    void db_begin_transaction(void);
    void db_flush_transaction(void); (or db_commit_...?)

and then calling these functions before and after each major section of
database code? For the delivery chain, we could do it inside of
insert_message(). For dbmail-smtp, this basically means that the execution of
the whole program is within one transaction. For dbmail-lmtpd, it means that
each message is delivered within a transaction but the miscellaneous queries
before the main message delivery chain are not transacted. For MySQL, these
functions would be noops.

Thing that might work?

Aaron


Thomas Mueller <[EMAIL PROTECTED]> said:

> Hi Aaron,
> 
> > Do you have any way of narrowing this down to specific queries that are
> > taking the longest and/or are being executed the most? That would
> > identify which low-level database functions are being called, then we
> > can just trace our way up the call chain to see who's misbehaving or
> > acting on a flawed design. Also, if you could run similar tests against
> > the latest 1.2, it would help to give a frame of reference, particularly
> > for my delivery chain design.
> 
> That's simple: the main design flaw (actually that's no design flaw I
> think, that's because the so called database MySQL couldn't do
> transactions in the past) is that dbmail doesn't use transaction.
> 
> Because of that AutoCommit is used and whenever dbmail does anySqlQuery
> Postgres does 'BEGIN; anySqlQuery; COMMIT;' - and that is terribly
> slow. To ensure the Durability in ACID the database has to fflush()
> every transaction to stable storage!
> That's why there is only one solution: we have to use transaction.
> 
> With transactions we could remove the integrity checks of
> dbmail-maintenance too, because the database guarantees integrity.
> 
> Anyway, I did a trace of all SQL queries when a mail is copied using
> IMAP. I got 35 SELECT, 4 INSERT, 5 UPDATE (44 db operations to insert
> one mail?).
> 
> When searching for the sequential scan I found something quite
> interesting in the docs: the planer decides for every scan if a seqScan
> is cheaper that an index scan, and does a seqScan even if an index
> exists:
> 
> dbmail=> explain SELECT mailbox_idnr FROM mailboxes WHERE owner_idnr=2;
>                        QUERY PLAN                        
> ---------------------------------------------------------
>  Seq Scan on mailboxes  (cost=0.00..1.06 rows=3 width=8)
>    Filter: (owner_idnr = 2)
> (2 rows)
> 
> The table has an index on owner_idnr.
> 
> So I should repeat this test with a database with several hundred to
> thousand user, several dozen mailboxes for each user and several dozen
> mails in each mailbox to find out if all required indizes are there.
> Did anyone write a script to create such a database?
> 
> But I found a strange query:
> SELECT mailbox_idnr FROM mailboxes WHERE mailbox_idnr = '4' AND
> owner_idnr = '2'
> mailbox_idnr is the primary key so that could be optimized to:
> SELECT 4
> ;-)
> 
> 
> I don't have a 1.2 installation, I'm sorry.
> 
> 
> -- 
> MfG Thomas Mueller - http://www.tmueller.com for pgp key (95702B3B)
> _______________________________________________
> Dbmail-dev mailing list
> Dbmail-dev@dbmail.org
> http://twister.fastxs.net/mailman/listinfo/dbmail-dev
> 



-- 



Reply via email to