【发布时间】:2018-07-12 23:38:53
【问题描述】:
下面是我的应用程序数据库表,其中包含存储在表中的 SQL 查询:QueryStorage
Id Query ConnectionString Rdbms
1 select... Data Source Sql Server
2 select... Data Source Oracle
上表中的 SQL 查询是通过 Web 服务更新的,我们不允许在查询之上进行更新,尽管我们可以在查询之上添加一些内容,如下所示:
查询存储在表中: select id as LinkedColumn, Amount as CompareColumn from Source
从我的 c# 应用调整查询:select Q.LinkedColumn, Q.CompareColumn from (stored sql query) as Q
我正在尝试比较如下 2 个无序列表:
从QueryStorage 表 记录中为Id = 1(Sql server) 执行的查询如下:
select Id as LinkedColumn,CompareColumn from Source
清单 1:
LinkedColumn CompareColumn
1 100
2 200
3 300
4 400
5 500
6 600
7 700
8 800
9 900
10 1000
从 QueryStorage 表记录中为 Id = 2(Oracle) 执行的查询如下:
select Id as LinkedColumn,CompareColumn from Target
清单 2:
LinkedColumn CompareColumn
10 10
9 20
8 30
7 40
6 50
5 60
4 70
3 80
2 90
1 5
我想加入LinkedColumn from source to target,然后在CompareColumn 上进行比较,这应该会给我以下输出:
SrcLinkedColumn SrcCompareColumn TgtLinkedColumn TgtCompareColumn
1 100 1 5
2 200 2 90
逻辑:
var data = (from s in List1.AsEnumerable()
join t in List2.AsEnumerable() on s.Field<string>("LinkedColumn") equals t.Field<string>("LinkedColumn")
where s.Field<decimal>("CompareColumn") != t.Field<decimal>("CompareColumn")
select new
{
srcLinkedcol = s.Field<string>("LinkedColumn"),
srcCompareCol = s.Field<decimal>("CompareColumn"),
tgtLinkedCol = t.Field<string>("LinkedColumn"),
tgtCompareCol = t.Field<decimal>("CompareColumn")
}).ToList();
从源到目标将有数百万条记录,我想与out of memory exception 比较大的问题,我们现在通过将所有数据加载到内存中然后与上面的 linq 查询进行比较。
我想到了以下两种解决方案:
1) 打开 2 个有序数据阅读器。
优点:
- No memory exception
- Fast as there will be 1 to 1 comparision of LinkedColumn for List1 and
List2 records.
缺点:
- Order by is require on LinkedColumns and as i have no control over
query as because it is dumped by webservice in QueryStorage table so
user is explicitly require to submit query with order by on
LinkedColumn.
- Wont work if order by on Linkedcolumn is not present.
- Order by query have performance overhead so because of this user may not include order by on LinkedColumn in query.
2) 通过调整查询并添加OffSet and FetchRowNext 逐块比较记录。这就是我对算法的看法:
但我仍然觉得使用第二种方法我会遇到内存异常问题,因为在某些步骤中,源和目标的数据不匹配,我会将它们存储在缓冲区(数据表或列表等)中以进行下一个块比较。
谁能指导我解决这个问题的好算法或更好的方法?
注意:我不想使用 LinkedServer 和 SSIS。
【问题讨论】:
标签: c# sql algorithm linq ado.net