First of all, this method is suitable only for rare updates. Not as possible replacement of unimplemented UPDATE statement.
Sing-collapsing applies in background while merging. It is not possible to determine, when data will be fully merged.
CollapsingMergeTree is usually used when you could write queries, that are independent of when data will be collapsed, and will it ever be collapsed.
For example, if you write your aggregation query like this:
SELECT key, sum(Sign) AS cnt FROM table GROUP BY key HAVING sum(Sign) > 0
, its result is invariant of sign-collapsing.
So, lags are normal and expected.
Sign-collapsing (both in background and using FINAL) is dependent on order of rows and placement of rows in blocks.
To replace one row with another, you must insert data where negative row is placed before positive row.
In one inserted block there must be no more than one "change" for each key.
If you do INSERT SELECT, SELECT will be run multithreaded by default, and order of rows may be arbitary.
To keep order of rows, you may SET max_threads = 1 before running INSERT SELECT.
See this thread for details:
https://groups.google.com/forum/#!msg/clickhouse/VixyOUD-K68/js6rrmJxAQAJ