【问题标题】:Fastest way to find 300K record exist in database or not查找数据库中是否存在 300K 记录的最快方法
【发布时间】:2019-07-31 20:48:08
【问题描述】:

我有两个数据库,一个是oracle数据库,另一个是sql server。在 oracle 中我至少有 300K,而在 sql server 中我有 400K 记录。我想检查sql server中是否存在oracle数据。我尝试使用每种方法检查oracle中的每条记录是否存在于sql server中,这需要很长时间。我问你是否有另一种方法会给我同样的结果。我正在使用 LINQ 进行查询

                conn.Open();

                cmd = new OdbcCommand()

                {

                    Connection = conn,

                    CommandText = "select c_id, c_name,c_dob,c_email,c_pnumber from customers"

                    CommandType = CommandType.Text

                };

            OdbcDataReader dr = cmd.ExecuteReader();


            while (dr.Read())

            {

           var customers = _db.tblCustomers.FirstOrDefaulst(x 
           =>x.C_ID.Equals(dr.GetValue(0)) 

          if(customers !=null)
          {

          //do something

          }

          else
          {

          tblCustomers customer = new tblCustomers {


             C_name = Convert.ToString(dr.GetValue(1)),
             C_dob = Convert.ToString(dr.GetValue(2)),
             C_email = Convert.ToString(dr.GetValue(3)),
             C_pnumber = Convert.ToString(dr.GetValue(4))
            }
          }

         }

P.S : 这只是为了添加新客户,但我有另一个具有相同逻辑的代码来更新记录,我应该每天运行这些方法

新增记录查询

var customers = _db.tblCustomers.FirstOrDefaulst(x 
               =>x.C_ID.Equals(dr.GetValue(0))  

更新现有记录的查询

var customers = _db.tblCustomers.FirstOrDefaulst(x 
           =>x.C_ID.Equals(dr.GetValue(0)) && x.c_name == dr.GetValue(1) ) 

【问题讨论】:

  • 加载两个数据库中的所有记录(即使只是在临时表中)。加入。
  • 看起来您只是在比较记录的 ID。如果正确,请修改 SQL 语句以仅返回 ID,将 oracle DB 的所有 ID 放入 C# HashSet 中,然后迭代 MSSQL 结果并检查 ID 是否在您从 Oracle DB 创建的 HashSet 中跨度>
  • 如果您能够管理 SQL 服务器,请考虑将 Oracle DB 添加为链接服务器。然后,繁重的工作可以由 DB 完成,而不必使用 C# 代码。
  • 只是为了添加到@christoph 的评论中,如果可能的话,然后将逻辑放在 SQL Server 端的存储过程中,然后从中返回一个值,帮助您识别记录是否存在.然后只需使用 C# 调用该过程。
  • 所以你的意思是我为oracle中存在的每条记录创建一个for循环,然后我调用一个存储过程来比较数据库中是否存在记录?所以存储过程将被调用 300K 次?!

标签: c# sql-server oracle


【解决方案1】:

根据我的评论,推荐第一种方法。

Select A.columns, B.columns from SQL_Table A INNER JOIN Oracle_TABLE B
ON A.common_column = B.common_column

--如果需要的记录可以进一步过滤

and A.column = value  and  B.column = value

您可以通过链接服务器使用 oracle 表,但由于延迟,这可能会对性能产生很小的影响。

您可以使用 linq 调用存储过程。请参阅下面的 Stackoverflow 链接。

Access stored procedure using Linq-to-SQL

或者您可以使用 ADO.NET 调用存储过程。


根据我的评论,使用下面的插入查询。

INSERT INTO SQL_TABLE(write all the column names of 
  SQL_Table where you want to insert value from oracle table)
SELECT Distinct B.Columns from Oracle_TABLE B INNER JOIN SQL_TABLE A
ON A.common_column <> B.common_column

【讨论】:

  • 是的,我明白了。但是如何使用这种方法插入 sql server 中不存在的记录?
  • 假设 SQL 和 Oracle 表中的列数相同,使用下面的插入查询。
  • 假设我在 oracle 表中的列(我所拥有的)比 sql 表中的列多?!
  • 我已修改我的答案以回答您的上述评论。请注意,在加入中我使用了“”(不等于)而不是“=”。
  • 我在答案中添加了 SQL 关键字“Distinct”,只提供唯一记录。作为替代方案,您还可以使用 group by。首先在一些样本数据上进行测试以确保。
【解决方案2】:

在大声思考之后,我认为在存储过程中使用下面的子查询而不是使用连接会更有意义,而且这种方式也更有效。我们通常使用等号(=)而不是相反的方式()使用连接。这是一种标准做法:)。 假设在两个表(SQL 和 Oracle)中都有一个具有唯一值的公共列,请使用以下子查询语法。它将轻松地从 Oracle 表中添加 SQL 表中缺少的记录。 如果您需要查询的详细说明,请告诉我。

INSERT INTO SQL_Table(write all the column names of SQL_Table where you want values)
Select B.columns from Oracle_Table B where B.common_unique_column NOT IN (select A.common_unique_column from SQL_TABLE A)

【讨论】:

  • 再次,先用一些示例数据尝试一下:)
【解决方案3】:

你可以这样试试 1.首先获取与Oracle数据的SQL数据匹配的特定项目作为列表 2.使用Contains()函数将oracle数据与sql数据匹配,得到与sql数据匹配的数据列表...

从两个表中选择一个列数据以列出两个表中必须有的列

示例代码如下

var oracleCustomerList=_db.tblCustomers.Select(m=>m.coustomerName).ToList();
var sqlCustomerList=db.tblCustomers.Where(x=>oracleCustomerList.Contains(n=>n.coustomerName)).ToList();

【讨论】:

    猜你喜欢
    • 2023-03-18
    • 2016-12-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-08-09
    • 2011-11-26
    • 2011-10-06
    相关资源
    最近更新 更多