Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
SQL Server 2000 sp3
есть таблица...
CREATE TABLE [CONTRAGENT] (
[CONTRAGENT_ID] [int] IDENTITY (1, 1) NOT NULL ,
[BIRTHDAY] [datetime] NULL ,
[NOMEN] [varchar] (63) COLLATE Cyrillic_General_CI_AS NULL ,
[INN] [varchar] (16) COLLATE Cyrillic_General_CI_AS NULL ,
[SURNAME] [varchar] (63) COLLATE Cyrillic_General_CI_AS NULL ,
[PATRONYMIC] [varchar] (63) COLLATE Cyrillic_General_CI_AS NULL ,
[S_FLAG] [int] NULL CONSTRAINT [DF__CONTRAGEN__S_FLA__2AA11C70] DEFAULT (1),
[BANK_ID] [int] NULL ,
[RESIDENT] [int] NULL ,
PRIMARY KEY CLUSTERED
(
[CONTRAGENT_ID]
) ON [PRIMARY]
) ON [PRIMARY]
GO


в ней милионов 5 записей....
чтобы быстее читалось решил навести индекс...

CREATE INDEX [idx_BANKID_INN] ON [dbo].[CONTRAGENT]([BANK_ID], [IIN]) WITH FILLFACTOR = 90 ON [PRIMARY]
GO

так вот...
теперь execution plan'ы меня просто удивляют...

запрос
select count(*) from contragent with (index(idx_BANKID_INN)) where bank_id=1 and INN='555'
выполняется в 100 раз медленнее чем
select count(*) from contragent where bank_id=1 and INN='555'

если убрать count() и оставить просто * ничего не меняется...

В ЧЕМ ДЕЛО???
6 дек 04, 15:17    [1160570]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
aleksey_fomchenko
Member

Откуда: Москва
Сообщений: 1014
Аааа...
Ничего не понимаю, план давайте, план давайте!!!!!
6 дек 04, 15:20    [1160577]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
а как я его сюда выложу???
6 дек 04, 15:22    [1160586]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
aleksey_fomchenko
Member

Откуда: Москва
Сообщений: 1014
Можно в текстовом виде вывести SET SHOWPLAN ON
6 дек 04, 15:51    [1160690]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Glory
Member

Откуда:
Сообщений: 104760
запрос
select count(*) from contragent with (index(idx_BANKID_INN)) where bank_id=1 and INN='555'
выполняется в 100 раз медленнее чем
select count(*) from contragent where bank_id=1 and INN='555'


А так

select count(bank_id) from contragent with (index(idx_BANKID_INN)) where bank_id=1 and INN='555'
6 дек 04, 15:56    [1160709]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
тоже самое :(
6 дек 04, 16:42    [1160888]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Glory
Member

Откуда:
Сообщений: 104760
Тогда план показывайте
6 дек 04, 16:44    [1160894]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
поподробнее пожалуйста скажите как его показать?... а то я чего то из bol не пойму ничего...
6 дек 04, 16:52    [1160926]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Glory
Member

Откуда:
Сообщений: 104760
set showplan_text on
go

select count(*) from contragent with (index(idx_BANKID_INN)) where bank_id=1 and INN='555'
select count(*) from contragent where bank_id=1 and INN='555'
go


set showplan_text off
go
6 дек 04, 16:54    [1160941]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
добавьте в начале батча
set SHOWPLAN_TEXT on
go
и направьте вывод в текст, а не в грид
6 дек 04, 16:55    [1160944]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
во, врубился...

StmtText
----------------------------------------------------------

select count(BANK_ID) from contragent with (index(idx_BANKID_INN)) where bank_id=1 and INN='555'

(1 row(s) affected)

StmtText                                                                                                                                       
-----------------------------------------------------------
  |--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1006])))
       |--Stream Aggregate(DEFINE:([Expr1006]=Count(*)))
            |--Parallelism(Gather Streams)
                 |--Filter(WHERE:([CONTRAGENT].[INN]='555'))
                      |--Bookmark Lookup(BOOKMARK:([Bmk1000]), OBJECT:([ks1].[dbo].[CONTRAGENT]))
                           |--Index Seek(OBJECT:([ks1].[dbo].[CONTRAGENT].[idx_BANKID_INN]), SEEK:([CONTRAGENT].[BANK_ID]=1) ORDERED FORWARD)

(6 row(s) affected)

StmtText                                                                
----------------------------------------------------------------------- 

select count(BANK_ID) from contragent where bank_id=1 and INN='555'

(1 row(s) affected)

StmtText                                                                                                                                                               
----------------------------------------------------- 
  |--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1006])))
       |--Stream Aggregate(DEFINE:([Expr1006]=Count(*)))
            |--Parallelism(Gather Streams)
                 |--Clustered Index Scan(OBJECT:([ks1].[dbo].[CONTRAGENT].[PK__CONTRAGENT__29ACF837]), WHERE:([CONTRAGENT].[BANK_ID]=1 AND [CONTRAGENT].[INN]='555'))

