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

Откуда: ☭
Сообщений: 72911
Есть (была) таблица с примерно 6млн записей, ее данные нужно перенести с изменением логики в другую базу. Таблица представляет собой параметры административных операций, где есть поля OldValue и NewValue. 80 процентов записей не имеют смысла, поскольку OldValue = NewValue. Чтобы сократить время последующих запросов, я удалил эти 80%, однако ускорения что-то не заметил. Что еще можно сделать с этой таблицей, чтобы не бегать курить после каждого f5?

Картинка с другого сайта. Jah loves you.
17 авг 09, 16:28    [7547504]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
А что за запросы у Вас к этой таблице?
А какие на ней индексы?
А каковы сейчас планы этих запросов?
17 авг 09, 16:31    [7547530]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Сферические запросы в вакууме к таблицам неизвестной структуры оптимизируются только путем полного удаления таблиц.
17 авг 09, 16:31    [7547531]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Вот скрипт таблицы и индексов:
CREATE TABLE [dbo].[EventParameter](
	[EventStudentID] [uniqueidentifier] NOT NULL CONSTRAINT [GUID445]  DEFAULT (newid()),
	[StudentID] [varchar](21) NOT NULL,
	[ParameterName] [sysname] NOT NULL,
	/*[OldValue] [sql_variant] NULL,*/
	[NewValue] [sql_variant] NULL,
	/*[WhenAdd] [datetime] NOT NULL CONSTRAINT [CURRENT_TIMESTAMP1846]  DEFAULT (getdate()),
	[WhenEdit] [datetime] NULL,
	[WhenSend] [datetime] NULL,
	[RecStatus] [varchar](3) NOT NULL CONSTRAINT [ADD1923]  DEFAULT ('add'),
	[RecSend] [varchar](3) NOT NULL CONSTRAINT [_dnt_1782]  DEFAULT ('dnt'),
	[UserName] [varchar](255) NOT NULL CONSTRAINT [SYSTEM_USER1844]  DEFAULT (suser_sname()),
	[ServerName] [varchar](255) NOT NULL CONSTRAINT [Server_Name558]  DEFAULT (convert(varchar(255),serverproperty('servername'))),
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [GUID446]  DEFAULT (newid())*/,
 CONSTRAINT [XPKEventParameter] PRIMARY KEY CLUSTERED 
(
	[EventStudentID] ASC,
	[StudentID] ASC,
	[ParameterName] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]


CREATE NONCLUSTERED INDEX [IDXParameterName] ON [dbo].[EventParameter] 
(
	[ParameterName] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

CREATE UNIQUE NONCLUSTERED INDEX [IX_EventParameter_ROWGUIDCOL] ON [dbo].[EventParameter] 
(
	[rowguid] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [XIF1EventParameter] ON [dbo].[EventParameter] 
(
	[EventStudentID] ASC,
	[StudentID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [XIF2EventParameter] ON [dbo].[EventParameter] 
(
	[ParameterName] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
Закомментированные поля не используются.
Типичный запрос:
select EP.EventStudentID, EP.ParameterName, EP.NewValue 
from EventParameter EP
inner join EventStudent ES on ES.EventStudentID = EP.EventStudentID
where ES.TypeEventID = 3 and ES.ReasonEventID in (1,4,5,6,8))
Хотя тормоза остались и при более простых запросах к EventParameter без всяких джойнов.
17 авг 09, 17:03    [7547773]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Показывайте план вашего запроса.
17 авг 09, 17:04    [7547785]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Antonariy
Типичный запрос:
план его приведите, пожалуйста
17 авг 09, 17:05    [7547800]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
кстати в запросе участвует еще одна таблица - EventStudent
про которую Вы пока ничего не рассказали...
17 авг 09, 17:07    [7547815]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Еще один момент. Решил удалить еще немного мусора:
delete from EventParameter where OldValue Is null and NewValue Is null
В таблице оставалось примерно 700к записей, удалилось 30к. Запрос длился 35 минут. На сервере 8 ядер (видимо 4 ксеона), рейд и прочие радости. Это адекватное время с подобными характеристиками?

Картинка с другого сайта. Jah loves you.
17 авг 09, 17:09    [7547835]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Antonariy,

И сколько в %% отношении записей от всех записей в таблицах выбирает этот запрос?
17 авг 09, 17:11    [7547847]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 36803
Antonariy
Еще один момент. Решил удалить еще немного мусора:
delete from EventParameter where OldValue Is null and NewValue Is null
В таблице оставалось примерно 700к записей, удалилось 30к. Запрос длился 35 минут. На сервере 8 ядер (видимо 4 ксеона), рейд и прочие радости. Это адекватное время с подобными характеристиками?

Картинка с другого сайта. Jah loves you.
Я вам в два счета напишу запрос, который повесит на неопределенное время все сессии, обращающиеся к таблице. Причем работать не будет на сервере с любым количеством ксеонов.

Сообщение было отредактировано: 17 авг 09, 17:14
17 авг 09, 17:13    [7547860]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
План:
 |--Nested Loops(Inner Join, OUTER REFERENCES:([ES].[EventStudentID], [Expr1004]) WITH UNORDERED PREFETCH)
|--Sort(ORDER BY:([ES].[EventStudentID] ASC))
| |--Index Seek(OBJECT:([db1].[dbo].[EventStudent].[XIF3EventStudent] AS [ES]), SEEK:([ES].[ReasonEventID]=(1) AND [ES].[TypeEventID]=(3) OR [ES].[ReasonEventID]=(4) AND [ES].[TypeEventID]=(3) OR [ES].[ReasonEventID]=(5) AND [ES].[Typ
|--Clustered Index Seek(OBJECT:([db1].[dbo].[EventParameter].[XPKEventParameter] AS [EP]), SEEK:([EP].[EventStudentID]=[db1].[dbo].[EventStudent].[EventStudentID] as [ES].[EventStudentID]) ORDERED FORWARD)

pkarklin
И сколько в %% отношении записей от всех записей в таблицах выбирает этот запрос?
В процентах не скажу, в штуках не меньше 50к, конца пока не дожидался, это длилось минут 5.

Картинка с другого сайта. Jah loves you.
17 авг 09, 17:21    [7547912]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Начиналась тема с рассказа про одну таблицу. Теперь их две уже.
Сколько записей в каждой из таблиц то ?
17 авг 09, 17:24    [7547929]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Надо понимать, что вот этот вот оператор отъедает большее время?

--Sort(ORDER BY:([ES].[EventStudentID] ASC))

?
17 авг 09, 17:27    [7547949]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Еще прикол:
select count(EventStudentID) from EventParameter
выполнялось 4 минуты 7 секунд. Вернуло 711023.

Картинка с другого сайта. Jah loves you.
17 авг 09, 17:29    [7547954]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Antonariy
В процентах не скажу, в штуках не меньше 50к, конца пока не дожидался, это длилось минут 5.
Ну вот отправите Вы клиенту набор данных величиной в 50 тысяч строк,
сформируется у него отчет величиной не менее 1000 страниц мелким шрифтом, кто ж его печатать-то будет?
Это ж две пачки бумаги!
17 авг 09, 17:32    [7547977]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Antonariy
Еще прикол:
select count(EventStudentID) from EventParameter
выполнялось 4 минуты 7 секунд. Вернуло 711023.

Картинка с другого сайта. Jah loves you.


Что то слишком неприлично долго. Покажите SELECT @@version.
17 авг 09, 17:36    [7547994]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Glory
Начиналась тема с рассказа про одну таблицу. Теперь их две уже.
Сколько записей в каждой из таблиц то ?
В EventStudent 390337 (время исполнения 0:18), в EventParameter 711023 (4:07). Всего в два раза больше, а какая разница.

CREATE TABLE [dbo].[EventStudent](
	[EventStudentID] [uniqueidentifier] NOT NULL CONSTRAINT [GUID443]  DEFAULT (newid()),
	[StudentID] [varchar](21)  NOT NULL,
	[AgreementID] [int] NULL,
	[ParentEventStudentID] [uniqueidentifier] NULL,
	[ReasonEventID] [int] NOT NULL,
	[TypeEventID] [int] NOT NULL,
	[TypeEventName] [varchar](50)  NOT NULL,
	[StatementOrderID] [uniqueidentifier] NULL,
	[OrderNumber] [varchar](20)  NULL,
	[OrderDate] [datetime] NULL,
	[EventDate] [datetime] NOT NULL,
	[EventStudentComment] [varchar](255)  NULL,
	/*[WhenAdd] [datetime] NOT NULL CONSTRAINT [CURRENT_TIMESTAMP1845]  DEFAULT (getdate()),
	[WhenEdit] [datetime] NULL,
	[WhenSend] [datetime] NULL,
	[RecStatus] [varchar](3)  NOT NULL CONSTRAINT [ADD1922]  DEFAULT ('add'),
	[RecSend] [varchar](3)  NOT NULL CONSTRAINT [_dnt_1781]  DEFAULT ('dnt'),
	[UserName] [varchar](255)  NOT NULL CONSTRAINT [SYSTEM_USER1843]  DEFAULT (suser_sname()),
	[ServerName] [varchar](255)  NOT NULL CONSTRAINT [Server_Name557]  DEFAULT (convert(varchar(255),serverproperty('servername'))),
	[rowguid] [uniqueidentifier] ROWGUIDCOL  NOT NULL CONSTRAINT [GUID444]  DEFAULT (newid()),*/
 CONSTRAINT [XPKEventStudent] PRIMARY KEY CLUSTERED 
(
	[EventStudentID] ASC,
	[StudentID] ASC
)WITH (IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY]

CREATE NONCLUSTERED INDEX [IDXReasonEvent] ON [dbo].[EventStudent] 
(
	[ReasonEventID] ASC,
	[TypeEventID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO

CREATE NONCLUSTERED INDEX [IDXStamentOrder] ON [dbo].[EventStudent] 
(
	[StatementOrderID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
CREATE UNIQUE NONCLUSTERED INDEX [IX_EventStudent_ROWGUIDCOL] ON [dbo].[EventStudent] 
(
	[rowguid] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
 
CREATE NONCLUSTERED INDEX [XIF1EventStudent] ON [dbo].[EventStudent] 
(
	[StudentID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
 
CREATE NONCLUSTERED INDEX [XIF3EventStudent] ON [dbo].[EventStudent] 
(
	[ReasonEventID] ASC,
	[TypeEventID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
 
CREATE NONCLUSTERED INDEX [XIF4EventStudent] ON [dbo].[EventStudent] 
(
	[StatementOrderID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
GO
 
CREATE NONCLUSTERED INDEX [XIF5EventStudent] ON [dbo].[EventStudent] 
(
	[AgreementID] ASC,
	[StudentID] ASC
)WITH (SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF) ON [PRIMARY]
17 авг 09, 17:38    [7548008]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
pkarklin
Antonariy
Еще прикол:
select count(EventStudentID) from EventParameter
выполнялось 4 минуты 7 секунд. Вернуло 711023.

Картинка с другого сайта. Jah loves you.


Что то слишком неприлично долго. Покажите SELECT @@version.
О чем и речь. Поэтому я и не придал значения второй таблице.
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Standard Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
17 авг 09, 17:41    [7548027]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Ну вот есть же поле EventDate
Ну никак не могу поверить, что оно не должно во where участвовать
Странная какая-то задача...
17 авг 09, 17:42    [7548040]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Паганель
Ну вот есть же поле EventDate
Ну никак не могу поверить, что оно не должно во where участвовать
Странная какая-то задача...
Задача к клиентам не имеет отношения. Это перелив данных из одной структуры в другую.
17 авг 09, 17:44    [7548052]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Так это у Вас одноразовая операция?
Тогда я не понимаю нежелание подождать лишний час на "перелив данных"
Разве что подозрение, что с железом что-то не то... Тут уж я не спец, ничего сказать не могу.
17 авг 09, 17:48    [7548070]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Glory
Member

Откуда:
Сообщений: 104760
Antonariy
Glory
Начиналась тема с рассказа про одну таблицу. Теперь их две уже.
Сколько записей в каждой из таблиц то ?
В EventStudent 390337 (время исполнения 0:18), в EventParameter 711023 (4:07). Всего в два раза больше, а какая разница.

Сколько в EventStudent записей попадающих под where ES.TypeEventID = 3 and ES.ReasonEventID in (1,4,5,6,8)) ?
Вы видете по плану, что для каждой из них серер будет искать записи в EventParameter ?
17 авг 09, 17:48    [7548073]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Antonariy
Member

Откуда: ☭
Сообщений: 72911
Паганель
Тогда я не понимаю нежелание подождать лишний час на "перелив данных"
Потому что предварительно требуестя интеллектуальный анализ содержимого и статистики с помощью головного мозга, а ему лень по 2-3 минуты ожидать возвращения десятка-другого записей. Так что лучше потерять пару-тройку часов на приведени таблицы в кошерный вид, чтобы сэкономить пару суток времени на более интересные задачи.

Glory
Сколько в EventStudent записей попадающих под where ES.TypeEventID = 3 and ES.ReasonEventID in (1,4,5,6,8)) ?
Вы видете по плану, что для каждой из них серер будет искать записи в EventParameter ?

Вижу. 38к. Но меня напрягает не это, а аномалия с select count — если оно выполняется более, чем в 10 раз дольше, чем на в два раза менее объемной таблице, то результирующий запрос будет выполняться сутками. Не считая время, потраченное на анализ данных с такими тормозами.

Картинка с другого сайта. Jah loves you.
17 авг 09, 18:03    [7548168]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Звездочку поставьте вместо имени поля.
17 авг 09, 18:05    [7548178]     Ответить | Цитировать Сообщить модератору
 Re: Долгие запросы  [new]
Glory
Member

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

Glory
Сколько в EventStudent записей попадающих под where ES.TypeEventID = 3 and ES.ReasonEventID in (1,4,5,6,8)) ?
Вы видете по плану, что для каждой из них серер будет искать записи в EventParameter ?

Вижу. 38к. Но меня напрягает не это, а аномалия с select count — если оно выполняется более, чем в 10 раз дольше, чем на в два раза менее объемной таблице, то результирующий запрос будет выполняться сутками. Не считая время, потраченное на анализ данных с такими тормозами.


И что вам мешает посмотреть план этого select count ? И зачем в count указано поле из ПК?
17 авг 09, 18:06    [7548181]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить