-------------------- this takes 4 secs to execute (with 2000 000 rows) WHY?---------------------
DECLARE @AccountId INT
DECLARE @Max INT
DECLARE @MailingLi
One possible item to check is whether the MailingListId and AccountId fields in the tables are of type INT. If, for example, the types are BIGINT, the query optimizer will often not use the index on those fields. When you explicitly define the values instead of using variables, the values are implicitly converted to the proper type.
Make sure the types match.