Surface material has the higher priority, but geometric proximity must be taken into account if you have more smaller maps than can fit into a bigger map. The first array is for material, and the second array is for lighting. So each polygon to be rendered has a material number and a light number associated. Then you can set your base material states once, and set your lighting texture states once per secondary hash. Often you may have 2 lots of multtexture passes, and may only use the light hash info to build offset information for rendering the light pass.
Draw calls are extremely expensive, with setup etc.
Profiling will show this is often where most of your time is spent. These calls add a large amount of overhead. But, we have some problems. The best way to pass all your triangles is to use an array or vertex buffer, and some form of indexed primitive, usually discrete triangles. Ooh, that makes it tougher.