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

Откуда: Москва
Сообщений: 325
только что столкнулся с такой фигней....

есть таблица по справкам, которые выдаются при обмене валют... там
id(identity)
seria
#intervala_start
#intervala_end
datecreate
point (пункт где использовали эту справку)

ну сделал id - pkey clustered index
для ускорения поиска сделал index(point) и index (seria,#intervala_start,#intervala_end)
и стало только хуже .. если 1 пользователь то все хорошо....
но другие ваще немогу select сделать.... timeout expired...даже из em..

не подскажите с чем связано и как обходить такое.....
23 июл 03, 15:01    [272645]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
1. Типы данных какие?
2. Какой SELECT?
3. Сколько данных в таблице?
23 июл 03, 17:18    [273049]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kulpavel
Member

Откуда: Москва
Сообщений: 325
Основные

id int
seria char(4)
#intervala_start int
#intervala_end int
datecreate datetime
point int

есть еще пара полей но они доп инфо...

строк уже порядка 35000.... не больше...

select все из sp.. без хинтов...
23 июл 03, 18:24    [273201]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
jimmers
Member

Откуда: Санкт-Петербург - New York City
Сообщений: 5069
есть еще пара полей но они доп инфо...

Может и в них дело.

select все из sp.. без хинтов...

какой именно select
23 июл 03, 20:20    [273324]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Слон
Member

Откуда:
Сообщений: 717
С ходу наверное не ошибусь, что выбранные индексы достаточно бесполезны при запросах.

Во первых, для чего id clustered index да еще с identity? Не думаю, чтобы хоть один запрос правильно использовал этот индекс. Clustered Index - это одно из самых важных индексов в таблице и выбирать его надо понимая, что он делает. Если нет других идей, то скорее всего его надо сделать простым некластерным, все равно он последовательный и новые записи и так будут писаться в конец таблицы.

Потом - что такое серия? Это наверное, уникальный номер документа? Если так, то почему он стоит первым в индексе (seria,#intervala_start,#intervala_end)? Явно, что этот индекс не будет использоваться в запросах, не содержащих явно в WHERE условие seria = '...'. Но тогда там нечего делать #intervala_start #intervala_end.

А насчет timeout expired - скорее всего где-то открывается транзакция и не закрывается. DBCC OPENTRAN

-- Слон
23 июл 03, 21:40    [273392]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Magnus23
Member

Откуда:
Сообщений: 8950
ИМХО если у тебя в условии селекта не используются все поля(содержащиеся в индексе) то такой индекс использоваться не будет и вероятнее всего он и ухудшает положение. Если уж тебе нужны индексы по всем полям то и сделай по всем полям отдельно, в смысле covering index...
23 июл 03, 22:08    [273402]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Слон
Member

Откуда:
Сообщений: 717
Индексы отдельно по всем полям могут не только не помочь, но и испортить выборку. Covering index - это когда один индекс составлен из многих полей, которые используются в запросе, причем упорядоченных по убыванию селективности.

-- Слон
23 июл 03, 22:41    [273419]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Magnus23
Member

Откуда:
Сообщений: 8950
Я имел ввиду не по всем полям а по тем которые чаще всего участвуют в запросах в разных сочетаниях.
23 июл 03, 22:51    [273423]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Stampede
Member

Откуда:
Сообщений: 43
Magnus23 "Я имел ввиду не по всем полям а по тем которые чаще всего участвуют в запросах в разных сочетаниях"

Ну, тут на самом деле много от чего зависит, в том числе - и сильно - от таких вещей как порядок столбцов в индексе, и от характера данных, и от типа запросов. И вообще, оптимизация индексов - это совершенно отдельная песТня, но только в данном случае это все ничем не поможет, потому как товарищ просто элементарно не может внятно объяснить, что у него творится и что ему нужно. Следовательно, не вкуривает. А вы - индексы, индексы :)

Да на 35 тыс записей все и так должно летать, даже по фулл скану. А что клиенты по тайм-ауту вылетают - действительно, похоже, как очень правдоподобно предположил Слон, где-то блокировочки застревают :)
23 июл 03, 23:08    [273434]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kulpavel
Member

