Соптимизировать индекс

User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Соптимизировать индекс

Post by OtherSide »

Есть таблица на 2 млрд записей, ежедневно пополняется на ~1.5 млн, Там данные по нескольким биржам. Там идут номера сделок (они по порядку) и id биржи,сейчас целостность обеспечивается кластерным индексом market, number
Фактически единственно зачем мне нужен индекс кроме целостности unique nunber - это узнать last number, что бы узнать откуда докачивать при разрыве коннекта.

Сейчас помотрел, там пишут объем индексов ~57 гб, вот я думаю может этот грохнуть, и повесить триггер на insert, который будет проверять в служебной таблице maxnumber, т.е. если в инсерте есть меньше - кидать эксепшин, если больше - обновить табличку. Тем более триггер на insert уже висит, туда только несколько строк добавить.

Как идея? Цель не только освободить место, я подозреваю что эти действия в триггере будут быстрее работы с огромной таблицей индексов.
Может получше решение есть?
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

mssql 2106
Last edited by OtherSide on 17 Jan 2018 11:36, edited 1 time in total.
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Соптимизировать индекс

Post by Dmitry67 »

Кластерный индекс - это организация САМИХ данных в нужном порядке. Это nonclustered index некая дополнительная структура в сторонке. Вы уверены что индекс кластерный?

Конечно можно убрать кластерный индекс (это долго кстати - таблица целиком перестаивается) - тупо вставлять в конец heap таблицы немного быстрее. Но это странно - что, в этой таблице вам вообще никакого поиска не надо? совсем совсем?
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

Конечно надо, но для этого есть другой индекс.
Индекс проверил - некластерный.
А вот второй - кластерный. В него включен market, stockid, tradedate
По нему есть запросы.
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

-- тупо вставлять в конец heap таблицы
это что?
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

Image

59 Гиг индекс

Второй кластерный (ничего не занимает?)
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

Таблица кстати секционированная (если это что то меняет)
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Соптимизировать индекс

Post by Dmitry67 »

OtherSide wrote: 17 Jan 2018 11:40 -- тупо вставлять в конец heap таблицы
это что?
Если таблица heap, то есть нет кластерного индекса, то новые данные физически записываются в конец таблицы. С кластерным и все сложнее
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

меня больше интересуют хитрости как ускорить триггера. может стоит эту табличку как то пометить что бы она кешировалась лучше. стоит ли вешать на нее индексы(учитывая что там 5 строк) и т.д.
User avatar
Dmitry67
Уже с Приветом
Posts: 28283
Joined: 29 Aug 2000 09:01
Location: SPB --> Gloucester, MA, US --> SPB --> Paris

Re: Соптимизировать индекс

Post by Dmitry67 »

OtherSide wrote: 17 Jan 2018 12:17 меня больше интересуют хитрости как ускорить триггера. может стоит эту табличку как то пометить что бы она кешировалась лучше. стоит ли вешать на нее индексы(учитывая что там 5 строк) и т.д.
Он сам вам кеширует все, не бойтесь.
Зарегистрированный нацпредатель, удостоверение N 19719876044787 от 22.09.2014
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

Так что - будет ли триггер работать быстрее индекса (некластеризованного)?

Вот, написал

Code: Select all

   update maxfulltrades
set maxnumber = (select max(number) from inserted where inserted.Market = maxfulltrades.market)
  where market in (select market from inserted group by Market)
User avatar
ak3
Уже с Приветом
Posts: 1781
Joined: 11 Jan 2001 10:01
Location: Томск->Дубровка (ON)

Re: Соптимизировать индекс

Post by ak3 »

OtherSide wrote: 17 Jan 2018 11:03
Фактически единственно зачем мне нужен индекс кроме целостности unique nunber - это узнать last number, что бы узнать откуда докачивать при разрыве коннекта.
...
Как идея? Цель не только освободить место, я подозреваю что эти действия в триггере будут быстрее работы с огромной таблицей индексов.
Может получше решение есть?
Может и поздновато уже, ну да ладно.

SQL Server Change Tracking - кмк самое то для указанной цели.
На читающей стороне хранить историю чтения.
Каждый раз брать только то, что изменилось с предыдущего раза, не надо заморачиваться с нумерацией или timestamps.

Надо придумать, какие записи читать при самом первом разе, когда ещё нет закладки от прошлого раза.
А потом - просто с закладки последнего успешного чтения.

Читатели получаются независимыми друг от друга.
Зато её так мало надо, всего две капли на стакан...
User avatar
OtherSide
Уже с Приветом
Posts: 17361
Joined: 01 Mar 2008 15:14

Re: Соптимизировать индекс

Post by OtherSide »

Спасибо, я на триггер повесил, вроде пока норм работает. Да и по сути эта таблица только как бакап данных работает, запросы редкие, мне индекс только для целостности нужен был

Return to “Вопросы и новости IT”