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

Откуда:
Сообщений: 5
Подскажите пожалуйста. Есть простой запрос:


SELECT MAX(MATURITY_DATE)
FROM CUSIP..ISSUES /*WITH (INDEX(PK_ISSUES))*/
WHERE ISSUER_NUM+ISSUE_NUM+ISSUE_CHECK
IN('S1111111','S3111111','S5111111')

На тестовом сервере он всегда выполняется пару секунд, а на боевом сервере часто крайне медленно (десятки секунд). На первом сервере подсмотрел в плане запроса, что используется индекс PK_ISSUES. На всякий случай попробовал добавить advice (закомментированно выше), и запрос начал выпонятся так же быстро. Объясните пожалуйста, почему так получилось?

Ни создать дополнительные индексы, ни посмотреть план запроса на втором сервере возможности нет. Записей - 3 миллиона. Индексы таблицы:

1) CONSTRAINT [PK_ISSUES] PRIMARY KEY CLUSTERED ([ISSUES_ID])
2)CREATE NONCLUSTERED INDEX [ISSUES_idx_issuer_issue] ON [dbo].[ISSUES] ([ISSUER_NUM], [ISSUE_NUM])

Спасибо.
18 ноя 12, 16:38    [13490814]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
jnoob,

Вы планы выполнения запросов пытались сравнить?
18 ноя 12, 16:45    [13490836]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
jnoob
Member

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

Нет т.к. на втором сервере нет прав на SHOWPLAN.
18 ноя 12, 16:47    [13490842]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
jnoob
Нет т.к. на втором сервере нет прав на SHOWPLAN.


Попросите того, у кого есть права, прислать Вам план для сравнения.
18 ноя 12, 16:49    [13490843]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
При таком PK и предикате в where, будет clustered index scan. Что вы, наверное, и наблюдали в плане.
Более того, предикат в таком виде может привести к неожиданным результатам.
18 ноя 12, 17:03    [13490874]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
MasterZiv
Member

Откуда: Питер
Сообщений: 34705
jnoob,

PK_ISSUES кластерный индекс.
Ты таким образом фосанул table scan.
Что стало быстрее — просто случайность.
Видимо, без хинта оптимизатор пытался идти про индексу, что здесь заведомо бесполезно.
18 ноя 12, 20:40    [13491559]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
Bator
Member

Откуда: Порт пяти морей
Сообщений: 439
jnoob
Подскажите пожалуйста. Есть простой запрос:


SELECT MAX(MATURITY_DATE)
FROM CUSIP..ISSUES /*WITH (INDEX(PK_ISSUES))*/
WHERE ISSUER_NUM+ISSUE_NUM+ISSUE_CHECK
IN('S1111111','S3111111','S5111111')

На тестовом сервере он всегда выполняется пару секунд, а на боевом сервере часто крайне медленно (десятки секунд). На первом сервере подсмотрел в плане запроса, что используется индекс PK_ISSUES. На всякий случай попробовал добавить advice (закомментированно выше), и запрос начал выпонятся так же быстро. Объясните пожалуйста, почему так получилось?

Ни создать дополнительные индексы, ни посмотреть план запроса на втором сервере возможности нет. Записей - 3 миллиона. Индексы таблицы:

1) CONSTRAINT [PK_ISSUES] PRIMARY KEY CLUSTERED ([ISSUES_ID])
2)CREATE NONCLUSTERED INDEX [ISSUES_idx_issuer_issue] ON [dbo].[ISSUES] ([ISSUER_NUM], [ISSUE_NUM])

Спасибо.


измени
WHERE ISSUER_NUM+ISSUE_NUM+ISSUE_CHECK 
IN('S1111111','S3111111','S5111111')

на что-нить типа
WHERE ISSUER_NUM IN('S11','S31','S51') AND ISSUE_NUM = '111' AND ISSUE_CHECK = '11'
19 ноя 12, 12:12    [13493740]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
jnoob
Member

Откуда:
Сообщений: 5
Спасибо.

Bator,
примерно в таком стиле и переписал, чтоб использовать второй индекс. Правда не придумал, как два раза не выбирать одно то же два раза из таблицы DOCS:

SELECT MAX(MATURITY_DATE)
FROM CUSIP..ISSUES
WHERE ISSUER_NUM IN(SELECT SUBSTRING ( CUSIP , 0 , 7 ) FROM DOCS WHERE DOCID='X9234')
AND ISSUER_NUM+ISSUE_NUM+ISSUE_CHECK IN(SELECT CUSIP FROM DOCS WHERE DOCID='X9234')
19 ноя 12, 13:33    [13494288]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
iap
Member

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

SUBSTRING(CUSIP, 0, 7)
Однако!
Это почему же, интересно, 0?
19 ноя 12, 13:40    [13494330]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
jnoob
Member

Откуда:
Сообщений: 5
iap,
Спасибо, исправил. В итого получилось так -
SELECT MAX(MATURITY_DATE) 
FROM CUSIP..ISSUES iss
INNER JOIN 
(SELECT SUBSTRING ( CUSIP , 0 , 7 ) isuuer_param, 
CUSIP cusip_param 
FROM DOC 
WHERE DOCID='S11155151') t
ON iss.ISSUER_NUM = t.isuuer_param
AND iss.ISSUER_NUM+iss.ISSUE_NUM+iss.ISSUE_CHECK = t.cusip_param 
19 ноя 12, 15:19    [13495206]     Ответить | Цитировать Сообщить модератору
 Re: За счет чего индекс ускорил запрос?  [new]
jnoob
Member

Откуда:
Сообщений: 5
Ой, конечно же "SUBSTRING ( CUSIP , 1 , 6 )"
19 ноя 12, 15:21    [13495217]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить