The spriteBatch tries to be as efficient as possible.
A spriteBatch is most efficient rendering the same (source)texture over and over. Since this means the GPU doesn't need to receive new texture information (which is the most expensive part of the sprite drawing operation. This is the reason most games pack textures into a texture or sprite atlas.
So in your game, if you can use 1 texture and 1 spriteBatch, that will be the most efficient way of drawing things to the default rendertarget.
//Draw 100 sprites very fast.
spriteBatch.Begin();
for(int i=0;i<100;i++)
{
spriteBatch.Draw(myTexture, new Vector2(i*10,i*2), Color.White);
}
spriteBatch.End();
A 2D sprite is secretly a 3D plane- as today's GPUs draw 3D triangles. Thus a spriteBatch has a lot of parameters that simply convert your 2D coordinates to the 3D system. The spriteBatch.Draw() method has a lot of parameters to set the position, scale and rotation of the sprite. See this answer about spriteBatch.Draw overloads.
//Draw 100 sprites very fast, each one rotated and scaled.
spriteBatch.Begin();
for(int i=0;i<100;i++)
{
spriteBatch.Draw (myTexture, new Vector2(i*10,i*2), null, Color.White, (float)Math.PI/(float)i, new Vector2(myTexture.Width/2,myTexture.Height/2), (float)i/100f, SpriteEffects.None, 0);
}
spriteBatch.End();