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

Откуда:
Сообщений: 324
После очередного переписывания клиентского приложения начал тормозить запрос (посылается непосредственно с клиента, не из хранимки)

update bezndocs set komissia = round(0.05*(SumForNTPriv)/100, 4)) where data='01.01.2009' and valcrd<>'810' and valpog='810'

В таблице всего-то 5000 строк, поля data, valcrd и valpog проиндексированы. Какие мысли по поводу причины тормозов? Может, в настройках БД чего-то не так? Одновременно был произведен переход с SQL 2000 на 2005.
17 окт 09, 10:38    [7799969]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
вот create table

SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
SET ANSI_PADDING ON
GO
CREATE TABLE [dbo].[BeznDocs](
	[id] [int] IDENTITY(1,1) NOT NULL,
	[idDec] [int] NOT NULL CONSTRAINT [DF_BeznDocs_idDec]  DEFAULT ((0)),
	[Data] [datetime] NOT NULL,
	[Checked] [bit] NOT NULL CONSTRAINT [DF_BeznDocs_Checked]  DEFAULT ((0)),
	[Summa] [decimal](18, 4) NOT NULL CONSTRAINT [DF_BeznDocs_Summa]  DEFAULT ((0)),
	[ctr_auto] [int] NOT NULL CONSTRAINT [DF_BeznDocs_ctr_auto]  DEFAULT ((0)),
	[maded] [bit] NOT NULL CONSTRAINT [DF_BeznDocs_maded]  DEFAULT ((0)),
	[SumForNT] [decimal](18, 4) NOT NULL CONSTRAINT [DF_BeznDocs_SumForNT]  DEFAULT ((0)),
	[SumForNTPriv] [decimal](18, 4) NOT NULL CONSTRAINT [DF_BeznDocs_SumForNTPriv]  DEFAULT ((0)),
	[valcrd] [varchar](3) NOT NULL CONSTRAINT [DF_BeznDocs_valcrd]  DEFAULT (''),
	[valpog] [varchar](3) NOT NULL CONSTRAINT [DF_BeznDocs_valpog]  DEFAULT (''),
	[course] [decimal](18, 4) NOT NULL CONSTRAINT [DF_BeznDocs_Kurs840]  DEFAULT ((0)),
	[komissia] [decimal](18, 4) NOT NULL CONSTRAINT [DF_BeznDocs_komissia]  DEFAULT ((0)),
	[nehvatka] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_nehvatka]  DEFAULT ((0)),
	[prim] [varchar](100) NULL,
	[osndolg] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_osndolg]  DEFAULT ((0)),
	[procent] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_procent]  DEFAULT ((0)),
	[prosrosn] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_prosrosn]  DEFAULT ((0)),
	[prosrproc] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_prosrproc]  DEFAULT ((0)),
	[peniosn] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_peniosn]  DEFAULT ((0)),
	[peniproc] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_peniproc]  DEFAULT ((0)),
	[strafe] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_strafe]  DEFAULT ((0)),
	[sumdosr] [decimal](18, 2) NULL,
	[proc458] [decimal](18, 2) NOT NULL CONSTRAINT [DF_BeznDocs_proc458]  DEFAULT ((0)),
	[VIP] [bit] NOT NULL,
	[isprosr]  AS (((([prosrosn]+[prosrproc])+[peniosn])+[peniproc])+[strafe]),
 CONSTRAINT [PK_BeznDocs] PRIMARY KEY CLUSTERED 
(
	[id] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
) ON [PRIMARY]

GO
SET ANSI_PADDING OFF
17 окт 09, 10:40    [7799971]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

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

план запроса приведите. И спивок блокировок.
17 окт 09, 12:08    [7800056]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
aleks2
Guest
RAndrey
После очередного переписывания клиентского приложения начал тормозить запрос (посылается непосредственно с клиента, не из хранимки)

update bezndocs set komissia = round(0.05*(SumForNTPriv)/100, 4)) where data='01.01.2009' and valcrd<>'810' and valpog='810'

