Final lässt sich noch folgendes sagen:
Ein count(*) vorher und anschließend enen normalen Select ist auch kontraproduktiv, da man 2x die Datenbank abfragen muss. Der count(*) dauert durchaus genauso lange wie der 2. SQL.

Mittels

select count(*) over() as Anzahl
, F.*
from MyFile F
where ....

erhält man beim 1. Fetch bereits die Anzahl Zeilen. Zusätzlich bleibt diese Anzahl dann auch stabil im Ergebnis. Für das befüllen kann man dann z.B. die ersten 2000 Zeilen laden.
Ein where "x between min and max" führt zu einem Tablescan und auch nicht zu einer Indexnutzung.

Und was die ganze Diskussion angeht und 0 oder Blank zulässige Bedingungen sind, so hilft auch hier der Null-Anzeiger:

where ( : P1 : Ind1 is null or Col1 = : P1)
and ( : P2 : Ind2 is null or Col2 = : P2)
usw.

Wenn laut obiger Aussage P1 und P2 beliebige Werte haben können aber ingnoriert werden sollen, so wird die Bedingung eben wahr, wenn Ind1 = -1 ist und somit P1 als NULL angenommen wird und P1 is null somit true ist.
Die Anzahl der Kombinationen ist mit den Nullanzeigern beliebig kombinierbar.