C# Oracle SQL Connection在大型数据集上非常慢
本文关键字:数据集 非常 大型 Oracle SQL Connection | 更新日期: 2023-09-27 18:24:14
感谢您的阅读!
我遇到了一个问题,即我与 Oracle 的连接(250 万条记录(开始时"相对较快",然后速度大大减慢。
以下是我创建连接的方式:(这是两个数据库之间的同步,我的本地数据库可能是Oracle/SQL Server/MySQL——谁知道呢?
private static void ImportSomeData(string sql, DbConnection connection, int batchSize)
{
var command = connection.CreateCommand();
command.CommandText = sql;
//Throw an exception here if needed
var results = command.ExecuteReader();
if (results.HasRows)
{
//...read here.
}
}
批大小是指实体框架,我保持一个连接~200行,然后重新创建(OutOfMemory错误是很有可能的,我只是想看看我们的最佳大小是多少。(我应该注意,在重新创建IRepository
之前,我已经使用了 200-20000 作为批量大小,除了上部大小的内存错误之外,它似乎几乎没有影响(。
下面是日志的示例:
[INFO] [2015-11-24 12:34:21] Imported 1000 Clients
[INFO] [2015-11-24 12:34:24] Imported 2000 Clients
[INFO] [2015-11-24 12:34:26] Imported 3000 Clients
[INFO] [2015-11-24 12:34:29] Imported 4000 Clients
[INFO] [2015-11-24 12:34:33] Imported 5000 Clients
[INFO] [2015-11-24 12:34:37] Imported 6000 Clients
[INFO] [2015-11-24 12:34:41] Imported 7000 Clients
[INFO] [2015-11-24 12:34:45] Imported 8000 Clients
[INFO] [2015-11-24 12:34:49] Imported 9000 Clients
[INFO] [2015-11-24 12:34:55] Imported 10000 Clients
[INFO] [2015-11-24 12:35:00] Imported 11000 Clients
[INFO] [2015-11-24 12:35:05] Imported 12000 Clients
[INFO] [2015-11-24 12:35:11] Imported 13000 Clients
[INFO] [2015-11-24 12:35:17] Imported 14000 Clients
[INFO] [2015-11-24 12:35:23] Imported 15000 Clients
[INFO] [2015-11-24 12:35:30] Imported 16000 Clients
[INFO] [2015-11-24 12:35:37] Imported 17000 Clients
[INFO] [2015-11-24 12:35:44] Imported 18000 Clients
[INFO] [2015-11-24 12:35:51] Imported 19000 Clients
[INFO] [2015-11-24 12:35:59] Imported 20000 Clients
[INFO] [2015-11-24 12:36:06] Imported 21000 Clients
[INFO] [2015-11-24 12:36:14] Imported 22000 Clients
[INFO] [2015-11-24 12:36:21] Imported 23000 Clients
[INFO] [2015-11-24 12:36:31] Imported 24000 Clients
[INFO] [2015-11-24 12:36:42] Imported 25000 Clients
我在三个不同的系统上看到了这种行为。如果您仔细观察时间戳,您会发现随着我们越来越深入结果集,处理 1000 行的时间开始迅速增加,并且似乎并没有趋于平稳。显然有很多地方可以开始对此进行故障排除(它可能不是 Oracle(,但我想知道是否有更好的方法(通过游标/临时表、索引......真的我对这里的任何事情都持开放态度(。
--Example from the server:
[INFO] [2015-11-20 11:09:18] Imported 1000 Clients
[INFO] [2015-11-20 11:10:45] Imported 2000 Clients
...
[INFO] [2015-11-20 18:06:45] Imported 508000 Clients
[INFO] [2015-11-20 18:08:36] Imported 509000 Clients
对此的任何想法将不胜感激。我可以看到目标应用程序中的本地连接是罪魁祸首的情况,但我在数据库中已有记录的结果集上看到了相同的行为(初始推送后快速启动并变慢(,这就是为什么我想知道是否有更好的方法通过记录比较来拉入此记录。
我会接受将 EntityFramework 从应用程序中剔除作为可接受的解决方案,我们只是在寻找一些使数据导入对客户端系统更具可读性的东西。这里没有人对如何加快速度有任何其他想法。
编辑请求了一些SQL,这是一个(不是真正的(示例,这要归功于NDA:
SELECT
a.A AS Field1,
a.B AS Field2,
CASE a.C
WHEN 'StringNum2' THEN 1
WHEN 'StringNum2' THEN 2
...
ELSE -1 AS Field3,
--Another case statement
a.D AS Field9
...
a.G AS Field10
FROM
ImportTableNoJoins a
如果您确保调用 Dispose,您是否注意到任何改进?
private static void ImportSomeData(string sql, DbConnection connection, int batchSize)
{
using(var command = connection.CreateCommand())
{
command.CommandText = sql;
//Throw an exception here if needed
var results = command.ExecuteReader();
if (results.HasRows)
{
//...read here.
}
}
}
另外,您能否向我们展示您正在使用的SQL命令文本? 下面是有关 SQL 查询优化的一些想法: http://www.codeproject.com/Articles/55505/SQL-Query-Optimization-FAQ-Part-With-video-expla
此外,还可以尝试使用性能计数器在 C# 代码或某种工具来分析 Oracle 数据库时查明问题:http://www.codeproject.com/Articles/42001/NET-Best-Practice-No-Using-performance-counters