Откуда: Москва
Сообщений: 325
вот список всех полей.
[id] [int] IDENTITY (1, 1) NOT NULL ,
[seria] [varchar] (4) COLLATE Cyrillic_General_BIN NOT NULL ,
[#intervala_start] [int] NOT NULL ,
[#intervala_end] [int] NOT NULL ,
[dateopen] [smalldatetime] NOT NULL ,
[state] [smallint] NOT NULL ,
[point] [smallint] NOT NULL ,
[person] [varchar] (50) COLLATE Cyrillic_General_BIN NULL ,
[id_par] [int] NULL ,
[id_act] [int] NOT NULL ,
[dateclose] [smalldatetime] NULL

Это таблица учета отстатков справок в пунктах обмена валют.(справки которые иногда выдают в обменниках при покупке/продаже/обмене валюты)
Есть хранилище невыданных (-1 пункт).там только новые. Затем какую-то часть кокого-нибудь интервала выдают в пункт(их 56). там они должны отметиться как "выданные" в этот день и попасть в активные остатки.в пункте их можно либо использовать либо вернуть обратно в -1. но все предыдущие состояния должны отменяться.
поэтому я сделал так. каждое действие записывает несколько строк.
например. Выдача в пункт: запись выдача в пункт+запись активный остаток.
активные остатки state=0 выдача state=2. вот эти записи и делаются.

когда опрератор выбирает интервал для использования в программе от передается именно ид интервала из которого хотят использовать справки.
поэтому использование ключа считаю обоснованным.

при вводе новых справок в -1 нужно проверять, а нет ли уже перекрестного интервала, поэтому сделал индекс на серию и интервал...
потом этот индекс используется еще и для order by seria,#intervala_start,#intervala_end при выдаче запросов по операциям пунктов за период..
серия состоит из 2 букв АА,ПП,УУ....
пример #intervala_start - 6352237

селекты не пишу потому что там 5 sp и я думаю вам не охота разбираться в чужом коде....тем более там они все простые - поиск интервала по ид, по серии и номерам, по датам, по пунктам...

P.S. условие where seria=' ' есть...
P.P.S. объяснить я могу но только это очень долго..... я эту прогу 3 раз переделываю... если есть желание втыкать пожалста....расскажу..может еще что посоветутете.. например как лучше сделать оменяемость операций в "прошлом" и корректировка результатов на "сегодня".....
25 июл 03, 11:27    [275593]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kulpavel
Member

Откуда: Москва
Сообщений: 325
ну так что идеи есть?

хотелось бы оптимизировать.... а то с прогой каждый день работают несколько человек. а информация важная... :-)
25 июл 03, 14:55    [276191]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Stampede
Member

Откуда:
Сообщений: 43
Ну хорошо, кое-что проясняется. Но ты опять забыл подтвердить, в чем все-таки проблема: в скорости выполнения запросов или во взаимном блокировании пользователей.

"хотелось бы оптимизировать.... а то с прогой каждый день работают несколько человек. а информация важная... :-)"

Это ты вот так вот себе представляешь, что такое проблем репорт? Еще раз тебе говорю, пока не выработаешь системный подход, никто тебе толком помочь не сможет. А цикл переспросили/уточнил может продолжаться до морковкина заговенья :)

Если хочешь, есть пара соображений идеологического, так сказать, свойства, по поводу твоей системы. Дело в том, что ты пытаешься в одной таблице хранить информацию которая имеет принципиально различную семантику, определяющую особенности организации ее хранения: это оперативная информация о движении, агрегированные остатки и денормализованные исторические данные.

Но чтобы реализовать эти соображения, нужно просто все нафиг делать заново. Ты ведь этого не захочешь? :)
25 июл 03, 20:05    [276603]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
Glory
Member

Откуда:
Сообщений: 104760
тем более там они все простые - поиск интервала по ид, по серии и номерам, по датам, по пунктам...

P.S. условие where seria=' ' есть...


Это понятно. А какие поля выбираются ?
Если так
select *
from mytable where #intervala_start brtween ...

то индекс (seria,#intervala_start,#intervala_end) не будет использоваться. А будет использоваться сканирование по кластерному индексу.
26 июл 03, 15:11    [277005]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
AAron
Member

Откуда: Москва
Сообщений: 4324
А почему поле seria имеет тип varchar(4), если состоит из двух букв?

помимо этого - execution plan хотя бы надо посмотреть, на чем тормоза происходят
26 июл 03, 17:01    [277029]     Ответить | Цитировать Сообщить модератору
 Re: индексы  [new]
kulpavel
Member

Откуда: Москва
Сообщений: 325
если честно, я не очень понимаю информацию которую дает план...
если дадите ссылочку буду признателен :-)

когда считывается по серии, то берется только серия и номера.

4 буквы потому что серия могла бы состоять когда-нибудь из 4 букв...
но справки эти вроде скоро отменят, так что переделывать базу не охота...

а вопрос в том почему так сильно блокируется таблица.
из em и моего приложения не читается (хотя с консоли идет)...
если эти индексы снимаю все ок...

стоит их делать ? или оставить без них?
28 июл 03, 14:22    [278055]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить