TSQL performance - JOIN on value BETWEEN min and max
You need an additional index.  In your Fiddle example I added:

CREATE UNIQUE INDEX ix_IP ON Request(CategoryID, IP)

Which covers you for the request table and gets an index seek instead of a clustered index scan.

See how that improves it and let me know.  I'm guessing it'll help quite a bit since the scan on that index is I'm sure not cheap.