I'll try to explain FIRST/SKIP as good as I can.
In one query you have combination from fields you want to see from one or many tables, combined with some rules
described with JOINs or in WHERE clause. I'll call this combination result1. It's different from the one we see after the execution of a query - I'll call it result2.
Lets say that I have two tables T1 and T2 in relation 1:1 by field D.
SELECT T1.A, T1.B, T2.X, T2.Y FROM T1 INNER JOIN T2 ON T1.D = T2.D WHERE T1.A < 100
T1 have 50 rows with A < 100
Firebird prepares result1 with 50 rows and columns A,B,X,Y, and for that it uses records from tables T1 and T2.
In normal query this result1 is the same with the result2 we see from the query's execution.
FIRST/SKIP works with result1 on the time it's returned. It's applied when you need the result of the query - to use it in union, sub-query or just to see it. FIRST SKIP doesn't work with the table's records. You're working with one table and all records in it. That is why you're a little bit confused - it's like a copy of a table but actually it's a result of a query.
So if my query is like
SELECT FIRST 1 SKIP 5 T1.A, T1.B, T2.X, T2.Y FROM T1 INNER JOIN T2 ON T1.D = T2.D WHERE T1.A < 100
result1 is still 50 rows with columns A,B,X,Y but result2 is only one row - the 6th row from result1.
Firebird first prepares what rows/columns to return according to the JOINS, WHERE, GROUP BY and over that result1 it applies FIRST/SKIP. Because it's unknown what the query will return. FIRST/SKIP fetch FIRST + SKIP records from the result1 and returns only FIRST records as result2.
If I have a table with 1M rows and in field X I have the "number" of the row. 1,2,3.. 1M.
SELECT FIRST 1 SKIP 5 * FROM TABLE WHERE TABLE.X > 900000
without FIRST/SKIP will return only the last 100K records. And when they are ready for fetch Firebird applies the FIRST/SKIP - it'll fetch only 6 records from the table - 900001 to 900006, skipping 900001 to 900005 returning only one row: 900006. After that it'll stop.
But if I use:
SELECT FIRST 1 SKIP 900005 * FROM TABLE.
It will fetch 900K+ records. And the fetch time for 6 and 900K+ records is a little bit different
. In your case first you are fetching 1000 records, in the second 9999 records. It's 10 times more records to fetch from the database - it's normal to be slower.