查找数据库中是否存在300K记录的最快方法

时间:2019-03-10 10:13:49

标签: c# sql-server oracle

我遇到的情况是我有两个数据库,一个是oracle数据库,另一个是sql server。在oracle中我至少有300K,在sql server中我有400K记录。我想检查sql服务器中是否存在oracle数据。我尝试使用每种方法检查oracle中的每条记录(如果sql服务器中是否存在),并且花费了很长时间。我问你是否有另一种方法可以给我相同的结果。我正在使用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) ) 

3 个答案:

答案 0 :(得分:0)

根据我的评论,建议使用第一种方法。

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

OR

您可以通过链接服务器使用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

答案 1 :(得分:0)

大声考虑后,我认为在存储过程中使用下面的子查询比使用Joins更有效,这样做也更有效。我们通常使用等号(=)而不是(<>)的联接。这是标准做法:)。 假设两个表(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)

答案 2 :(得分:0)

您可以尝试这样 1.首先获得一个特定的项目作为与SQL数据匹配的Oracle数据列表 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();