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

Откуда:
Сообщений: 1197
Есть таблица с большим размером. В ней есть поля "ДатаСоздания" и "Источник".
Периодически запускается жобы, которые должны получить максимальную дату создания для конкретного источника и запросить новые данные из другой таблицы.
Вопрос: есть ли в данной ситуации делать некластерный индекс по этим 2 полям или лучше вытащить в отдельную таблицу?
12 ноя 12, 09:23    [13456746]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
relief,
если данные достаточно уникальны, то лучше индекс.
12 ноя 12, 09:36    [13456792]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
relief
Member

Откуда:
Сообщений: 1197
gds
relief,
если данные достаточно уникальны, то лучше индекс.


tnanks!
12 ноя 12, 09:50    [13456853]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
gds
relief,
если данные достаточно уникальны, то лучше индекс.

В принципе соврал. При использовании агрегатных функций все равно будет скан не кластерного индекса, но если таблица широкая, то в не кластерном индексе будет меньше страниц для сканирования.
А вот если будете выбирать значение небольшому отрезку времени относительно всего интервала, то да индекс очень пригодиться.
12 ноя 12, 10:19    [13456987]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
aleks2
Guest
gds
gds
relief,
если данные достаточно уникальны, то лучше индекс.

В принципе соврал. При использовании агрегатных функций все равно будет скан не кластерного индекса, но если таблица широкая, то в не кластерном индексе будет меньше страниц для сканирования.
А вот если будете выбирать значение небольшому отрезку времени относительно всего интервала, то да индекс очень пригодиться.


Вот те на?! А с какой печали скан индекса ("Источник", "ДатаСоздания") возникнет при запросе максимальной даты?
12 ноя 12, 10:42    [13457118]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
aleks2,

Ну можно и самому проверить

create table dbo.T1 (Dt datetime not null default getdate(),tex varchar(128) not null default(replicate('1',128)));
go

insert into dbo.T1(Dt) values (default)
go 10000

create index ix_1 on dbo.T1(Dt)
go
create index ix_1_2 on dbo.T1(Dt,tex)
go
create table dbo.T2 (Dt datetime not null default getdate(),tex varchar(128) not null default(replicate('1',128)));
go

declare @i int = 0
declare @d datetime = '2000-01-01 0:00:00'
while @i < 10000 begin
 insert into dbo.T2(Dt) values (dateadd(mi,@i,@d));
 set @i+=1
end
create index ix_2 on dbo.T2(Dt)
go
create index ix_2_2 on dbo.T2(Dt,tex)
go
set showplan_text on
go
select max(Dt) from dbo.T1
select max(Dt) from dbo.T1 with (index=ix_1_2)
go


|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD)
  
|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1_2]), ORDERED BACKWARD)
с t2 тоже самое
12 ноя 12, 11:04    [13457260]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Glory
Member

Откуда:
Сообщений: 104751
gds
     |--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD)

Только это не сканирование ВСЕГО индекса.
12 ноя 12, 11:06    [13457282]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
relief
Member

Откуда:
Сообщений: 1197
gds
aleks2,

.......


|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD)
  
|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1_2]), ORDERED BACKWARD)
с t2 тоже самое


а откуда это вы получили?
12 ноя 12, 11:16    [13457361]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Glory
gds
     |--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD)

Только это не сканирование ВСЕГО индекса.

Хм, тогда странно называть частичное сканирование - сканированием. Это же получается поиск, ну может не в классическом своем виде, но поиск. Если я правильно понимаю, при max он идет по каждому значению (сканирование), но когда встречает значение отличающееся от текущего (в данном случае максимального) он прерывает сканирование.
В пример можно привести max и count
set showplan_text on
go
select max(Dt) from dbo.T2
select count(Dt) from dbo.T2
go
set showplan_text off
go


|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T2].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T2].[ix_2]), ORDERED BACKWARD)

|--Compute Scalar(DEFINE:([Expr1004]=CONVERT_IMPLICIT(int,[Expr1005],0)))
|--Stream Aggregate(DEFINE:([Expr1005]=Count(*)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T2].[ix_2]))
12 ноя 12, 11:19    [13457379]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
relief
gds
aleks2,

.......


|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD)
  