В таблице всего-то 5000 строк, поля data, valcrd и valpog проиндексированы. Какие мысли по поводу причины тормозов? Может, в настройках БД чего-то не так? Одновременно был произведен переход с SQL 2000 на 2005.


1. Ёпрст, очень там много пользы от "поля data, valcrd и valpog проиндексированы", нужон составной индекс типа (data, valpog, valcrd), и лучше кластерный.

2. От "переписывания клиентского приложения" ишо ни один запрос тормозить не начинал.

3. Я, канешно, не знаю шо там за типы у полей data, valcrd и valpog, но ежели это datetime, int и int, то приводите типы явно - не наступите на грабли автоматического приведения типов.
where data=cast('01.01.2009' as datetime) and valcrd<>cast('810' as int) and valpog=cast('810' as int)
17 окт 09, 12:16    [7800061]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36808
Индексы показывайте ваши и план выполнения этого запроса.
17 окт 09, 13:11    [7800149]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
aleks2
RAndrey
После очередного переписывания клиентского приложения начал тормозить запрос (посылается непосредственно с клиента, не из хранимки)

update bezndocs set komissia = round(0.05*(SumForNTPriv)/100, 4)) where data='01.01.2009' and valcrd<>'810' and valpog='810'

В таблице всего-то 5000 строк, поля data, valcrd и valpog проиндексированы. Какие мысли по поводу причины тормозов? Может, в настройках БД чего-то не так? Одновременно был произведен переход с SQL 2000 на 2005.


1. Ёпрст, очень там много пользы от "поля data, valcrd и valpog проиндексированы", нужон составной индекс типа (data, valpog, valcrd), и лучше кластерный.

2. От "переписывания клиентского приложения" ишо ни один запрос тормозить не начинал.

3. Я, канешно, не знаю шо там за типы у полей data, valcrd и valpog, но ежели это datetime, int и int, то приводите типы явно - не наступите на грабли автоматического приведения типов.
where data=cast('01.01.2009' as datetime) and valcrd<>cast('810' as int) and valpog=cast('810' as int)


1. Есть и составной. Кластерный не могу.

2. Переписывался и запрос, в том-то и дело

3. Перед запросом еще set dateformat dmy написано. Значит, 01.01.2009 будет однозначно приводиться. Типы данных в create table есть
17 окт 09, 13:53    [7800216]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

Откуда:
Сообщений: 8711
RAndrey

1. Есть и составной. Кластерный не могу.

2. Переписывался и запрос, в том-то и дело

3. Перед запросом еще set dateformat dmy написано. Значит, 01.01.2009 будет однозначно приводиться. Типы данных в create table есть

И все-таки приведите индексы. А главное план. Вас с начала топика об этом просят!
17 окт 09, 13:56    [7800217]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
Гавриленко Сергей Алексеевич
Индексы показывайте ваши и план выполнения этого запроса.


вот create index

SET ANSI_PADDING OFF
GO
CREATE NONCLUSTERED INDEX [_dta_index_BeznDocs_27_1842821627__K3_K11_K1_8_9_10_13] ON [dbo].[BeznDocs] 
(
	[Data] ASC,
	[valpog] ASC,
	[id] ASC
)
INCLUDE ( [SumForNT],
[SumForNTPriv],
[valcrd],
[komissia]) WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [ForKom] ON [dbo].[BeznDocs] 
(
	[Data] ASC,
	[valcrd] ASC,
	[valpog] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = OFF, FILLFACTOR = 90) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [idDec] ON [dbo].[BeznDocs] 
