Si tienes pocos elementos, entonces carga el árbol entero. Nosotros tenemos una cache con todos los árboles posibles y los enviamos enteros a la vista (cada árbol no tiene ni 100 elementos), y no paginamos porque son categorías de productos.
Tendrás que desnormalizar un poco para ayudar a la base de datos. Puedes guarda el nivel de anidamiento (en un campo llamado level por ejemplo) para reducir la recursividad y hacer consultas del tipo "select * from nodes where level >= x".
El único problema es que si mueves una rama a otra, tienes que actualizar el nivel de ese elemento y el de toda su descendencia.
Puedes guardar los ancestros en un string y buscar con un like. Por ejemplo: ancestors = "-2-18-21-17-", significa que tu padre es el 17, tu abuelo el 21, etc hasta llegar a la raiz que es el 2 (bueno, la raiz verdadera no existe, el 2 es una de las raices cuyo padre es null). Si quieres buscar la descendencia completa del 18, con buscar por like %-18-% ya lo tienes.
A ver si con esto vas tirando. Por cierto, yo tengo ese libro (tengo todos los de Joe Celkos, el de SQL for Smarties tambien) y solo te digo que es la biblia del sql. Ahí esta todo!