Как избежать Sql Query Timeout - PullRequest
17 голосов
/ 12 мая 2009

У меня есть доступ RO в представлении SQL. Этот запрос ниже время ожидания. Как этого избежать?

select  
  count(distinct Status)  
from 
  [MyTable]  with (NOLOCK)
where 
  MemberType=6

Я получаю сообщение об ошибке:

Сообщение 121, Уровень 20, Состояние 0, Строка 0

Произошла ошибка транспортного уровня при получении результатов от сервера (поставщик: поставщик TCP, ошибка: 0 - истекло время ожидания семафора.)

Ответы [ 9 ]

23 голосов
/ 12 мая 2009

Ваш запрос, вероятно, в порядке. «Время ожидания семафора истекло» - это ошибка сети, а не время ожидания SQL Server.

например. см http://support.microsoft.com/kb/325487

Очевидно, что существует некоторая проблема в сети между вами и SQL Server.

edit: Однако, по-видимому, запрос выполняется в течение 15-20 минут, после чего выдается ошибка сети. Это очень длительное время, поэтому, возможно, ошибка сети может быть связана с длительным временем выполнения. Оптимизация базового представления может помочь.

Если [MyTable] в вашем примере является представлением, можете ли вы опубликовать определение представления, чтобы мы могли его оптимизировать?

8 голосов
/ 12 мая 2009

Хотя явно существует какая-то нестабильность сети или что-то, что мешает вашему соединению (возможно, через 15 минут вы пересекаете границу NAT или что-то в вашей сети прерывает сеанс), я думаю, вы хотите такой простой ?) запрос на возврат в течение любого ожидаемого времени (например, 1 с).

Я бы поговорил с вашим администратором базы данных и получил бы индекс, созданный для базовых таблиц в MemberType, Status. Если нет ни одной базовой таблицы или она более сложна и создана представлением или UDF, и вы работаете с SQL Server 2005 или более поздней версии, попросите его рассмотреть возможность индексации представления (в основном материализация представления в индексированном виде). ​​

3 голосов
/ 12 мая 2009

Пожалуйста, проверьте системный журнал событий Windows на наличие ошибок, в частности, для «Источник события: Dhcp». Это очень вероятно сетевая ошибка, связанная с DHCP. Время аренды адреса истекло или около того. Это не должно быть проблемой, связанной с SQL Server или самим запросом.

Просто поищите в интернете сообщение «Истекло время ожидания семафора», и вы получите множество предложений, которые могут быть решением вашей проблемы. К сожалению, похоже, что решения для этой проблемы не существует.

2 голосов
/ 12 мая 2009

Вы можете поместить индекс на MemberType.

1 голос
/ 12 мая 2009

У вас есть индекс, определенный по столбцу Status и столбцу MemberType?

0 голосов
/ 23 января 2019

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

К сожалению, не все так просто. Запрос запускается в течение 3+ часов, прежде чем получит эту ошибку, и, очевидно, он вылетает в одно и то же время, если это просто запрос в SSMS и задание на SQL Server (пока не рассматривал детали этого, поэтому не уверен, что это та же ошибка; определенно то же самое место, хотя).

Так что на всякий случай, если кто-то придет сюда с подобной проблемой, эта тема: https://www.sqlservercentral.com/Forums/569962/The-semaphore-timeout-period-has-expired

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

Мои циклы не являются четными (они зависят от уровня продаж в данном месяце) с точки зрения времени, необходимого для каждого, поэтому для расчета хорошего месяца требуется около 20 минут (запрос рассчитан на 4 года).

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

Учитывая, что это старый вопрос: я нахожусь на SQL Server 2012 SE, SSMS - бета-версия 2018, а виртуальная машина, на которой работает SQL Server, имеет эксклюзивное использование 132 ГБ ОЗУ (всего 30%), 8 ядер и 2 ТБ SSD SAN.

0 голосов
/ 07 августа 2018

Это происходит потому, что запущен другой экземпляр сервера sql. Поэтому сначала нужно убить, а затем войти в SQL Server.

Для этого перейдите в диспетчер задач и выполните задачу «Завершить или завершить» службу SQL Server, затем перейдите в Services.msc и запустите службу SQL Server.

0 голосов
/ 07 августа 2018

Моя команда периодически испытывала эти проблемы с долго работающими пакетами служб SSIS. Это происходит с момента установки исправлений на сервере Windows.

Наши серверы служб SSIS и SQL находятся на отдельных серверах виртуальных машин.

Работая с нашей командой Wintel Servers, мы перезагрузили оба сервера, и на данный момент проблема, похоже, исчезла.

Инженер сказал, что они не уверены, являются ли проблема исправлениями или новыми VMTools, которые они обновили одновременно. Сейчас мы будем следить, и если проблемы с таймаутом повторятся, сначала они попытаются откатить драйвер VMXNET3, а затем, если это не сработает, убрать исправления июньского накопительного пакета.

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

0 голосов
/ 12 мая 2009

сколько у вас записей? есть ли индексы на столе? попробуйте это:

;with a as (
select distinct Status
from MyTable
where MemberType=6
)
select count(Status)
from a
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...