(
	[idDec] ASC,
	[ctr_auto] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [IX_BeznDocs] ON [dbo].[BeznDocs] 
(
	[ctr_auto] ASC,
	[Data] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = ON, FILLFACTOR = 90) ON [PRIMARY]
GO
CREATE NONCLUSTERED INDEX [val] ON [dbo].[BeznDocs] 
(
	[valcrd] ASC,
	[valpog] ASC
)WITH (PAD_INDEX  = OFF, STATISTICS_NORECOMPUTE  = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS  = ON, ALLOW_PAGE_LOCKS  = OFF, FILLFACTOR = 90) ON [PRIMARY]
GO


К сообщению приложен файл (plan.sqlplan - 19Kb) cкачать
17 окт 09, 14:08    [7800229]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

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

хотелось бы реальный план (не ожидаемый). И блокировки.
17 окт 09, 14:11    [7800235]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
iljy
RAndrey,

хотелось бы реальный план (не ожидаемый). И блокировки.


Вот. Забыл, сейчас вспомнил, рассматривая план: на таблицу навешаны триггеры, пишущие все изменения в таблицу протокола (blackbox..tbl_protokol). Возможно, из-за них такая кривизна?

К сообщению приложен файл (1.sqlplan - 20Kb) cкачать
17 окт 09, 14:36    [7800269]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324


К сообщению приложен файл (2.sqlplan - 99Kb) cкачать
17 окт 09, 14:37    [7800271]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324


К сообщению приложен файл (3.sqlplan - 99Kb) cкачать
17 окт 09, 14:37    [7800272]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324


К сообщению приложен файл (4.sqlplan - 4Kb) cкачать
17 окт 09, 14:38    [7800274]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
17 окт 09, 14:38    [7800275]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324


К сообщению приложен файл (5.sqlplan - 7Kb) cкачать
17 окт 09, 14:40    [7800278]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

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

меня особенно впечатлил план 4 :D вы его смотрели? У вас в триггере для КАЖДОЙ записи осуществляется сканирование таблицы из 500 с гаком тысяч строк для поиска максимального ид! А вы еще удивляетесь что оно тормозит сделайте в таблице-протоколе поле identity.
17 окт 09, 14:48    [7800283]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
iljy
RAndrey,

меня особенно впечатлил план 4 :D вы его смотрели? У вас в триггере для КАЖДОЙ записи осуществляется сканирование таблицы из 500 с гаком тысяч строк для поиска максимального ид! А вы еще удивляетесь что оно тормозит сделайте в таблице-протоколе поле identity.


Да, уже посмотрел. Как-то забыл про протокол - это было сделано еще при царе Горохе, с тех пор не лазили.
Сейчас попробую поменять.
17 окт 09, 14:50    [7800288]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
identity не получилось - на протокол еще другие клиенты завязаны, кроме моего, менять типы полей нельзя. Создал кластерный индекс по этому полю - стало пошустрей. Спасибо.
17 окт 09, 16:23    [7800397]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

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

дело ваше конечно, но такую схему с max(id) на форуме много раз обсуждали, и она имеет фатальный недостаток - если две сессии одновременно попытаются записать что-то в эту таблицу - они могут получить одинаковые id.
17 окт 09, 16:33    [7800404]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
RAndrey
Member

Откуда:
Сообщений: 324
iljy
RAndrey,

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


Ну в общем - да.

Но для этого нужно, чтобы одновременно работало очень много клиентов. Я смотрел - за несколько лет всего около 100 записей с одинаковым num_id.
Только что дошло, что это поле на самом деле не несет никакой функциональной нагрузки, можно в принципе вообще писать туда NULL :))
17 окт 09, 16:43    [7800419]     Ответить | Цитировать Сообщить модератору
 Re: Тормоза при update  [new]
iljy
Member

Откуда:
Сообщений: 8711
RAndrey

Но для этого нужно, чтобы одновременно работало очень много клиентов. Я смотрел - за несколько лет всего около 100 записей с одинаковым num_id.
Только что дошло, что это поле на самом деле не несет никакой функциональной нагрузки, можно в принципе вообще писать туда NULL :))

Можно. А можно оставить тип таким же и сделать identity. Но как я уже сказал - дело только ваше
17 окт 09, 16:48    [7800427]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить