Отличается ли время выполнения запроса в зависимости от значения другого параметра запроса с огромной таблицей? - PullRequest
0 голосов
/ 22 сентября 2018

Мы используем весеннюю загрузку, SQL-сервер и облако Azure.

Цель состоит в том, чтобы обновлять 2000 записей по партиям в таблице, содержащей 52 миллиона строк, без использования собственного запроса.

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

Пример таблицы,

seq |  id | value
-------------------
1   | A1  | v1  
2   | A1  | v2  
3   | B1  | v3
4   | B1  | v4

... Фактический запросесть,

select * from sample where id=? and value in (?) 
2 parameter will have 2000 strings.

using Spring data JPA repository methods.

A1 имеет 100K записей.B1 имеет 400K записей.

, когда я выполняю запрос со значениями A1 и 2000. Для извлечения потребовалось 17 секунд.с B1 и другими 2000 значениями (которых у A1 нет) для извлечения из приложения потребовалось 70 секунд.

Но когда я выполняю тот же запрос в SSM, это занимает всего 3 секунды.

Это из-за фильтрации B1 из 400K / 52M и A1 из 100K / 52M?

строка подключения имеет, sendStringParametersAsUnicode=false;, и оба столбца также имеют индекс.

Tried CriteriaUpdate для каждой строки, ноте же результаты - 35 с для 2K / 100K / 52M и 2 минуты для 2K / 400K / 52M.поэтому удалите его и теперь пытайтесь это сделать, извлекать все сразу и обновлять все сразу. Любое обновление происходит быстрее, только выборка занимает время.

Примечание. Мы не использовали Spring Batch для этого конкретного процесса из-зазаписи будут считаны из Flatfile, и каждая строка в файле должна быть обновлена ​​в этой таблице.так что есть читатель, чтобы прочитать строку из файла, процессор массажирует DTO и в писателе, пытающемся сделать это update.chunk размера 2000.

1 Ответ

0 голосов
/ 23 сентября 2018

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

Моя строка подключения JDBC в файле свойств имеет sendStringParametersAsUnicode=false;.

Но она фактически выбирается изфайл deploy.yaml, в котором его нет.

sendStringParametersAsUnicode=false;

doc,

Если установлено свойство sendStringParametersAsUnicodeв значение «истина», параметры строки отправляются на сервер в формате Unicode.

Если для свойства sendStringParametersAsUnicode установлено значение «ложь», параметры строки отправляются на сервер в формате, отличном от Unicode, например ASCII / MBCS.вместо Unicode.

Значением по умолчанию для свойства sendStringParametersAsUnicode является «true».

Примечание. Свойство sendStringParametersAsUnicode проверяется только при отправке значения параметра с типами JDBC CHAR, VARCHAR или LONGVARCHARНовые методы национальных символов JDBC 4.0, такие как методы setNString, setNCharacterStream и setNClob для SQLServerPreparedStatement иКлассы SQLServerCallableStatement всегда отправляют значения своих параметров на сервер в Юникоде независимо от значения этого свойства.

Спасибо.

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