Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
Добрый вечер,

Исходные данные - есть проект в SSDT, там ведем разработку базы.
для деплоя делаем сравнение схемы, потом генерим скрипт, правим и запускаем.

так вот, скрипт отрабатывает нормально в dev, но prod вешает намертво. запрос выполняется бесконечно, и KILL не помогает.
и нет ничего сверхестесвенного, все предельно просто для SSDT:
+
CREATE TABLE [dbo].[tmp_ms_xx_Countries] (
    [id]              TINYINT        IDENTITY (1, 1) NOT NULL,
    [short_name]      NVARCHAR (2)   NOT NULL,
    [full_name]       NVARCHAR (255) NOT NULL,
    [region_id]       TINYINT        NOT NULL,
    [region_extra_id] TINYINT        NOT NULL,
    [customer_id]     NVARCHAR (50)  NOT NULL,
    [year_start]      INT            CONSTRAINT [DF_Countries_year_start2] DEFAULT (datepart(year, getdate())) NOT NULL,
    [timezone]        VARCHAR (255)  NOT NULL,
    [INSERT_BY]       VARCHAR (128)  DEFAULT (original_login()) NOT NULL,
    [RV]              ROWVERSION     NOT NULL,
    [phone_code]      VARCHAR (3)    NULL,
    [trunk_prefix]    VARCHAR (2)    NULL,
    CONSTRAINT [tmp_ms_xx_constraint_PK_Countries1] PRIMARY KEY CLUSTERED ([id] ASC),
    CONSTRAINT [tmp_ms_xx_constraint_IX_Countries1] UNIQUE NONCLUSTERED ([short_name] ASC) WITH (IGNORE_DUP_KEY = ON),
    CONSTRAINT [tmp_ms_xx_constraint_IX_Countries_11] UNIQUE NONCLUSTERED ([full_name] ASC) WITH (IGNORE_DUP_KEY = ON)
);

IF EXISTS (SELECT TOP 1 1 
           FROM   [dbo].[Countries])
    BEGIN
        SET IDENTITY_INSERT [dbo].[tmp_ms_xx_Countries] ON;
        INSERT INTO [dbo].[tmp_ms_xx_Countries] ([id], [short_name], [full_name], [region_id], [region_extra_id], [customer_id], [year_start], [timezone], [phone_code], [trunk_prefix])
        SELECT   [id],
                 [short_name],
                 [full_name],
                 [region_id],
                 [region_extra_id],
                 [customer_id],
                 [year_start],
                 [timezone],
                 [phone_code],
                 [trunk_prefix]
        FROM     [dbo].[Countries]
        ORDER BY [id] ASC;
        SET IDENTITY_INSERT [dbo].[tmp_ms_xx_Countries] OFF;
    END


мониторингом вижу, что это INSERT .
SPIDpercent_completerunning_timeest_time_to_goest_completion_timecommandblocking_session_idDBIDLASTWAITTYPEDBNAMEQueryText
5900 hour(s): 41min: 46 sec0 hour(s): 0min: 0 sec2017-10-02 17:48:16.713KILLED/ROLLBACK05SOS_SCHEDULER_YIELD ferratum_intelligenceINSERT INTO ...



и это уже второй раз, первый висел 2 суток прежде чем перезагрузили сервер, только это помогло.

Dev:
Microsoft SQL Server 2012 - 11.0.5058.0 (X64) 
	May 14 2014 18:34:29 
	Copyright (c) Microsoft Corporation
	Developer Edition (64-bit) on Windows NT 6.2 <X64> (Build 9200: ) (Hypervisor)


Prod:
Microsoft SQL Server 2012 (SP1) - 11.0.3373.0 (X64) 
	Jun 29 2013 21:15:12 
	Copyright (c) Microsoft Corporation
	Standard Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1) (Hypervisor)


куда копать?
2 окт 17, 18:55    [20837207]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
aleks222
Guest
Интересно, почему страдальцы экономят на сервиспаках?
2 окт 17, 19:04    [20837222]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
iap
Member

Откуда: Москва
Сообщений: 44917
Сколько записей вставляется?
2 окт 17, 19:04    [20837223]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
iap,

29.
2 окт 17, 19:08    [20837227]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
Диклевич Александр,

А аппликация продолжает писать в таблицу [dbo].[Countries] во время выполнения скрипта? Подобные изменения обычно делают предварительно остановив всю активность в базе.
2 окт 17, 20:41    [20837353]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
flexgen,

таблица статичная, никто туда не пишет и читают даже редко.
3 окт 17, 01:59    [20837752]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Владислав Колосов
Member

Откуда:
Сообщений: 5250
Диклевич Александр,

у вас какая-то гигантская таблица обновляет структуру. Всё не показываете.
3 окт 17, 14:58    [20839180]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
Диклевич Александр
таблица статичная, никто туда не пишет и читают даже редко.


