REMARK我完全重写了这个问题,因为在探索选项和获得见解时,我意识到问题的根源根本不是我想象的那样。
我使用 Firebird 作为数据库引擎和标准 .Net 提供程序(v.5.11.0)来使用以下代码获取数据:
// myBlob1 is BLOB SUB_TYPE 1 (text field) with some empty, but some
// VERY long stuff (xml-content) which exceeds VARCHAR(32765), but I removed
// those before performing my tests!!!
var tick = Stopwatch.StartNew();
DataTable dataTable = new DataTable();
DbLive.Open();
FbCommand command = new FbCommand("SELECT myBlob FROM MY_TABLE", DbLive);
try {
dataTable.BeginLoadData();
FbDataAdapter fda = new FbDataAdapter(command);
fda.Fill(dataTable);
dataTable.EndLoadData();
}
command.Dispose();
DbLive.Close();
tick.Stop();
Console.WriteLine("Execution time: " + tick.ElapsedMilliseconds + " [ms]");
我正在获取大约 30k 行,总共大约 16Mb 的数据(根据数据库工作台的统计数据),但只有 20k 行包含非空数据。
所以我用简单的方法获取整个内容,然后我使用了cast (VARCHAR(8192))
方法(请注意,在进行测试之前,我删除了所有包含 > 8192 个字符的行)。现在,结果如下:
// Obtained when loading data over wifi, with a bandwidth of about 100Mbps)
// the performance on local machine did not make a big difference!)
No casting: 73287.0788 ms
With casting: 2360.2244 ms
确实有什么不好的事情发生Blobs
这里。我使用 Firebird 3 和压缩测试了性能,但结果并没有好多少(改进很小,但差异仍然是相同的数量级)。
重点是:
1. 如果我使用其他提供商(例如www.ibprovider.com
按照建议,但我无法测试)
2. 这是其他数据库引擎的已知问题吗?或者是否有希望通过更换其他引擎来获得改进?