SQL-запрос занимает около 10-20 минут - PullRequest
4 голосов
/ 18 июня 2010

У меня есть выбор из (ничего сложного)

Select * from VIEW

Это представление имеет около 6000 записей и около 40 столбцов. Это происходит из базы данных Lotus Notes SQL. Так что мой диск ODBC - это драйвер LotusNotesSQL. Выполнение запроса занимает около 30 секунд. Компания, в которой я работал, использовала EXCEL , чтобы выполнить запрос и записать все на лист. Так как я предполагаю, что он пишет все по одной ячейке, на это уходит до 30-40 минут.

Затем я использовал доступ MS. Я сделал копию локальной таблицы на Access для хранения данных. Моя первая попытка была

INSERT INTO COLUMNS OF LOCAL TABLE
FROM (SELECT * FROM VIEW)

обратите внимание, что это псевдокод. Это прошло успешно, но снова заняло 20 - 30 минут. Затем я использовал VBA для циклического прохождения данных и вставки их вручную (используя оператор INSERT) для каждой отдельной записи. Это заняло около 10 - 15 минут. Это был мой лучший случай.

Что мне нужно сделать после: После того, как у меня есть данные, мне нужно отфильтровать их по отделам. Дело в том, что я помещаю предложение where в SQL-запрос (время увеличивается с 30 секунд до выполнения запроса, примерно до 10 минут + время записи в локальную таблицу / excel). Я не знаю почему. МОЖЕТ, потому что все столбцы - это текстовые столбцы?

Если мы изменим некоторые столбцы на целые, сделает это быстрее с точки зрения предложения where?

Я ищу предложения о том, как подойти к этому. Мой босс сказал, что мы могли бы использовать какое-нибудь решение на основе Java. Это поможет? Я не Java-человек, а C #, и, возможно, я буду убеждать их использовать C #, но я в основном ищу предложения о том, как сократить время. Я уже сократил это с 40 минут до 10 минут, но хочу это меньше 2 минут.

Просто подведем итог:

Запрос занимает около 30 секунд, чтобы превысить

Запрос занимает около 15-40 минут для локального использования в Excel / Access

Нужно меньше 2 минут

Можно использовать решение на основе Java

Вы можете предложить другие решения вместо Java.

Ответы [ 5 ]

2 голосов
/ 18 июня 2010

Вы пытались использовать массовый запрос?У меня была такая же проблема в начале недели с C #;Мне пришлось вставить около 25000 записей, и это заняло около 30 минут.При замене на объемную вставку обрежьте ее примерно до 5 секунд.

1 голос
/ 18 июня 2010

Вы проиндексировали свою таблицу доступа после вставки записей. Это должно значительно ускорить запрос.

0 голосов
/ 18 июня 2010

Я не слишком знаком с Lotus Notes SQL, но тот факт, что у вас есть целые числа в текстовых столбцах, звучит довольно плохо по многим, многим причинам.

  • Целостность данных: одно из этих целых чисел может в конечном итоге быть "foo". Тогда что ты делаешь?
  • Производительность: как правило, целые числа меньше и с ними проще работать для приложений
  • Сортировка: сортируя номера, вы получите 9, 10, 11, 100. Сортируйте их как текст, и вы получите 10, 100, 11, 9

Теперь к вашей проблеме ... Я думаю, что за кулисами Lotus Notes SQL использует базу данных NotesSQL. Я думаю, что вы можете создать индексы в этом самостоятельно. Вы пытались создать индекс для столбцов, которые содержатся в предложении WHERE?

0 голосов
/ 18 июня 2010

Попробуйте что-то вроде этого:

SELECT * INTO NewTable FROM View
0 голосов
/ 18 июня 2010

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

Однако, чтобы действительно улучшить производительность, вам нужно будет еще немного сравнить. В частности, это медленные insert или select ... from view?

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