Почему делают несколько, ГДЕ медленный запрос условий, а не ускоряет его?

Я нахожу, что версия с двойной скобкой test делает естественные логические тесты записи:

if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
    echo "It's a bona-fide directory"
fi

17
задан Clark 29 January 2010 в 14:43
поделиться

8 ответов

Единственный способ узнать, почему стоит проверить план выполнения. Попробуйте SET SHOWPLAN_TEXT ON .

17
ответ дан 30 November 2019 в 12:00
поделиться

Мудрая транспортировка данных, вы правы в своем мышлении: меньше данных, быстрее время выполнения. Однако обычно это время минимально, и большая часть времени уходит на фактическую обработку запросов.

Посмотрите на это так: если бы вы были на автомобильной стоянке, было бы легче выбрать все машины красного цвета или все автомобили красного цвета, модельного года 2006, черного цвета с резиновым салоном коврики?

0
ответ дан 30 November 2019 в 12:00
поделиться

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

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

2
ответ дан 30 November 2019 в 12:00
поделиться

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

Когда я не могу настроить базу данных с использованием индексов и т. Д., Я часто находим, что повторное написание запроса, похожее на это, достаточно, чтобы направить компилятор до более эффективного запроса:

Select Count(*)
From (
    Select 1
    From SearchTable 
    Where [Zip] In (Select ZipCode from dbo.ZipCodesForRadius('30348', 150))
) 
Where [Date] >= '8/1/2009' 
    AND FreeText([Description], 'keyword list here')  
0
ответ дан 30 November 2019 в 12:00
поделиться

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

Также вы можете использовать кнопку «Включить фактический план выполнения» в студии управления, чтобы показать, как он собирается определить, какие записи вы получаете.

Обновление

Из одного из ваших комментариев звучит так, как этот запрос вытягивает из таблицы TEMP. В этом случае после создания таблицы примените к нему индексы. Добавление индексов, затем выполнение запросов будет быстрее, чем запустить сканирование таблицы на таблице Temp Row 500K.

2
ответ дан 30 November 2019 в 12:00
поделиться
  • Работа строки, такая как freetext, дорогие
  • Функция ZipcodesForradius может быть слишком дорогой, в зависимости от того, как она кодирована, и если необходимые индексы присутствуют или нет

, если их заказывает Не ускоряйте вещи, имея выбирать вокруг вашего выбора, может сделать трюк (он поправил вещи в некоторых случаях с DB2 / 400, не уверен в том, как SQLSERVER оптимизирует):

Select Count(*)
From
(
    Select [Description]
    From 
        SearchTable 
    Where 
        [Date] >= '8/1/2009' 
        AND 
        [Zip] In (Select ZipCode from dbo.ZipCodesForRadius('30348', 150))

) as t1
Where FreeText([Description], 'keyword list here')  
2
ответ дан 30 November 2019 в 12:00
поделиться

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

Что вы не хотите, так это посылать их без кодирования кучу вещей, а затем обнаруживать, что код не в порядке. Что касается базы данных, будьте осторожны. Ограничить разрешения (т. е. woops, я не хотел DELETE / DROP that!) или, надеюсь, у вас есть выделенная среда разработчика, где все плохо не разрушительно для восстановления. Возможно, побочный проект с образцом базы данных для тестирования перед включением работы обратно в фактическую среду.

-121--2953947-

Имена параметров можно получить из свойства Parameters .

Например,

    Expression<Action<string, int>> expr = (a, b) => (a + b).ToString();
var names = expr.Parameters.Select(p => p.Name);  //Names contains "a" and "b"

Для второй части лямбда-выражения являются просто некомпилируемыми функциями.
Их параметры не имеют значений, пока не будет скомпилировано выражение и вызван делегат с некоторыми значениями.

Если взять лямбда-выражение i = > i.ToString () , где есть значения параметров?

-121--3238952-

Получите план выполнения

Вам нужно посмотреть на план выполнения, чтобы иметь любую надежду в понимании реальной причины изменения времени ответа. В частности, в этом случае необходимо учитывать несколько факторов:

  • Возможно, что некоторые запросы, возвращающие большее количество строк, работают быстрее, потому что они выполняют сканирование таблицы - каждый имеет «сканирование таблицы медленно» просверлен в них, но в зависимости от распределения данных вполне может быть быстрее, чтобы выполнить сканирование таблицы, чем 50000 строк поиска. Его просто невозможно рассказать без сканирования выполнения.
  • Также возможно, что неправильная статистика мешает SQL Server точно предсказать количество строк, которые он ожидает вернуть - если SQL Server ожидает 20 строк, но их действительно 20 000, то в более сложных запросах он, вероятно, в конечном итоге сделает вещи в неправильном порядке, что приведет к очень медленному запросу - опять же его просто невозможно рассказать без плана исполнения.
  • В частности, использование Freetext означает, что используется механизм полнотекстового поиска, что может вызвать дополнительные проблемы SQL Server при прогнозировании количества возвращаемых строк.

