Самый быстрый способ найти запись 300K существует в базе данных или нет - PullRequest
0 голосов
/ 10 марта 2019

У меня есть ситуация, когда у меня есть две базы данных, одна база данных Oracle, а другая сервер SQL. В оракуле у меня есть по крайней мере 300K, а в sql server у меня 400K запись Я хочу проверить, существуют ли данные Oracle на сервере SQL или нет. Я пытался использовать для каждого метода, где я проверяю каждую запись в 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 голосов
/ 10 марта 2019

Подумав вслух, я думаю, что было бы разумнее использовать приведенный ниже подзапрос в вашей хранимой процедуре, а не использовать соединения, и это также более эффективно.Мы используем соединения обычно со знаком равенства (=), а не наоборот (<>).Это стандартная практика :).Предполагая, что в обеих таблицах (SQL и Oracle) имеется общий столбец с уникальными значениями, используйте приведенный ниже синтаксис подзапроса. Он легко добавит отсутствующие записи в таблицу SQL из таблицы Oracle.Дайте мне знать, если вам нужно подробное объяснение запроса.

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)
0 голосов
/ 10 марта 2019

Вы можете попробовать вот так 1.первый получить конкретный элемент в виде списка, который соответствует данным SQL для данных Oracle. 2. Сопоставить данные Oracle с данными SQL, используя функцию Contains(), и получить список данных, которые соответствуют данным SQL...

Выберите данные столбца для составления списка из обеих таблиц, которые должны быть в обеих таблицах

Пример кода ниже

var oracleCustomerList=_db.tblCustomers.Select(m=>m.coustomerName).ToList();
var sqlCustomerList=db.tblCustomers.Where(x=>oracleCustomerList.Contains(n=>n.coustomerName)).ToList();
0 голосов
/ 10 марта 2019

На мой комментарий рекомендуется первый метод.

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

ИЛИ

Вы можете использоватьтаблица оракула через связанный сервер, но это может оказать небольшое влияние на производительность из-за задержки.

Вы можете вызвать хранимую процедуру с помощью linq.См. Ниже ссылку Stackoverflow.

Доступ к хранимой процедуре с использованием 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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...