большая табличка, оптимизация
От: mihhon  
Дата: 10.07.08 10:59
Оценка:
база ms sql server, есть табличка следующей структуры
datetime entrydate
instId int
fieldId int
value float

в табличке примерно 300М записей, 1 запись 24 байта, получается, что она занимает 7Gb (плюс не знаю сколько занимают индексы)

индексы:
1. primary key (instId, fieldId, entrydate)
2. entrydate

select entrydate, instId, fieldId, value
from Values
where entrydate='2007-07-10'


запрос использует индекс на entrydate, возвращает 130000 записей (3Мb), по времени 2..4 минуты

execution plan показывает, что index seek 0%, bookmark lookup 100%

можно как-нибудь ускорить это безобразие? физически данные так организовать в таблице, чтоб они шли по возрастанию даты и сервер это понимал?
Re: большая табличка, оптимизация
От: megapoliss Украина  
Дата: 10.07.08 11:40
Оценка:
Здравствуйте, mihhon:

1. перестроить индекс, если он создавался давно и часть данных удалялась
2. использовать кластерный индекс, если данные обновляются не часто
3. разбить таблицу на несколько и создать view объединяющую их (select * from .. union all select ....)
4. использовать специализированный сервер (sybase iq )

M>можно как-нибудь ускорить это безобразие? физически данные так организовать в таблице, чтоб они шли по возрастанию даты и сервер это понимал?


это кластерный индекс
Re: большая табличка, оптимизация
От: . Великобритания  
Дата: 10.07.08 12:14
Оценка:
mihhon wrote:

> 1. primary key (instId, fieldId, entrydate)

попробуй сделать такой индекс
primary key (entrydate, instId, fieldId)
и удалить остальные. Интересно что будет..
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re: большая табличка, оптимизация
От: Niteshade Россия  
Дата: 11.07.08 02:19
Оценка:
Здравствуйте, mihhon, Вы писали:

M>execution plan показывает, что index seek 0%, bookmark lookup 100%

http://www.rsdn.ru/article/db/yukonnew.xml
Автор(ы): Иван Бодягин
Дата: 01.07.2004
Описать более-менее подробно все возможности новой версии Microsoft SQL Server задача не тривиальная, поэтому в данной статье предложен лишь небольшой обзор некоторых нововведений. А именно представления метаданных, схем, немного о безопасности, новые возможности при работе с индексами и новые встроенные типы данных. Я не ставил перед собой цели раскопать все в подробностях, поскольку на данный момент доступна лишь первая предварительная версия сервера и многое может измениться, но основная функциональность, очевидно, останется, поэтому ее и имеет смысл рассмотреть.

Re[2]: большая табличка, оптимизация
От: Niteshade Россия  
Дата: 11.07.08 02:20
Оценка:
Здравствуйте, ., Вы писали:

.>попробуй сделать такой индекс

.>primary key (entrydate, instId, fieldId)
.>и удалить остальные. Интересно что будет..
на месте dba, я бы руки оторвал разработчику)
Re: большая табличка, оптимизация
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.07.08 06:04
Оценка:
Здравствуйте, mihhon, Вы писали:

M>
M>select entrydate, instId, fieldId, value
M>from Values
M>where entrydate='2007-07-10'
M>

M>запрос использует индекс на entrydate, возвращает 130000 записей (3Мb), по времени 2..4 минуты
M>execution plan показывает, что index seek 0%, bookmark lookup 100%
M>можно как-нибудь ускорить это безобразие?
M>физически данные так организовать в таблице, чтоб они шли по возрастанию даты и сервер это понимал?
Можно. Для этого нужно добавить выбираемые поля в индекс по entrydate. Предлагаю перестроить primary key index так, чтобы entrydate шла в нем первой.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[2]: большая табличка, оптимизация
От: Niteshade Россия  
Дата: 11.07.08 06:54
Оценка:
Здравствуйте, Sinclair, Вы писали:

S>Можно. Для этого нужно добавить выбираемые поля в индекс по entrydate. Предлагаю перестроить primary key index так, чтобы entrydate шла в нем первой.

перестраивать PK ради одного запроса?
разумеется, если к этой табличке подавляющее число обращений именно в стиле entrydate = N — это сработает
но, думается, что ID-шники неспроста вынесены в начало индекса
Re[3]: большая табличка, оптимизация
От: Sinclair Россия https://github.com/evilguest/
Дата: 11.07.08 07:12
Оценка: 1 (1)
Здравствуйте, Niteshade, Вы писали:
N>перестраивать PK ради одного запроса?
Мой модуль телепатии и ясновидения показывает 90% вероятность того, что запросы по entrydate преобладают в данной системе
N>разумеется, если к этой табличке подавляющее число обращений именно в стиле entrydate = N — это сработает
N>но, думается, что ID-шники неспроста вынесены в начало индекса
А вот я думаю, что ID-шники вынесены в начало индекса совершенно случайно

Если неслучайно, то придется держать два индекса.
... << RSDN@Home 1.2.0 alpha rev. 677>>
Уйдемте отсюда, Румата! У вас слишком богатые погреба.
Re[3]: большая табличка, оптимизация
От: . Великобритания  
Дата: 11.07.08 08:28
Оценка:
Niteshade wrote:

> .>попробуй сделать такой индекс

> .>primary key (entrydate, instId, fieldId)
> .>и удалить остальные. Интересно что будет..
> на месте dba, я бы руки оторвал разработчику)
По правильному у каждого разработчика должна быть своя бд в которой можно играться и никому этим не мешать.
Posted via RSDN NNTP Server 2.1 beta
но это не зря, хотя, может быть, невзначай
гÅрмония мира не знает границ — сейчас мы будем пить чай
Re[4]: большая табличка, оптимизация
От: mihhon  
Дата: 12.07.08 13:58
Оценка:
S>Мой модуль телепатии и ясновидения показывает 90% вероятность того, что запросы по entrydate преобладают в данной системе
модуль дал сбой, основные запросы именно с instId=123 and fieldId=456 and entrydate>d1 and entrydate<d2

временное решение — новый индекс на все поля, а сейчас делаю partitioned view
Re[2]: большая табличка, оптимизация
От: mihhon  
Дата: 12.07.08 14:02
Оценка:
M>3. разбить таблицу на несколько и создать view объединяющую их (select * from .. union all select ....)
да, решение — partitioned view, insert очень сильно тормозить стал в последнее время

http://msdn.microsoft.com/en-us/library/aa933141(SQL.80).aspx
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.