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

Откуда:
Сообщений: 29
Всем привет! Требуется помощь в оптимизации запроса. Дело в следующем - есть таблица с 3 млн записей, куда пишутся технические данные о состоянии системы. В ней есть различные поля в основном числовые. Я работаю с полями "Server_Name", "Processor", "WRITETIME". Это основные поля, по которым можно идентифицировать строку. Поля "DPC_Rate" и "[Interrupts/sec]" содержат различные числовые данные (метрики). Для нее я написал вот такой запрос:

select distinct a.Processor,
	            a.LastTime, 
	            a.Server_Name , 
	            b.DPC_Rate,
	            b.[Interrupts/sec],
	            b.Processor
	
from (
	select 		distinct	        TableName.Server_Name, 
							TableName.Processor,
							max(TableName.WRITETIME) as LastTime 
	from TableName 
	group by TableName.Server_Name, TableName.Processor) a, TableName b
	where 		a.LastTime = b.WRITETIME
			        and a.Processor = b.Processor
			        and a.Server_Name = b.Server_Name


В чем смысл - необходимо для каждого servername (их штук 20), у каждого из которых несколько типов processor (у каждого штуки по 4), достать строки по последнему времени записи (WRITETIME). Мой запрос делает это, однако за 44 секунды в среднем, и это много. Прошу Вас помочь,пожалуйста, идеями или конкретными решениями по данной проблеме. За себя скажу - работаю с ms sql server 2008, опыт в написании запросов - около месяца.
Так же хочу отметить, что подзапрос, если его выполнять отдельно

select 	           	distinct	        TableName.Server_Name, 
							TableName.Processor,
							max(TableName.WRITETIME) as LastTime 
	from TableName 
	group by TableName.Server_Name, TableName.Processor


справляется с поставленной задачей, то есть выводит уникальные строки с максимальным (то есть последним) временем записи, но не выводит значения полей метрик "DPC_Rate" и "[Interrupts/sec]", так как пишет, что данные поля не содержат агрегирующих значений, что в принципе логично. Уважаемые форумчане, помогите советом или делом, пожалуйста)

Сообщение было отредактировано: 3 июл 12, 16:28
3 июл 12, 16:14    [12811000]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
через row_number будет быстрее
3 июл 12, 16:27    [12811111]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
Это последние записи для сервера, последние записи для процессора по аналогии
select top 1 with ties 
a.Processor,
a.LastTime,
a.Server_Name ,
a.DPC_Rate,
a.[Interrupts/sec],
a.Processor

from TableName a
order by row_number() over(partition by a.Server_Name order by a.WRITETIME desc)
3 июл 12, 16:32    [12811134]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
Мистер Хенки, возможно Вы меня не до конца поняли! Ваш запрос работает, только он отсекает почти половину результатов. Я так понял он берет последнее время записи и выводит соответствующие servername и processor

Вот что должен выдавать верный запрос:
+


Server_Name Processor Writetime

Primary:NOC:NT _Total 1120627142400000
Primary:NOC1:NT _Total 1120703164000000
Primary:TIVAGENT:NT _Total 1120703162900000
Primary:TIVMON:NT _Total 1120703162900000
Primary:NOC:NT 0 1120627142400000
Primary:NOC1:NT 0 1120703164000000
Primary:TIVAGENT:NT 0 1120703162900000
Primary:TIVMON:NT 0 1120703162900000
Primary:NOC1:NT 1 1120703164000000
Primary:TIVMON:NT 1 1120703162900000
Primary:NOC1:NT 2 1120703164000000
Primary:NOC1:NT 3 1120703164000000
BUGAZYAGA ABYRVAL 6666655555555
SERVERTEST PROC_EXE 555555555555
TEST_SERV TEST_PROC 24567889
TEST_SERV TEST_PROC2 34524567889
SeRvEr TOTAL 555555555555

Плюс данные по DPC_Rate и Interrupts/sec, просто я их здесь не указал!

А Ваш запрос выдает следующее:
+


Processor WRITETIME Server_Name DPC_Rate Interrupts/sec Processor

0 1120703164000000 Primary:NOC1:NT 0 318 0
0 1120627142400000 Primary:NOC:NT 0 1027 0
ABYRVAL 6666655555555 BUGAZYAGA NULL 94 ABYRVAL
TOTAL 555555555555 SeRvEr NULL 0 TOTAL
_Total 1120703164400000 Primary:TIVMON:NT 2 2911 _Total
TEST_PROC2 34524567889 TEST_SERV NULL 0 TEST_PROC2
0 1120703164400000 Primary:TIVAGENT:NT 0 1335 0
PROC_EXE 555555555555 SERVERTEST NULL 0 PROC_EXE


3 июл 12, 16:55    [12811306]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
сейчас получше выложу результаты
3 июл 12, 17:03    [12811367]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
sawok86
Я так понял он берет последнее время записи и выводит соответствующие servername и processor

partition by a.Server_Name - где вы тут увидели "и processor" ?
3 июл 12, 17:06    [12811389]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
вот что должно быть

К сообщению приложен файл. Размер - 21Kb
3 июл 12, 17:08    [12811408]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
а вот что у Вас получилось, Мистер Хэнки

К сообщению приложен файл. Размер - 14Kb
3 июл 12, 17:09    [12811412]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
Glory, В общем-то да, неправильно видно понял, сейчас попробую добавить по процессору
3 июл 12, 17:16    [12811463]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
select top 1 with ties 
a.Processor,
a.LastTime,
a.Server_Name ,
a.DPC_Rate,
a.[Interrupts/sec],
a.Processor