(4 row(s) affected)
6 дек 04, 16:55    [1160946]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
SanyL
Member

Откуда: Москва
Сообщений: 4540
Мог индекс криво встать... Попробуй снять индекс и поставить его, скажем ручками через EM
6 дек 04, 16:59    [1160959]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
Небось в таблице у большинства записей bank_id=1?
В этом случае, кластерный скан гораздо быстрее индексного поиска.
6 дек 04, 17:06    [1160988]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
bank_id=1 count=1353676
bank_id=2 count=521867
bank_id=3 count=13176
bank_id=4 count=44208
bank_id=5 count=281185
6 дек 04, 17:10    [1161008]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а bank_id=1 and INN='555' -?
6 дек 04, 17:12    [1161013]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
таких нет вобще...
6 дек 04, 17:13    [1161017]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Glory
Member

Откуда:
Сообщений: 104760
Интересно было бы увидеть планы запросов
select count(*) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP=1)

select count(CONTRAGENT_ID) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP=1)
6 дек 04, 17:14    [1161025]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
SanyL
Мог индекс криво встать... Попробуй снять индекс и поставить его, скажем ручками через EM


так я его ручками через EM и ставил...
6 дек 04, 17:14    [1161026]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
Glory
Интересно было бы увидеть планы запросов
select count(*) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP=1)

select count(CONTRAGENT_ID) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP=1)


вот такие планы...

StmtText                                                                             
---------------------------------------------------- 

select count(*) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP 1)

(1 row(s) affected)

StmtText                                                                                                                                                          
------------------------------------------------------ 
  |--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1006])))
       |--Stream Aggregate(DEFINE:([Expr1006]=Count(*)))
            |--Clustered Index Scan(OBJECT:([ks1].[dbo].[CONTRAGENT].[PK__CONTRAGENT__29ACF837]), WHERE:([CONTRAGENT].[BANK_ID]=1 AND [CONTRAGENT].[INN]='555'))

(3 row(s) affected)

StmtText                                                                                        
------------------------------------------------------ 

select count(CONTRAGENT_ID) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP 1)

(1 row(s) affected)

StmtText                                                                                                                                                          
------------------------------------------------------- 
  |--Compute Scalar(DEFINE:([Expr1002]=Convert([Expr1006])))
       |--Stream Aggregate(DEFINE:([Expr1006]=Count(*)))
            |--Clustered Index Scan(OBJECT:([ks1].[dbo].[CONTRAGENT].[PK__CONTRAGENT__29ACF837]), WHERE:([CONTRAGENT].[BANK_ID]=1 AND [CONTRAGENT].[INN]='555'))

(3 row(s) affected)
6 дек 04, 17:17    [1161034]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
может попробовать
CREATE INDEX [idx_INN_BANKID] ON [dbo].[CONTRAGENT]([IIN],[BANK_ID] ) WITH FILLFACTOR = 90 ON [PRIMARY]
GO
6 дек 04, 17:18    [1161041]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
перегенерил....

теперь 50% на 50% вроде пролечилось...

только все равно получается, что индекс выигрыша не дает???!!!
тогда смысл в нем?
6 дек 04, 17:26    [1161077]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5645
изибрательность маленькая... получается быстрее пробежаться по всем записям, чем по индексу, и в случае совпадения идти в страницу данных...

может попробовать
select sum(1) from contragent where bank_id=1 and INN='555'
OPTION(MAXDOP=1)

на старом индексе?

для спящего время бодрствования равносильно сну
6 дек 04, 17:28    [1161085]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Glory
Member

Откуда:
Сообщений: 104760
только все равно получается, что индекс выигрыша не дает???!!!
тогда смысл в нем?

С чего это любой индекс должен давать выигрыш ?
Эдак можно догворится что ролики быстрее машины. Потому что у пары роликов 8 колес,а у машины всего 4
6 дек 04, 17:28    [1161088]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
Smirnov Anton
Member

Откуда: Н.Новгород
Сообщений: 3220
а какой смысл в индексе по такому полю
автор
bank_id=1 count=1353676
bank_id=2 count=521867
bank_id=3 count=13176
bank_id=4 count=44208
bank_id=5 count=281185
6 дек 04, 17:29    [1161094]     Ответить | Цитировать Сообщить модератору
 Re: чтение с индексом медленнее!!!???  [new]
mr Red
Member

Откуда:
Сообщений: 143
Glory
только все равно получается, что индекс выигрыша не дает???!!!
тогда смысл в нем?

С чего это любой индекс должен давать выигрыш ?
Эдак можно догворится что ролики быстрее машины. Потому что у пары роликов 8 колес,а у машины всего 4


ну вроде у меня в WHERE нет ничего... кроме того, что есть в индексе... у меня чтение из таблицы вернее count(*) выполняется ~ 0,3 сек... че-то медленно... вот хотел ускорить... может подскажете способ?

есть еще вопрос... индексы по char и по varchar будут давать разницу в скорости при чтении (запись не очень то критична...)?
6 дек 04, 17:32    [1161106]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить