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

Откуда:
Сообщений: 657
привет
в таблице 50 миллионов строк за день
есть поле datetime2
как сделать запрос чтобы в нем получить только 1400 записей - по 1 строке на минуту?
7 ноя 13, 13:08    [15090498]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
1440 строк точнее 60мин*24час
7 ноя 13, 13:09    [15090506]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ранжировать записи с окном в 1 минуту
Выбрать первые в каждом окне
7 ноя 13, 13:10    [15090521]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Alexander_fx
Member

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

а какие функции ранжирования стоит использовать - гуглить?
поиск по форуму по слову ранжирование выдал не очень много старых топиков
7 ноя 13, 13:14    [15090555]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexander_fx
а какие функции ранжирования стоит использовать - гуглить?

Ага. "гуглить" хелп - ranking functions
7 ноя 13, 13:17    [15090574]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Alexander_fx
только 1440 записей - по 1 строке на минуту?

Есть какой-то критерий отбора? Или подойдёт любая строка из данной минуты?

Индекс по "полю datetime2" имеется?
7 ноя 13, 13:20    [15090607]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Alexander_fx
Member

Откуда:
Сообщений: 657
Гость333,

да индекс есть
желательно брать первую строку за минуту но если это будет слишком дорого в плане ресурсов то устроит и любая
7 ноя 13, 13:31    [15090697]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Набросок решения для случая, если сойдёт любая запись внутри минуты:
declare @date datetime2 = '20130611';
declare @next_date datetime2 = dateadd(day, 1, @date);

with minutes(start, finish) as
(
  select @date, dateadd(minute, 1, @date)
  union all
  select m.finish, dateadd(minute, 1, m.finish)
  from minutes m
  where m.finish < @next_date
)
select m.start, x.*
from minutes m
     outer apply
     (
        select top (1) t.*
        from MyTable t
        where t.Поле >= m.start and t.Поле < m.finish
     ) x
option(maxrecursion 1440);

Смысл в том, чтобы вместо ранжирования 50 млн. записей сделать 1440 index seek'ов, что гораздо быстрее.
Нужно проследить, чтобы в плане запроса использовался индекс по MyTable.Поле. Возможно, понадобится даже вписать хинт на индекс.
7 ноя 13, 13:34    [15090714]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Glory
Member

Откуда:
Сообщений: 104760
Alexander_fx
желательно брать первую строку за минуту но если это будет слишком дорого в плане ресурсов то устроит и любая

Все равно придется перебрать все "50 миллионов строк за день"
7 ноя 13, 13:34    [15090715]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать запрос из большой таблици данных с некоторым шагом  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Alexander_fx
желательно брать первую строку за минуту

Тогда в мой запрос, в подзапрос x добавляете "order by t.Поле", ну и проверяете план запроса — не слишком ли ему "поплохело".
7 ноя 13, 13:39    [15090749]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить