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

Откуда:
Сообщений: 1197
Привет

есть таблица Лог, в которой есть поля LogId, LogDate и ряд других несущественных полей
Записей много.

Иногда надо показывать записи в разрезе дня, т.е. условие с ограничением по датам,
а иногда надо делать джойн на другую таблицу События, в которой есть тоже поле LogId и в которой тоже много записей.

Какие лучше индексы создать для таблицы Лог?
6 ноя 12, 16:40    [13428034]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kryak
Member

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

Зависит от того какие "ненужные" поля вы собираетесь выбирать из таблицы, так же не мешает указать версию.

Если 2008, то можно попробовать CREATE NONCLUSTERED INDEX IX_test ON Log (LogDate) INCLUDE ("не нужные поля")
Ну и при такой структруре наверно CLUSTERED PRIMARY KEY на LogID

Вообще все зависит от того, какие вы запросы собираетесь строить
6 ноя 12, 16:45    [13428081]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
relief,

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.
6 ноя 12, 16:48    [13428118]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kryak
Member

Откуда:
Сообщений: 396
Так же если версия позволяет можно посмотреть на PARTITION SCHEMA + PARTITION FUNCTION это если уж совсем лог большой
6 ноя 12, 16:49    [13428126]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
relief
Member

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

Зависит от того какие "ненужные" поля вы собираетесь выбирать из таблицы, так же не мешает указать версию.

Если 2008, то можно попробовать CREATE NONCLUSTERED INDEX IX_test ON Log (LogDate) INCLUDE ("не нужные поля")
Ну и при такой структруре наверно CLUSTERED PRIMARY KEY на LogID

Вообще все зависит от того, какие вы запросы собираетесь строить


2005 server.
Половина запросов: события по датам, половина джойны к другим таблицам с приличным кол-вом записей
6 ноя 12, 16:55    [13428193]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
relief
Member

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

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


так может тогда дату просто хранить NCHAR(8) YYYYMMDD? тогда второго поля не надо
6 ноя 12, 17:07    [13428287]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
relief
trew
relief,

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


так может тогда дату просто хранить NCHAR(8) YYYYMMDD? тогда второго поля не надо
На дату 16 байт вместо 3х? В логах? Вендоры железа будут рады таким проектировщикам.

Сообщение было отредактировано: 6 ноя 12, 17:12
6 ноя 12, 17:11    [13428316]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
relief
Member

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

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


а если дата со временем, а время всегда 00:00 тое есть ли смысл создавать отдельный столбец?
6 ноя 12, 17:25    [13428401]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
relief
trew
relief,

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


так может тогда дату просто хранить NCHAR(8) YYYYMMDD? тогда второго поля не надо


NCHAR(8) - размер поля в базе 16 байт (это хелп по sql - BOL)
smalldatetime -размер поля в базе 4 байта
Во-первых: Лучше, когда поля занимают меньший размер в базе

Во-вторых: Сервер быстрее сравнивает числовые поля. Дата на сервере, как правило, хранится в виде числа.
SELECT DATEDIFF(dd, 0, GETDATE() )

Поэтому, используйте тип smalldatetime, а не NCHAR.
6 ноя 12, 17:29    [13428425]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
relief
trew
relief,

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


а если дата со временем, а время всегда 00:00 тое есть ли смысл создавать отдельный столбец?

А зачем? Если нет времени, значит обрезать время в поле дата - не нужно.
6 ноя 12, 17:31    [13428431]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
relief
Member

Откуда:
Сообщений: 1197
trew
relief
пропущено...


а если дата со временем, а время всегда 00:00 тое есть ли смысл создавать отдельный столбец?

А зачем? Если нет времени, значит обрезать время в поле дата - не нужно.


т.е. делаю поле LogDate типа smalldatetime и на нем некластерный индекс
6 ноя 12, 17:33    [13428444]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
trew
relief
пропущено...


так может тогда дату просто хранить NCHAR(8) YYYYMMDD? тогда второго поля не надо


NCHAR(8) - размер поля в базе 16 байт (это хелп по sql - BOL)
smalldatetime -размер поля в базе 4 байта
Во-первых: Лучше, когда поля занимают меньший размер в базе

Во-вторых: Сервер быстрее сравнивает числовые поля. Дата на сервере, как правило, хранится в виде числа.
SELECT DATEDIFF(dd, 0, GETDATE() )

Поэтому, используйте тип smalldatetime, а не NCHAR.
Для даты есть специальный тип date, который занимает три байта, и в который можно записать гораздо более широкий диапазон дат, чем в smalldatetime.

З.Ы. Однако только из-за того, чтобы писать условие [Date] = @Date вместо [Date] >= @DayStart and [Date] < @NextDayStart, я бы отрезать время не стал. А то завтра потребуется выбирать по часам, и превед.
6 ноя 12, 17:36    [13428474]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
relief,