|--Stream Aggregate(DEFINE:([Expr1004]=MAX([tempdb].[dbo].[T1].[Dt])))
|--Top(TOP EXPRESSION:((1)))
|--Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1_2]), ORDERED BACKWARD)
с t2 тоже самое


а откуда это вы получили?

Из плана
set showplan_text on
go
12 ноя 12, 11:20    [13457388]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Glory
Member

Откуда:
Сообщений: 104751
gds
Хм, тогда странно называть частичное сканирование - сканированием.

Любой последовательный перебор записей называется сканированием
Даже если вы останавливаетесь после 1ой записи
12 ноя 12, 11:25    [13457434]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Glory
Member

Откуда:
Сообщений: 104751
gds
Если я правильно понимаю, при max он идет по каждому значению (сканирование), но когда встречает значение отличающееся от текущего (в данном случае максимального) он прерывает сканирование.

Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD
Означает сканирование в порядке по убыванию индексного ключа
Top(TOP EXPRESSION:((1)))
Означает остановку сканирования после 1ой записи
Потому что сканирование шло по индексу с нужным порядком записей
12 ноя 12, 11:27    [13457458]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
relief, если для конкретного источника, то индекс Источник, ДатаСоздания
селект топ 1 ДатаСоздания фром ... вере Источник=Х ордер бай Источник, ДатаСоздания деск
12 ноя 12, 11:28    [13457465]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Bator
relief, если для конкретного источника, то индекс Источник, ДатаСоздания
селект топ 1 ДатаСоздания фром ... вере Источник=Х ордер бай Источник, ДатаСоздания деск
А зачем ORDER BY Источник?
12 ноя 12, 11:30    [13457473]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
gds
Member

Откуда: Железнодорожный
Сообщений: 1842
Блог
Glory
gds
Если я правильно понимаю, при max он идет по каждому значению (сканирование), но когда встречает значение отличающееся от текущего (в данном случае максимального) он прерывает сканирование.

Index Scan(OBJECT:([tempdb].[dbo].[T1].[ix_1]), ORDERED BACKWARD
Означает сканирование в порядке по убыванию индексного ключа
Top(TOP EXPRESSION:((1)))
Означает остановку сканирования после 1ой записи
Потому что сканирование шло по индексу с нужным порядком записей

Спасибо за пояснения.
12 ноя 12, 11:38    [13457517]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
iap
Bator
relief, если для конкретного источника, то индекс Источник, ДатаСоздания
селект топ 1 ДатаСоздания фром ... вере Источник=Х ордер бай Источник, ДатаСоздания деск
А зачем ORDER BY Источник?

А есть смысл отвечать на этот риторический вопрос? ;)
12 ноя 12, 14:26    [13458892]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Bator
iap
пропущено...
А зачем ORDER BY Источник?

А есть смысл отвечать на этот риторический вопрос? ;)
Если ответить нечего, то не надо.
Странно, что вопрос назван риторическим. Разве здесь не форум?
12 ноя 12, 14:58    [13459124]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
iap
Bator
пропущено...

А есть смысл отвечать на этот риторический вопрос? ;)
Если ответить нечего, то не надо.
Странно, что вопрос назван риторическим. Разве здесь не форум?

т.е. вопрос не риторический и ты не знаешь на него ответ? серьезно? (-:
12 ноя 12, 15:11    [13459255]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Bator
iap
пропущено...
Если ответить нечего, то не надо.
Странно, что вопрос назван риторическим. Разве здесь не форум?

т.е. вопрос не риторический и ты не знаешь на него ответ? серьезно? (-:
Знаю.
Вместо вере Источник=Х ордер бай Источник, ДатаСоздания деск достаточно вере Источник=Х ордер бай ДатаСоздания деск
12 ноя 12, 15:15    [13459295]     Ответить | Цитировать Сообщить модератору
 Re: Быстро получить максимальную дату  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
iap
Bator
пропущено...

т.е. вопрос не риторический и ты не знаешь на него ответ? серьезно? (-:
Знаю.
Вместо вере Источник=Х ордер бай Источник, ДатаСоздания деск достаточно вере Источник=Х ордер бай ДатаСоздания деск

Т.е. твой вопрос таки был риторическим ;)

Но ты не дал ответа на свой же вопрос "А зачем":
iap
А зачем ORDER BY Источник?
12 ноя 12, 15:24    [13459383]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить