2017-01-31 1 views
4

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

У меня есть 40 000 строк в файле Excel с 10 колонками. Данные в этом документе напечатаны вручную.

Существует два основных номера, MO & Закажите, в файле, который я должен проверить первым. Так как они напечатаны вручную, они могут ошибаться.

У меня есть 2 таблицы MO Таблица

moID  MO  Order 
3409 87234 23845 
3410 84562 21342 
etc... (38k rows) 

и

printID moID user date printer 
5   3409 Brad 01/24 printer1 
34  3409 Brad 01/30 printer1 
40  3410 Joe 01/31 printer1 
etc... (9k ish and growing) 

ПРОЦЕСС:

I цикл по каждой строке в моей C# приложение, запрос, чтобы получить MOID. затем запрос, чтобы узнать, существует ли работа, а затем введите Insert. Если moID не может быть найден, я запрашиваю, чтобы журнал был доступен MO & Комбинации заказов, позволяющие им исправить файл позже.

LINK QUERYS:

curMOID = dbReports.MoNumbers.Where(r => r.moNumber == moNum && r.moOrder == orderNum).Select(c => c.id_moNumber).FirstOrDefault(); 
var printJobs = dbReports.PaperPrints.Where(q => q.id_moNumber == curMOID && q.printDate == printDate && q.rowExcelFile == curRow); 
if (printJobs.Where(q => q.printSize == null).Count() == 0) 

ВОПРОС:

мой MOID запрос занимает 250 мс (время приложения, прямой запрос ~ .075ms). То же самое с уже существующим и списком опций. Таким образом, каждая строка занимает около 0,5 секунды. В 40k строк занимает 5 часов. Я должен делать это с пользователем ежедневно. Есть ли лучший способ сделать это или каким-то образом ускорить запрос с помощью приложения.

ответ

2

Да, это болезненный, очень болезненный способ сделать это. Существует безболезненный путь, который быстрее и не требует какого-либо кодирования.

Шаг 1: Экспорт файла в формате CSV

Шаг 2: использование LOAD DATA INFILE
Используйте это, чтобы загрузить данные в фиктивную таблице

Оператор INFILE DATA НАГРУЗКИ читает строки из текстовый файл в таблицу с очень высокой скоростью

Шаг 3: Создать таблицу назначения

Сделать это так же, как манекен таблицы, но убедитесь, что у вас есть уникальный индекс по столбцам, которые вы не хотите продублированы.

Вы можете сделать это с CREATE TABLE LIKE заявление

Шаг 4: Выберите из температуры в финале
да, синтаксис

INSERT IGNORE INTO destination SELECT * FROM tmp_table 

Шаг 5: Используйте multi table delete, чтобы очистить tmp_table

Там у вас есть таблица со строками, которые не могут быть импортирован. И вы сделали это за минуту с нулевыми строками кода

+0

У меня уже есть таблица, поэтому, когда вы говорите, создайте таблицу назначения, это будет моя уже созданная таблица. А фиктивная таблица должна быть таблицей, подобной этой таблице, правильно? – BrinkDaDrink

+0

есть, точно. Было бы создать манекен, как настоящую вещь. – e4c5

+0

Я создал столбец MO & Order на моей временной таблице. Затем создайте запрос для захвата moID и обновления записей. Затем вставьте Ignore. Правильно ли это или возможно выполнить единую проверку moID во внутри вставки INNOR. – BrinkDaDrink

0

Если я не ошибаюсь вы используете moID в качестве уникального ключа, чтобы определить, следует ли вставить, так:

Лучше всего было бы начать дозирование запросы.

Возьмите 5000 moID и запросите их сначала, а затем удалите все, что возвращается с 5000, которые вы отложили, затем выполните объемную вставку того, что когда-либо осталось. Промыть и повторить.

0

Спасибо @ e4c5. Получил меня, куда мне нужно было идти. Хочу дать четкое представление о том, что я сделал. Это использовалось для 5+ ЧАСОВ и теперь занимает 5 СЕКУНД. Я все еще использую программу C# для проверки файла, создания csv и отправки его через LOAD DATA INFILE.

1) Создал CSV с каждой строкой, имеющей информацию на всех таблицах.

  • Используется EPPLUS, чтобы открыть файл. проверьте обязательные поля для типов, которые я хочу, и остановились, если возникла ошибка, поэтому пользователь исправит необходимые поля.

2) создала копию таблицы я хотел вставить в

  • новой таблицы называется StagePrintJob

3) Добавлены колонки для значений МО и Заказ в моем случае.

4) Измененный поле MOID на столе стадии, чтобы быть по умолчанию 0

5) Б запроса LOAD DATA INFILE

  • я усечение (прозрачный) стол поэтому я не должен создавать его каждый раз. Просто повторное использование.

     "TRUNCATE TABLE `" + table + "`; " + 
    
         string.Format("LOAD DATA LOCAL INFILE '{0}' INTO TABLE `" + table + "` ", csvFullName).Replace(@"\", @"\\") + 
         "FIELDS TERMINATED BY ',' " + 
         "ENCLOSED BY '\"' " + 
         "LINES TERMINATED BY '\\r\\n' " + 
         "ignore 1 lines " + 
         "(@printFix, moClient, moNumber, moOrder, printComment, printPrinter, printStatus, printUser, printIssue, printSolution, printQty, rowExcelFile, excelFile) " + 
         "SET printDate = STR_TO_DATE(@printFix, '%m/%d/%Y'); " + 
         "Call PaperPrintProcedure('" + printFileName + "')"; 
    
  • Комплексе printDate является способ, чтобы преобразовать свою строку даты в один, что MySql понимает

  • Я LOCAL на LOAD DATA LOCAL INFILE, чтобы я мог использовать файл на моем локальном компьютере и не иметь сначала отправить его на сервер mySQL.

6) Создана хранимая процедура (можно просто запустить команды). Я сделал запрос на обновление, проверяя мое значение по сравнению с таблицей, которую я хотел.

 update StagePrint test inner join MoNumbers mo on test.moNumber = mo.moNumber && test.moOrder = mo.moOrder 
     set test.id_moNumber = mo.id_moNumber; 

7) Я вставить постановочные строки в моей фактической таблице до тех пор, как он имеет идентификатор для МО в настоящее время.

  • я удалить строки, которые являются такими же, как мой файл, потому что нет хороших идентификаторов в Excel файл не так это работает в настоящее время.

    DELETE FROM `PaperPrint` WHERE `excelFile` = printFileName; 
    
        insert into PaperPrint(id_moNumber, printQty, printDate, printSize, printUser, printPrinter, printStatus, printIssue, printSolution, printComment, rowExcelFile, excelFile) 
        select id_moNumber, printQty, printDate, printSize, printUser, printPrinter, printStatus, printIssue, printSolution, printComment, rowExcelFile, excelFile from StagePrint 
        where StagePrint.id_moNumber <> 0; 
    

8) Опросить StagedTable для любых записей, где ваши ID = 0 и либо исправить или удалить их.

Смежные вопросы