Meh*_*ide 3 sql-server delphi sql-server-2012 firedac
今天我使用AnyDAC(firedac)进行测试,以获取远程SQL Server 2012中可用的所有数据.
我从中获取数据的表有这些简单的列:
1. date - (size 3 byte)
2. time - (max 5 byte)
3. int - (4 byte)
4. bit - (1 byte)
5. int - (4 byte)
6. float - (4 byte)
7. float - (4 byte)
8. int - (4 byte)
9. int - (4 byte)
Run Code Online (Sandbox Code Playgroud)
总行大小应为最多33个字节.
好吧,在获取了我的表中可用的所有行(超过214万行)之后,我检查了FireDAC收到的tcp流量并观察到它大约是280MB,这意味着每行需要大约130字节,而我的预期值接近33字节.
我使用在服务器端定义的存储过程的另一个测量,它在上面的同一个表中有一个插入sql,我使用AnyDAC的Array DML功能调用存储过程.阵列大小为300K,我使用它增加了1880万条记录.用于它的流量实现为2.85 GB.(每行150个字节)
FireDAC或SQL Server端是否有任何配置可以减少流量?显然,这里有一些问题.有什么建议?
谢谢.
信息输出:
================================
Connection definition parameters
================================
User_Name=*****
Password=*******
SERVER=sql.***.gen
ApplicationName=Bist
Workstation=NB
DATABASE=BIST
MARS=yes
DriverID=MSSQL
================================
FireDAC info
================================
Tool = D18 Architect
FireDAC = 8.0.1 (Build 3279)
Platform = Windows 32 bit
Defines = AnyDAC_Unicode;AnyDAC_DBX;AnyDAC_NOLOCALE_META;
AnyDAC_MONITOR
================================
Client info
================================
Loading driver MSSQL ...
Loading odbc32.dll driver manager
Creating ODBC environment handle
Searching for ODBC driver ...
Checking for ODBC driver [SQL SERVER NATIVE CLIENT 11.0] ...
Found [SQL Server Native Client 11.0]
Driver Manager version = 03.80.7601.0000
================================
Session info
================================
Current catalog =
Current schema = dbo
Driver name = sqlncli11.dll
Driver version = 11.00.2100
Driver conformance = 3
DBMS name = Microsoft SQL Server
DBMS version = 11.00.2100
Run Code Online (Sandbox Code Playgroud)
您到SQL数据库服务器的网络流量不仅仅包括您要传输的数据(正如您所看到的那样,收到的流量远远超过行数据)
我开始之前,让我放弃了一些东西:我在没有办法对网络流量和协议方面的专家,但已经花了许多时间玩弄他们有相当多了解不够.我也不太了解特定DAC软件,查询组合等将用于为您提供所请求数据的协议.话虽如此,我无法给出一个确切的例子.但这些概念仍应适用.
与SQL服务器的通信通过各种协议进行,但是为了参数我们将只关注1:TDS(表格数据流)协议.(您可以在以下位置阅读有关SQL Server协议的更多信息:您可以在以下位置阅读有关SQL Server协议的更多信息:http://msdn.microsoft.com/en-us/library/ff420673(v = sql.105).aspx).TDS使用TCP协议,因此TDS数据包只不过是TCP数据包中包含的规范.
对于TCP,通信基本上具有涉及许多请求/响应/确认分组的请求/响应类型的交换.同样,我绝不是这方面的专家,但您可以在http://en.wikipedia.org/wiki/Transmission_Control_Protocol上阅读更多内容.
仅通信的"确认"(或确认)方面会导致超出您引用的行大小的相当大的开销.您可以在下面的图像中看到一个示例,其中客户端应用程序和SQL服务器之间正在进行通信:
Sql server TCP通信http://i43.tinypic.com/2zf1p9l.jpg
另外,在从DB服务器发送到应用程序的实际分组中,TCP分组协议本身内存在大量开销以及TDS分组内的开销.
让我们只关注TDS数据包的开销,这会增加您的整体数据传输负载.以下是TDS数据包中可以找到的所有文档(http://msdn.microsoft.com/en-us/library/dd340794.aspx):
一直以来,您的ACTUAL数据(如上所述)都位于数据包的ROW部分.
下面是显示1个TDS数据包的ASCII版本的屏幕截图.数据包帧的突出显示部分(右侧)是实际的行数据.所有其余的只是开销,使整个通信和辅助事物正常工作.
http://i41.tinypic.com/2nvz2fp.jpg
这甚至不包括TCP本身创建的开销(尽管是必要的).
您正在传输极大量的数据,并且数据总是会有开销.
SELECT TOP 50 .... WHERE ....根据您对数据的实际使用情况,还有许多其他解决方案,但这些只是一些想法.
希望这可以帮助!
| 归档时间: |
|
| 查看次数: |
1723 次 |
| 最近记录: |