На самом деле, получить план выполнения.

Обновление:

Возможные причины

В отсутствие плана выполнения я думаю, что наиболее вероятной причиной медленного выполнения является плохая оценка условий на ZipCode и Описание :

  • Его трудно оценить количество совпадений с условием ZipCode , так как его результат зависит от хранимой процедуры.
  • Его трудно оценить количество совпадений в условии FreeText как его на основе результатов механизма полнотекстовых запросов.

Я считаю, что SQL Server недооценивает количество строк, которые останутся после фильтрации, и применяет запросы в неправильном порядке. В результате он выполняет десятки (возможно, сотни) тысяч поисков, что намного медленнее, чем просто сканирование таблицы.

Для особенно сложного запроса SQL Server выполнил ~ 3.000.000 поисков, пытаясь вернуть одну строку - в таблице не было даже 3.000.000 строк!

Все, что нужно попробовать - Поместите ZipCodeForRadius во временную таблицу.

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

  • Улучшение статистики по временной таблице
  • Это приведет к тому, что основная инструкция SELECT будет перекомпилирована при каждом выполнении запроса (если диапазон ЗАСТЕЖЕК -МОЛНИЙ не очень мал) - на обработку в любом случае занимает несколько секунд, это будет хорошо, если есть большие различия в соответствующих почтовых кодах. Если нет, то существуют способы предотвращения повторной компиляции.

Он, конечно, не должен нанести слишком большой ущерб в любом случае.

10
ответ дан 30 November 2019 в 12:00
поделиться
scala> scala.tools.nsc.io.Process("ls -1 /tmp | wc").stdout foreach println
      41      63     770

Или есть команда repl:

scala> :sh cat /etc/passwd | wc
stdout: List[String] = List(      65     185    3667)

Доставка любого кода ввода-вывода с 2,8 требовала преодоления большего количества энергии остановки, чем я могу победить, поэтому я поместил все это в компилятор. Достаточно полезный материал в scala.tools.nsc.io.

-121--3909807-

maxMemory () возвращает максимальный объем памяти, который будет использоваться java. Так что это не даст тебе того, чего ты хочешь. totalMemory () - это то, что вы ищете. См. документы

-121--1256523-

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

В вашем случае вероятнее всего произойдет следующее:

  • [Дата] > = '8/1/2009' удовлетворяется индексом, содержащим Date, скорее всего индексом ON Date, поэтому его быстрое сканирование диапазона
  • [Застежка -молния] В (Выберите ZipCode из dbo. ZipCodForRadius ('30348', 150)) совпадает с датой. Даже если у вас нет индекса в застежка -молния, вероятно, у вас есть индекс, содержащий застежка -молния.
  • FreeText ([Описание], «Список ключевых слов здесь») полнотекстовый поиск количества, который продолжается через внутренние индексы FT, быстрый.

  • Все три условия. Теперь становится беспорядочно. Если у вас достаточно оперативной памяти, запрос может сначала составить план для поиска FT, затем HASH-JOIN, затем Zip scan, а затем HASH-JOIN Date. Это будет быстро, порядка 3 + 3 + 8 секунд + изменение (для хеш-операции). Но если у вас недостаточно ОЗУ или если оптимизатор не любит делать хеш-соединение, он должен будет выполнить поиск FT, затем вложенный цикл поиска застежка -молния, а затем вложенный цикл поиска Code и он может достичь индекс переломного пункта в своих решениях. Так что, скорее всего, вы получите сканирование стола. Это, конечно, спекуляция с моей стороны, но ведь вы разместили только текст T-SQL и нулевую информацию о структуре ваших кластеризованных и некластеризованных индексов.

В конце концов вы должны помнить, что SQL не является вашим C-образным процедурным языком. Речь о производительности в SQL никогда не идет о сравнениях и булевой логике. Речь всегда идет о доступе к данным и количестве прочитанных страниц. Таким образом, даже если каждое отдельное условие может быть удовлетворено небольшим, быстрым сканированием диапазона индексов узкого некластеризованного индекса или индекса FT, комбинация не может (или в его случае оптимизатор запросов не нашел способ).

2
ответ дан 30 November 2019 в 12:00
поделиться
Другие вопросы по тегам:

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