Медленный SQL-запрос из-за внутреннего и левого соединения?

Другое событие NullPointerException возникает, когда объявляется массив объектов, а затем сразу же пытается разыменовать его внутри.

String[] phrases = new String[10];
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

Этот конкретный NPE можно избежать, если порядок сравнения отменяется ; а именно, использовать .equals для гарантированного непустого объекта.

Все элементы внутри массива инициализируются их общим начальным значением ; для любого типа массива объектов, это означает, что все элементы null.

Вы должны инициализировать элементы в массиве перед доступом или разыменованием их.

String[] phrases = new String[] {"The bird", "A bird", "My bird", "Bird"};
String keyPhrase = "Bird";
for(String phrase : phrases) {
    System.out.println(phrase.equals(keyPhrase));
}

5
задан Kevin Berridge 5 September 2008 в 23:53
поделиться

4 ответа

Общее эмпирическое правило - то, что ВНЕШНИЕ ОБЪЕДИНЕНИЯ заставляют количество строк в наборе результатов увеличиваться, в то время как ВНУТРЕННИЕ ОБЪЕДИНЕНИЯ заставляют количество строк в наборе результатов уменьшаться. Конечно, существует много сценариев, где противоположное верно также, но оно, более вероятно, проложит себе путь, чем нет. То, что Вы хотите сделать для производительности, является содержанием размер набора результатов (рабочий набор) как можно меньше максимально долго.

Так как оба соответствия соединений на первой таблице, изменяя порядок не произведут точность результатов. Поэтому Вы, вероятно, хотите сделать ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ перед ЛЕВЫМ СОЕДИНЕНИЕМ:

SELECT * 
FROM TblA
INNER JOIN DifferentDbCatalog.dbo.TblC on TblA.ID = TblC.TblAID
LEFT JOIN freetexttable ( TblB, *, 'query' ) on TblA.ID = [Key]

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

Поскольку оптимизатор должен переписать вещи, это, вероятно, не достаточно хорошо, чтобы полностью объяснить поведение, которое Вы видите, таким образом, Вы все еще захотите исследовать план выполнения, используемый на каждый запрос и вероятно добавить индекс, как предложено ранее. Это - все еще хороший принцип для изучения, все же.

7
ответ дан 13 December 2019 в 22:20
поделиться

То, что необходимо обычно делать, включают опцию "Show Actual Execution Plan" и затем внимательно изучают то, что вызывает замедление. (нависните своя мышь над каждым соединением для наблюдения деталей), Вы захотите удостовериться, что Вы добираетесь, индекс ищут и не сканирование таблицы.

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

3
ответ дан 13 December 2019 в 22:20
поделиться

Помещение freetexttable(TblB, *, 'query') во временную таблицу может помочь, если это становится названным неоднократно в плане выполнения.

0
ответ дан 13 December 2019 в 22:20
поделиться

Индексируйте поле, которое Вы используете для выполнения соединения.

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

0
ответ дан 13 December 2019 в 22:20
поделиться
Другие вопросы по тегам:

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