from TableName a
order by row_number() over(partition by a.Server_Name,a.Processor order by a.WRITETIME desc)
3 июл 12, 17:32    [12811566]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
Мистер Хенки, да уже попробывал, количество строк выводит тоже, только даты почему-то другие, в меньшую сторону

К сообщению приложен файл. Размер - 20Kb
3 июл 12, 17:59    [12811733]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
PZH
Member

Откуда:
Сообщений: 57
Если подзапрос выводит все что нужно, то может так?
select a.Processor,
	 a.LastTime, 
	 a.Server_Name , 
	 b.DPC_Rate,
	 b.[Interrupts/sec]
	
from (
	select 		distinct	        TableName.Server_Name, 
							TableName.Processor,
							max(TableName.WRITETIME) as LastTime 
	from TableName 
	group by TableName.Server_Name, TableName.Processor) a
        left join TableName b
                on a.Processor = b.Processor and a.Server_Name = b.Server_Name and a.LastTime = b.WRITETIME


Подзапрос работает быстро?
3 июл 12, 22:47    [12812681]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
PZH
Member

Откуда:
Сообщений: 57
Чета фигню написал, разницы то нет.
3 июл 12, 22:54    [12812696]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
PZH, да, подзапрос работает за 2 секунды!
4 июл 12, 10:13    [12813895]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
Может попробовать в сторону курсоров "покапать", может они помогут? Я просто с ними никогда дела не имел, и не очень представляю, можно их здесь применить или нет!

Мистер Хенки, как думаешь, где в твоем запросе подвох, вроде и сервера те же выводит, а время явно не последнее...?
4 июл 12, 10:17    [12813927]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
sawok86
Может попробовать в сторону курсоров "покапать", может они помогут? Я просто с ними никогда дела не имел, и не очень представляю, можно их здесь применить или нет!

Мистер Хенки, как думаешь, где в твоем запросе подвох, вроде и сервера те же выводит, а время явно не последнее...?

выложи тестовые данные, например в виде вставки в табличную переменную и выложи тестовый результат. После этого можно будет сказать, что не так.
4 июл 12, 10:22    [12813957]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
_ч_
Member

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

может быть два одинаковых максимальных значения поля TableName.WRITETIME для одинаковых процессоров и одинаковых серверов, но с разными DPC_Rate и [Interrupts/sec]?
4 июл 12, 10:32    [12814038]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
_ч_
Member

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

кстати, у меня ваш запрос отрабатывает за ~ 5 сек на таблице из 2 581 440 записей
4 июл 12, 10:35    [12814061]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
_ч_
sawok86,

может быть два одинаковых максимальных значения поля TableName.WRITETIME для одинаковых процессоров и одинаковых серверов, но с разными DPC_Rate и [Interrupts/sec]?

да, кстати. Несмотря на уверение автора, что
автор
Я работаю с полями "Server_Name", "Processor", "WRITETIME". Это основные поля, по которым можно идентифицировать строку.
4 июл 12, 10:35    [12814064]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
_ч_
Member

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

Теперь в моей тестовой таблице (т.е. вашей TableName) 4 287 280 записей.

Ради интереса сделал

create nonclustered index [Indx] ON [dbo].[#TableName] ([Server_Name], [Processor], [WRITETIME]) INCLUDE (DPC_Rate,[Interrupts/sec])


Запрос ваш после этого стал отрабатывать за 3 секунды. Правда надо учесть, что у меня индексов и ключей на этой таблице нет и есть только поля, которые вы указали в заглавном сообщении.
4 июл 12, 10:42    [12814131]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
Мистер Хенки, это исключено, я сам проверял, 2 одинаковых максимальных значения writetime быть не могут
4 июл 12, 11:20    [12814445]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
sawok86
Member

Откуда:
Сообщений: 29
_ч_,
автор
Запрос ваш после этого стал отрабатывать за 3 секунды. Правда надо учесть, что у меня индексов и ключей на этой таблице нет и есть только поля, которые вы указали в заглавном сообщении.


В моей таблице аналогично нет ключей и индексов. Не могли бы поподробнее объяснить, как использовать вашу строчку с индексом. Поставить ее в начало запроса?
4 июл 12, 11:23    [12814476]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
Glory
Member

Откуда:
Сообщений: 104760
sawok86
В моей таблице аналогично нет ключей и индексов.

Круто. А как вы хотите тогда ускорять запросы ?
4 июл 12, 11:24    [12814501]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
_ч_
Member

Откуда:
Сообщений: 1427
sawok86
Мистер Хенки, это исключено, я сам проверял, 2 одинаковых максимальных значения writetime быть не могут


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

select distinct	        
TableName.Server_Name, 
TableName.Processor,
max(TableName.WRITETIME) as LastTime
,MAX(DPC_Rate) as DPC_Rate,
MAX([Interrupts/sec]) as [Interrupts/sec]
from TableName 
group by TableName.Server_Name, TableName.Processor


И сравните результаты этого запроса с результатами вашего, который был написан в первом посте
4 июл 12, 11:26    [12814522]     Ответить | Цитировать Сообщить модератору
 Re: Оптимизация запроса, help please!!!  [new]
_ч_
Member

Откуда:
Сообщений: 1427
_ч_
sawok86
Мистер Хенки, это исключено, я сам проверял, 2 одинаковых максимальных значения writetime быть не могут


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

select distinct	        
TableName.Server_Name, 
TableName.Processor,
max(TableName.WRITETIME) as LastTime
,MAX(DPC_Rate) as DPC_Rate,
MAX([Interrupts/sec]) as [Interrupts/sec]
from TableName 
group by TableName.Server_Name, TableName.Processor


И сравните результаты этого запроса с результатами вашего, который был написан в первом посте


Нет, не то что-то написал :)
4 июл 12, 11:28    [12814540]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить