Perl DBI извлекает часть базы данных? - PullRequest
0 голосов
/ 05 августа 2010

Я работаю над базой данных, где число строк превышает 1 000 000. У меня есть оператор select, но если я начну с него, у меня быстро кончается память. Вот мои 2 вопроса:

  1. Поскольку я не знаю точный размер базы данных для начала, есть ли способ узнать размер базы данных без выполнения выборки? Компьютер буквально не может его поддержать.

  2. Есть ли способ извлечь, скажем, определенную часть базы данных, например, 5000 для обработки, вместо выполнения отдельной выборки для каждой строки? Я только что закончил тестирование, и чтобы делать его построчно, он выглядел почти на 4 минуты на 1000 проработанных строк, и босс не смотрит благосклонно на программу, выполнение которой займет почти 3 дня.

Это мой код:

while ($i < $rows)
{
    if ($i + $chunkRows < $rows)
    {
        for ($j = 0; $j < $chunkRows; $j++)
        {
            @array = $sth->fetchrow();
            ($nameOne, $numberOne, $numberTwo) = someFunction($lineCount,@array,$nameOne,$numberOne, $numberTwo);
        }
    }
    else #run for loop for j < rows % chunkrows
    $i = $i + $j
}

Ответы [ 2 ]

1 голос
/ 05 августа 2010

Показать ваш код цикла извлечения; могут быть способы улучшить его, в зависимости от того, как вы его называете, и только от того, что вы делаете с данными.

Я считаю, что драйверы баз данных для большинства баз данных будут извлекать сразу несколько строк с сервера; вам нужно будет сказать, какой тип базы данных вы используете, чтобы получить там хороший совет. Если он действительно связывается с сервером для каждой строки, вам придется изменить SQL, чтобы получать наборы строк за раз, но как это сделать, зависит от используемой базы данных.

Ах, DB2. Я не уверен, но я думаю, что вы должны сделать что-то вроде этого:

SELECT *
FROM (SELECT col1, col2, col3, ROW_NUMBER() OVER () AS RN FROM table) AS cols
WHERE RN BETWEEN 1 AND 10000;

и корректируйте числа для каждого запроса, пока не получите пустой результат. Очевидно, это больше работы на стороне базы данных, чтобы он повторил запрос несколько раз; Я не знать, есть ли способы DB2 оптимизировать это (например, временные таблицы).

0 голосов
/ 05 августа 2010

Чтобы получить количество строк в таблице, вы можете использовать

Select count(*) from Table

Чтобы ограничить количество возвращаемых строк, это может быть связано с вашей базой данных.Например, в MySQL есть ключевое слово Limit, которое позволит вам откатить только определенное количество строк.

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

Если у вас нет limit, доступного в вашей базе данных, вы можете сделать такие вещи, как пометить столбец с логическим значением, чтобы указатьчто строка была обработана, а затем повторно запустите ваш запрос для ограниченного числа строк, пропуская те, которые были завершены.Или запишите последний обработанный идентификатор строки, а затем ограничьте ваш следующий запрос строками с большим идентификатором.Есть много способов обойти это.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...