Я нахожу, что версия с двойной скобкой test
делает естественные логические тесты записи:
if [[ -d "${DIRECTORY}" && ! -L "${DIRECTORY}" ]] ; then
echo "It's a bona-fide directory"
fi
Единственный способ узнать, почему стоит проверить план выполнения. Попробуйте SET SHOWPLAN_TEXT ON .
Мудрая транспортировка данных, вы правы в своем мышлении: меньше данных, быстрее время выполнения. Однако обычно это время минимально, и большая часть времени уходит на фактическую обработку запросов.
Посмотрите на это так: если бы вы были на автомобильной стоянке, было бы легче выбрать все машины красного цвета или все автомобили красного цвета, модельного года 2006, черного цвета с резиновым салоном коврики?
Поскольку для проверки базы данных больше условий для проверки двигателя. Кажется логичным для меня.
Если у вас есть одно условие над кластерным индексом, этот конкретный чек не замедляет эту операцию. Вы считаете перестановка индексов, чтобы соответствовать вашему запросу?
Я подозреваю, что поле даты не проиндексировано, и без индекса, чтобы положиться, чтобы отфильтровать результаты, прежде чем применять предложение «где» на небрангируемых столбцах, он дает им все равный вес и сначала не выполняет быстрые фильтры. применяя другие более дорогих пунктов.
Когда я не могу настроить базу данных с использованием индексов и т. Д., Я часто находим, что повторное написание запроса, похожее на это, достаточно, чтобы направить компилятор до более эффективного запроса:
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')
Попробуйте добавить некоторые индексы в таблицу. Специально те, которые охватывают условия в вашем пункте где. Скорее всего, теперь он делает сканирование таблицы, чтобы вернуть данные, которые могут быть очень очень медленными.
Также вы можете использовать кнопку «Включить фактический план выполнения» в студии управления, чтобы показать, как он собирается определить, какие записи вы получаете.
Обновление
Из одного из ваших комментариев звучит так, как этот запрос вытягивает из таблицы TEMP. В этом случае после создания таблицы примените к нему индексы. Добавление индексов, затем выполнение запросов будет быстрее, чем запустить сканирование таблицы на таблице Temp Row 500K.
, если их заказывает Не ускоряйте вещи, имея выбирать вокруг вашего выбора, может сделать трюк (он поправил вещи в некоторых случаях с 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')
Сначала определите некоторые области простой и средней сложности и четко определите цель каждой задачи. Дайте им представление о бизнесе/области, чтобы они понимали, как все сочетается. После выполнения задачи попросите его рассмотреть ее у разработчика, работающего в течение полного рабочего времени, чтобы убедиться, что она соответствует требованиям, и выявить любые слабые области, в которых можно использовать лучшие практики (это предоставляет возможность наставничества/образования).
Что вы не хотите, так это посылать их без кодирования кучу вещей, а затем обнаруживать, что код не в порядке. Что касается базы данных, будьте осторожны. Ограничить разрешения (т. е. woops, я не хотел DELETE
/ DROP
that!) или, надеюсь, у вас есть выделенная среда разработчика, где все плохо не разрушительно для восстановления. Возможно, побочный проект с образцом базы данных для тестирования перед включением работы обратно в фактическую среду.
Имена параметров можно получить из свойства 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 ()
, где есть значения параметров?
Получите план выполнения
Вам нужно посмотреть на план выполнения, чтобы иметь любую надежду в понимании реальной причины изменения времени ответа. В частности, в этом случае необходимо учитывать несколько факторов:
Freetext
означает, что используется механизм полнотекстового поиска, что может вызвать дополнительные проблемы SQL Server при прогнозировании количества возвращаемых строк. На самом деле, получить план выполнения.
Обновление:
В отсутствие плана выполнения я думаю, что наиболее вероятной причиной медленного выполнения является плохая оценка условий на ZipCode
и Описание
:
ZipCode
, так как его результат зависит от хранимой процедуры. FreeText
как его на основе результатов механизма полнотекстовых запросов. Я считаю, что SQL Server недооценивает количество строк, которые останутся после фильтрации, и применяет запросы в неправильном порядке. В результате он выполняет десятки (возможно, сотни) тысяч поисков, что намного медленнее, чем просто сканирование таблицы.
Для особенно сложного запроса SQL Server выполнил ~ 3.000.000 поисков, пытаясь вернуть одну строку - в таблице не было даже 3.000.000 строк!
Если я прав, то, чтобы помочь с первым, вы могли бы попытаться поместить результаты ZipcodForRadius
хранимой процедуры во временную таблицу, я должен признать, что у меня нет хорошего объяснения, почему поможет, но у меня есть несколько теорий, почему может помочь:
SELECT
будет перекомпилирована при каждом выполнении запроса (если диапазон ЗАСТЕЖЕК -МОЛНИЙ не очень мал) - на обработку в любом случае занимает несколько секунд, это будет хорошо, если есть большие различия в соответствующих почтовых кодах. Если нет, то существуют способы предотвращения повторной компиляции. Он, конечно, не должен нанести слишком большой ущерб в любом случае.
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 ()
- это то, что вы ищете. См. документы
Если имеется одно условие для подсчета (), то запрос может сканировать самый узкий индекс, охватывающий подсчет. Даже если это полное сканирование, количество прочитанных страниц значительно меньше, чем у кластерного сканирования индекса, что, вероятно, намного шире. При наличии нескольких условий строки-кандидаты должны быть объединены, и план запроса может отказаться от некластеризованного сканирования индекса (или сканирования диапазона) и перейти к полному сканированию таблицы.
В вашем случае вероятнее всего произойдет следующее:
[Дата] > = '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, комбинация не может (или в его случае оптимизатор запросов не нашел способ).