На скриншоте транзакция в состоянии KILLED\ROLLBACK, кто ее прибил? В логах сервера что-нибудь видно?
4 окт 17, 21:46    [20843712]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
Владислав Колосов,

показываю все.
5 окт 17, 01:33    [20844065]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
flexgen,

так я и прибил после того как она висела 30 минут на INSERT.
после этого стала висеть в состоянии KILLED/ROLLBACK.
5 окт 17, 01:36    [20844066]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Massa52
Member

Откуда:
Сообщений: 215
Исключительно из любопытства ...
Зачем проверять существование записи перед инсертом?
Вроде как лишняя операция с селектом ...
IF EXISTS (SELECT TOP 1 1 
           FROM   [dbo].[Countries])
    BEGIN
        SET IDENTITY_INSERT [dbo].[tmp_ms_xx_Countries] ON;
        INSERT INTO ...
5 окт 17, 06:24    [20844102]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
CrazHunt
Member

Откуда:
Сообщений: 37
Диклевич Александр
Владислав Колосов,

показываю все.


Вот явно не все. Явно еще изменение структуры таблицы, перелив данных обратно, дроп временной таблицы.
Явите нам весь скрипт.
5 окт 17, 07:51    [20844125]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
o-o
Guest
так что в sys.dm_os_waiting_tasks, когда это все висит?
5 окт 17, 09:21    [20844210]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
Massa52
Исключительно из любопытства ...
Зачем проверять существование записи перед инсертом?
Вроде как лишняя операция с селектом ...
IF EXISTS (SELECT TOP 1 1 
           FROM   [dbo].[Countries])
    BEGIN
        SET IDENTITY_INSERT [dbo].[tmp_ms_xx_Countries] ON;
        INSERT INTO ...


Этот скрипт сгенерирован при помощи Visual Studio, использовалась опция Schema Compare.
5 окт 17, 14:52    [20845560]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
CrazHunt
Вот явно не все. Явно еще изменение структуры таблицы, перелив данных обратно, дроп временной таблицы.
Явите нам весь скрипт.


Весь скрипт в первом посте.
5 окт 17, 14:56    [20845572]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
Диклевич Александр
flexgen,

так я и прибил после того как она висела 30 минут на INSERT.
после этого стала висеть в состоянии KILLED/ROLLBACK.


Вот еще вопрос - а что делает функция original_login()?

[INSERT_BY]       VARCHAR (128)  DEFAULT (original_login()) NOT NULL,


Куда она обращается?
5 окт 17, 15:00    [20845585]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
o-o
Guest
flexgen
Диклевич Александр
flexgen,

так я и прибил после того как она висела 30 минут на INSERT.
после этого стала висеть в состоянии KILLED/ROLLBACK.


Вот еще вопрос - а что делает функция original_login()?

[INSERT_BY]       VARCHAR (128)  DEFAULT (original_login()) NOT NULL,


Куда она обращается?

ORIGINAL_LOGIN (Transact-SQL)
5 окт 17, 15:21    [20845667]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
flexgen
Member

Откуда:
Сообщений: 596
o-o
ORIGINAL_LOGIN (Transact-SQL)


Как говорится - век живи, век учись. Не знал что есть такое.
5 окт 17, 15:54    [20845787]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
o-o
Guest
flexgen,
начиная с 2005 очень нужная вещь.
ибо теперь можно всех подряд имперсонэйтить.
короче, во все DDL-триггеры рекомендую включать,
а то мало ли кто кого имперсонэйтил и от его имени пакостит
5 окт 17, 16:02    [20845818]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Диклевич Александр
Member

Откуда:
Сообщений: 573
CrazHunt,

я запускаю именно этот кусок и он зависает.
5 окт 17, 19:01    [20846321]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 35087
Диклевич Александр
CrazHunt,

я запускаю именно этот кусок и он зависает.
Если в таблице всего 29 записей, вас же не затруднит сделать полное репро с данными?
5 окт 17, 19:23    [20846357]     Ответить | Цитировать Сообщить модератору
 Re: Почему зависает простой INSERT?  [new]
iap
Member

Откуда: Москва
Сообщений: 44917
Помню, когда-то давно у нас был такой глюк.
Отсылался на сервер любой запрос, там возникала какая-то ошибка,
сообщение о ней показывал Windows на сервере в виде модального окна.
И пока это окно админ не закроет, все сидят чего-то ждут.
Когда такое безобразие обнаружилось, сервер перегрузили, и помнится, всё поправилось.
Тонкие подробности не помню. Это было очень, очень давно...

А! Вспомнил, что у меня был удалённый доступ на север, и я то и дело нажимал там на кнопку Ok в модальном окне
6 окт 17, 10:09    [20847249]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить