Как определить, почему распределенная транзакция испытывает таймаут

Soundex хорош для фонетических соответствий, но работает лучше всего с именами народов (он был первоначально разработан для данных переписи)

Также Полнотекстовое индексирование выезда, синтаксис отличается от логики Google, но это очень быстро и может иметь дело с подобными элементами языка.

8
задан BlueMonkMN 11 November 2009 в 20:15
поделиться

3 ответа

Чтобы продлить тайм-аут, который по умолчанию до 10 минут максимум, если не указано иное, необходимо обновить C: \ WINDOWS \ Microsoft.NET \ Framework \ v2.0.50727 \ CONFIG \ Machine.config в целевой системе (см. C: \ Windows \ Microsoft.NET \ Framework64 \ v2.0.50727 \ CONFIG, если вы используете 64-разрядную версию). Добавьте это как последний элемент прямо под корневым уровнем:

<system.transactions>
    <machineSettings maxTimeout="23:00:00"/>
</system.transactions>

Это (в качестве примера) установит тайм-аут на 23 часа.

Действующее значение отображается в System.Transactions.TransactionManager.MaximumTimeout

8
ответ дан 5 December 2019 в 14:04
поделиться

Может быть, время ожидания SqlConnection истекло, а не распределенная транзакция?

Обновление 1

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

Если вы профилируете что-либо, кроме автономного / используемого только вами экземпляра SQL Server, вы, вероятно, захотите применить фильтр, чтобы в выходных данных отображались только события, исходящие от вашего хоста.

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

Обновление 2

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

  • Ошибка: 1222, уровень серьезности: 16, состояние: 18
  • Ошибка: 8525, уровень серьезности: 16, состояние: 1

Поиск в Google для исключения 1222 обнаружен http://www.sqlservercentral.com/Forums/Topic579864-146-1.aspx#bm645422 , в котором говорится:

Эта ошибка означает, что замок был запрошено в msdb и истекло время ожидания. Обычно это означает, что это большая транзакция на большом временном столе или большой сорт или что-то в этом роде.

У вас есть какие-нибудь особо длительные запросы, которые могут быть связано с этим? Возможно тяжелое отчет о дежурстве или что-то подобное это?

Надеюсь, это поможет вам продвинуться дальше.

2
ответ дан 5 December 2019 в 14:04
поделиться

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, комбинация не может (или в его случае оптимизатор запросов не нашел способ).

-121--1728959-

Это, вероятно, очевидно для всех читающих, кроме меня, но я просто застрял в этом вопросе и хотел упомянуть, как я его исправил. Несмотря на то, что я изменил файл в месте, указанном BlureMonkMN, я все еще получал время ожидания транзакции по умолчанию в 10 минут. Поскольку я использую Windows 7 64 Bit, файл machine.config для .NET находится в следующем расположении:

C :\Windows\Microsoft.NET\Framework64\v2.0.50727\CONFIG

Обратите внимание, что папка «Framework64» отличается от указанной выше.

2
ответ дан 5 December 2019 в 14:04
поделиться
Другие вопросы по тегам:

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