There's a couple of things at play here.
1. Does SQL Server have your data cached in to memory? Disk access is slow. If your data is already loaded in to memory, then it will be many times faster to "get" the data. By this, I mean that SQL will not have to go to the disk to get it. Without disk activity, this process will be faster.
2. Network latency and bandwidth: Looks like your row is approximately 350 bytes. This represents the maximum/defined size of a row, not the actual size which depends on the amount of data stored in this varchars. Using a guestimate of 200 bytes per row, with 1 M rows, that would be approximately 200 megs going across the network. There's overhead involved so the actual amount may be more than that. Assuming you have a 100 megabit / second network (which is common), 200 megabytes would be approximately 1600 megabits. At 100 megabits per second, you're looking at 16 seconds (optimally) to send the data through the network. This assumes that the network isn't being used for anything else at the time. This time could easily double.
3. Doing something with the data: Once the client application gets the data, it needs to do something with it. Since you mentioned using SQL Server Management Studio to display the results, you MUST consider the amount of time it takes to draw the grid of data. This is no small task and would represent some real time involved. Of course, this also depends on how the application draws the data. If you only draw what is visible on the screen, then this would be very fast because you probably won't see more than a dozen or so rows. This assumes that you have a relatively smart front end application that can save the data in a recordset or arrays and only draw the visible rows and the user scrolls through them. I suspect that SQL Server Management Studio does not cache the data in the application and probably draws all the data to the grid as it receives the data.
Given all this, I would say 30 seconds is reasonable. Anything less than that and you got lucky. More time would not surprise me either. We're talking about a relatively large amount of data here. There are things you can do to speed things up if it's important to do so. You could make sure that your data is always cached in to memory on the SQL Server. To do this, make sure there is plenty of RAM available to the SQL machine so that your data is (probably) always cached in memory. You could also use a gigabit network. Gigabit cards are pretty cheap these days. Assuming your cabling can already accommodate these speeds, this is probably your "biggest bang for the buck". By making the network 10 x faster, you can reduce your 16 seconds to 1.6 seconds (approximately). You could also make sure you have an excellent graphics card in your client computer. Often times draw speed depends on the graphics card. Throwing some hardware at the situation may allow you to get this to be 5x faster (or more).
All things considered, this is an interesting theoretical discussion, but in my opinion, it has limited practical applications because it is rarely necessary to send that much data from the DB to the application. You certainly wouldn't expect the end user to scroll through and look at each row. It's too much data. It could be that the application ultimately save the data to a local disk as an export, but there are better and faster methods for this too. Alternatively, the front end application could be processing the data some how. Depending the processing involved, it may be faster/better to do some of that processing in the SQL so that you only send the results across the wire instead.
I've done a lot of rambling here. Hopefully it makes sense.
-George
Microsoft SQL Server MVP
My Blogs
SQLCop
twitter
"The great things about standards is that there are so many to choose from." - Fortune Cookie Wisdom