Как правильно индексировать таблицу SQL Server с 25 миллионами строк

Простая работа для Windows заключается в использовании «\» вместо «/» в пути. Это означало бы, что последовательность символов «! /» Будет найдена после полного пути. Например:

new URL("jar:file:\\d:\\test1231@#!!!\\test.jar!/images/Logo.png");

Мой код:

File jar = new File(jarPath + "/" + jarName);
URL url = new URL("jar:" + jar.toURI() + "!" + dataFilePath);
InputStream stream = null;
try {
    stream = url.openStream();
} catch (FileNotFoundException e) {
    // Windows fix
    URL urlFix = new URL("jar:" + jar.toURI().toString().replace('/', '\\')
        + "!" + dataFilePath);
    stream = urlFix.openStream();
}

Я использую toURI (), потому что он обрабатывает такие вещи, как пробелы.

Исправления:

Само исправление предназначалось бы для Java, чтобы проверить, существует ли файл, и если не продолжать следующий разделитель (часть!!) URL-адреса до тех пор, пока разделители не будут исчерпаны, а затем выбросите исключение. Поэтому он увидит, что «d: \ test1231 @ # !!» бросает java.io.FileNotFoundException и затем пытается «d: \ test1231 @ # !!! \ test.jar», который существует. Таким образом, не имеет значения, есть ли «!» в пути к файлу или в файлах jar.

В качестве альтернативы «! /» можно переключить на другое, что является незаконным именем файла или чем-то конкретным (например, «jarpath:»).

В качестве альтернативы сделать путь к файлу jar другим параметром.

Примечание:

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

1
задан GregP 10 March 2019 в 18:16
поделиться

2 ответа

Я не думаю, что вы можете сделать здесь много.

Запрос должен прочитать все 25M строк из индекса, чтобы подсчитать их. Тем не менее, 25M строк не так много, и я ожидаю, что на современном оборудовании это займет менее 4 минут. Это только 100 МБ данных для чтения (хорошо, на практике это больше, скажем, 200 МБ, но для считывания 200 МБ с диска не потребуется 4 минуты).

Не загружен ли сервер? Много ли вставок в эту таблицу?

Вы можете сделать небольшое улучшение, определив столбец WhoWon как NOT NULL в таблице. У вас действительно есть значения NULL?

А затем используйте COUNT(*) вместо count(WhoWon) в запросе.

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

0
ответ дан Vladimir Baranov 10 March 2019 в 18:16
поделиться

Вы можете ускорить это, используя оконные функции:

SELECT WhoWon, count(*) AS Total,   
       count(*) * 100.0 / sum(count(*)) over ()  as PercentWinner
FROM [test].[dbo].[7And11SidedDiceGame]
GROUP BY WhoWon;

Это не обеспечивает отдельное выражение print.

Для производительности попробуйте индекс на (WhoWon).

0
ответ дан Gordon Linoff 10 March 2019 в 18:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: