Fetching rougly 7Mb of data from SQL server 2008 R2 to a client takes around 5 seconds. The machine is relatively powerful AMD 12 Core, 64Gb RAM, Windows Server 2008, 2 10Gbit cards.
Running the select on the server is even slower, then from client. Copying 7Mb file from that server to a local workstation is around 500ms.
Here is a small reproducer:
--create test table for reproducer
CREATE TABLE [dbo].[Test_Speed](
[ED] [datetime] NULL
) ON [PRIMARY]
--fill test table with data, insert took 3:51 mins
declare @r int
set @r = 1
while (@r < 830000)
begin
insert into [CDB_ODS].[dbo].[Test_Speed] select getdate()
set @r = @r+1
end
--select all records, roughly 7Mb. 4 secs if run on the client, 5 secs on the server (1.4Mb sec)
select ed from [dbo].[Test_Speed]
/*
SELECT on CLIENT
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
Table 'Test_Speed'. Scan count 1, logical reads 1833, physical reads 0, read-ahead reads 0,
lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 281 ms, elapsed time = 4020 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
--- SELECT on SERVER
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
(829999 row(s) affected)
Table 'Test_Speed'. Scan count 1, logical reads 1833, physical reads 0, read-ahead reads 0,
lob logical reads 0, lob physical reads 0, lob read-ahead reads 0.
SQL Server Execution Times:
CPU time = 328 ms, elapsed time = 5369 ms.
SQL Server parse and compile time:
CPU time = 0 ms, elapsed time = 0 ms.
SQL Server Execution Times:
CPU time = 0 ms, elapsed time = 0 ms.
*/
Yes, this seems relatively normal to me. 7Mbytes is a fair amount of data.
Performance depends highly on the client. Of course, things like network speed have an effect. A bigger effect is buffer sizes at various points along the way. For fastest performance, you want SQL Server to send over big batches of results all at once, which get quickly put into the application.
Other options have a big effect as well. In Excel/VBA, there are different methods of bringing data in. If you use a cursor, you want a read-only, read forward cursor. Anything else can be much, much slower. One kind of cursor, for instance, will read the data one row at a time — so latency becomes the dominant factor in performance rather than bandwidth (I think this is updatable cursors, but I’m not positive).
You’ll need to say more about your client and how it accesses the data. This is most likely a client side issue and not a database issue.