Как быстро обновить все строки в таблице с новым значением из программы AC #

1

Мне дали таблицу с более чем 2 миллиардами строк. Он имеет поле для введенного времени, но создатель таблицы сделал это поле строковым полем. Он также не соответствует нормальным соглашениям о сроках времени.

Мне было поручено создать новое поле, которое является полем типа даты и времени, содержащим одно и то же время, но преобразованным в надлежащий формат, чтобы на нем могли выполняться запросы.

В настоящее время я написал консольное приложение на С#, которое ВЫБИРАЕТ верхние 100000 строк, которые еще не были обновлены, а строка за строкой преобразует строку в определенное время. Затем он обновляет каждую из строк.

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

Идеи до сих пор:

  • вместо выбора 100000 строк, выберите 1000000 случайных строк. (может быть какое-то перекрытие, но это выполнило бы работу)
  • эта таблица имеет поле id. Я мог бы сделать выбор, где id modulo 2 == 0 для одной программы, id% 2! = 0 для другого (это может продолжаться для простых чисел и т.д.),
  • получать строки только в пределах диапазона id, который указан для каждой копии программы, которую я запускал
  • добавьте заблокированный столбец, чтобы сообщить моей программе, что поле в настоящее время заблокировано (что будет означать, что оно обрабатывается)

Может ли кто-нибудь предложить лучшее предложение? Улучшить одну из моих?

Благодарю.

UPDATE: пример моей текущей временной строки - 12/ноябрь/2014: 08: 52: 22, и ее нужно преобразовать в 2014-11-12 08:42:22

  • 3
    Почему бы вам не использовать SQL Server для преобразования, а не переходить назад и вперед между базой данных и консольным приложением?
  • 0
    Ваши данные соответствуют одному и тому же формату? Вы должны попытаться использовать сервер SQL для этого: stackoverflow.com/questions/1509977/…
Показать ещё 5 комментариев
Теги:
sql-server

3 ответа

1
Лучший ответ

Итак, вот мое решение, я понятия не имею, насколько эффективен для строк 2mil, если вы хотите сделать это в SQL.

Declare @string varchar(50) = '12/Nov/2014:08:52:22'
SELECT CONVERT(datetime,REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ')
 +' '+
SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)

Позвольте мне немного объяснить вам код

REPLACE(SUBSTRING(@string,0,CHARINDEX ( ':' ,@string , 0)),'/',' ') 

заменяет символы "/" с даты и возвращает 12 ноября 2014 года

 SUBSTRING(@string,CHARINDEX ( ':' ,@string , 0)+1,LEN(@string)),120)

получите время без ":" между датой и временем от вашей начальной строки.

Наконец, добавлено пространство между этими двумя строковыми манипуляциями и преобразовано в datetime.

Выход для запроса выше: '2014-11-12 08: 52: 22.000'

2

Используйте LINQ to SQL и забирайте только определенное количество записей за раз.

Ваш код будет выглядеть примерно так:

using (var db = new MyDbContext()) 
{
    var results = db.GetResultsFromDatabase();
    int take = 100;
    int processed = 0;

    while(processed < results.Count()) 
    {
        var set = results.Skip(processed).Take(take);
        set.ForEach(s => {  
            // update the date
        }

        processed += take;
    }

    db.SubmitChanges();
}
  • 0
    Это по сути то, что я уже делаю. Мне нужно что-то, чтобы можно было запускать одно и то же одновременно, но обрабатывать разные записи.
1

Просто делайте это внутри SQL вместо того, чтобы читать всю базу данных и работать с ней.

используйте следующее:

    UPDATE <TableName>
    SET <dateTime-Date> = CONVERT(datetime, <string-Date>)

проверьте этот сайт для любых спецификаций формата, которые вам бы хотелось: SQL Datetime Conversion

  • 0
    Исходя из моей текущей строки даты, я не верю, что смогу просто конвертировать ее.
  • 0
    Можете ли вы привести пример строки даты? мы могли бы помочь или, по крайней мере, сказать вам, если это конвертируется.
Показать ещё 2 комментария

Ещё вопросы

Сообщество Overcoder
Наверх
Меню