Индексы строятся на основе запросов, чтобы запросы выполнялся быстрее.
Если вы не позываете запросы, как вам помочь? Посоветовать ненужные индексы?
6 ноя 12, 17:36    [13428479]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
trew
Member

Откуда: Москва
Сообщений: 2646
Гавриленко Сергей Алексеевич,

Да, всё зависит от версии сервера. У меня sql 2005, поэтому на тип дата - date, ещё не перешел.
6 ноя 12, 17:38    [13428494]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
relief
Привет

есть таблица Лог, в которой есть поля LogId, LogDate и ряд других несущественных полей
Записей много.

Иногда надо показывать записи в разрезе дня, т.е. условие с ограничением по датам,
а иногда надо делать джойн на другую таблицу События, в которой есть тоже поле LogId и в которой тоже много записей.

Какие лучше индексы создать для таблицы Лог?


Первичный ключ (logid) (кластерный)
Индекс (log_date).
6 ноя 12, 19:29    [13428935]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
MasterZiv
relief
Привет

есть таблица Лог, в которой есть поля LogId, LogDate и ряд других несущественных полей
Записей много.

Иногда надо показывать записи в разрезе дня, т.е. условие с ограничением по датам,
а иногда надо делать джойн на другую таблицу События, в которой есть тоже поле LogId и в которой тоже много записей.

Какие лучше индексы создать для таблицы Лог?


Первичный ключ (logid) (кластерный)
Индекс (log_date).
Если нет необходимости обращаться к конкретной записи по id, то кластерный делать по нему смысла нет никакого. Или неуникальный кластерный по log_date или, если важна последовательность событий, то уникальный кластерный по log_date + log_id.
6 ноя 12, 19:31    [13428944]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34621
trew
relief,

А что в поле LogDate хранится? Если дата и время с секундами, создайте вычисляемый столбец в таблице
SELECT DATEADD(dd, DATEDIFF(dd, 0, LogDate ), 0)

и создайте на нем некластерный индекс.


Это совет из цикла "дети, запомните, как не надо делать"?
6 ноя 12, 19:31    [13428946]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
relief
Member

Откуда:
Сообщений: 1197
Гавриленко Сергей Алексеевич
MasterZiv
пропущено...


Первичный ключ (logid) (кластерный)
Индекс (log_date).
Если нет необходимости обращаться к конкретной записи по id, то кластерный делать по нему смысла нет никакого. Или неуникальный кластерный по log_date или, если важна последовательность событий, то уникальный кластерный по log_date + log_id.


джойн считается обращением?
а при джойнах насколько важны индексы?

Кстати интересно стало. К примеру у меня есть индекс на таблицу А, а на таблицу Б индекс по LogId нет.
Если я сначала укажу таблицу Б в джойне, а потом А это ускорит запрос? Т.е. типа из Б сервер просто будет брать все записи

т.е. если к примеру в таблице логов записи идут
LogId = 3, date
LogId = 2, date
LogId = 1, date

а в другой таблице с которой делается джойн по полю LogId данные хранятся 
в виде 
поля  LogId = 55 
поля  LogId = 2
поля  LogId = 3 
поля  LogId = 1 
поля  LogId = 2
6 ноя 12, 21:41    [13429422]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
relief
Гавриленко Сергей Алексеевич
пропущено...
Если нет необходимости обращаться к конкретной записи по id, то кластерный делать по нему смысла нет никакого. Или неуникальный кластерный по log_date или, если важна последовательность событий, то уникальный кластерный по log_date + log_id.


джойн считается обращением?
а при джойнах насколько важны индексы?

Кстати интересно стало. К примеру у меня есть индекс на таблицу А, а на таблицу Б индекс по LogId нет.
Если я сначала укажу таблицу Б в джойне, а потом А это ускорит запрос? Т.е. типа из Б сервер просто будет брать все записи

т.е. если к примеру в таблице логов записи идут
LogId = 3, date
LogId = 2, date
LogId = 1, date

а в другой таблице с которой делается джойн по полю LogId данные хранятся 
в виде 
поля  LogId = 55 
поля  LogId = 2
поля  LogId = 3 
поля  LogId = 1 
поля  LogId = 2
Да, считается.
6 ноя 12, 22:04    [13429483]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Crimean
Member

Откуда:
Сообщений: 13148
а чего все дат боятся? between вроде бы не отменяли. хотя в случае сложных запросов (более чем по 1 полю) чистая дата может помочь делать более эффективные индексы / выборки
6 ноя 12, 22:27    [13429574]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Гавриленко Сергей Алексеевич
Member

Откуда: Moscow
Сообщений: 37069
Crimean
а чего все дат боятся? between вроде бы не отменяли. хотя в случае сложных запросов (более чем по 1 полю) чистая дата может помочь делать более эффективные индексы / выборки
Мы их не боимся. Мы в логах по ним делаем кластерный и живем сщастливо.
6 ноя 12, 22:34    [13429598]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить