Before going to WMS I would ask yourself why you need to load all 20,000 points.
Are your users able to meaningfully visualize that many points? Would you be better served displaying density of points until a specified zoom has been achieved?
After that - the other answers are your best bet. Use a WMS for that much data.
Edit for comment
You could attack this two ways. I would try to let OpenLayers do the work first as this does not require that you generate, serve, and manage the SLD on another layer. Obviously, if performance is still poor, I would render a new layer showing density and turn the 'true' point layer off until a certain zoom level is achieved.
OpenLayers offers some clustering strategies that should do what you want.