Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Зачем сканировать таблицу / 19 сообщений из 19, страница 1 из 1
23.10.2002, 13:20:57
    #32061169
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Проблема такая:
есть таблица платежей, по ней построен индекс по полям
inn, doc_date

даю команду:
SELECT inn, annot
FROM plt
WHERE doc_date between '01.01.2002' AND '04.01.2002'
число возвращенных записей - 29
в профилере duration = 40
в плане выполнения вижу, что сканируется мой индекс, а затем по нему отбираются нужные строки - все ОК

НО!!!

SELECT inn, annot
FROM plt
WHERE doc_date between '01.01.2002' AND '05.01.2002'
число возвращенных записей - 33
в профилере duration = 170
в плане выполнения - сканирование ВСЕЙ таблицы с фильтром по дате

теперь запускаем:

SELECT inn, annot
FROM plt (INDEX=plt0)
WHERE doc_date between '01.01.2002' AND '05.01.2002'
число возвращенных записей - 33
в профилере duration = 42
в плане выполнения - конечно сканирование индекса

т.е. если к-во возвращаемых записей больше 30, то индекс не используется и запрос выполняется в четыре раза дольше!!! Что делать?
...
Рейтинг: 0 / 0
23.10.2002, 13:49:35
    #32061189
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
А сколько всего строк в таблице?
...
Рейтинг: 0 / 0
23.10.2002, 13:51:31
    #32061191
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
в таблице ~120 000 строк
...
Рейтинг: 0 / 0
23.10.2002, 13:57:02
    #32061195
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Попробуй поменять порядок столбцов в индексе, чтобы
дата была первой.
...
Рейтинг: 0 / 0
23.10.2002, 14:02:44
    #32061200
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
попробовал - аналогичный результат
...
Рейтинг: 0 / 0
23.10.2002, 14:16:26
    #32061211
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Самый прикол в том, что

SELECT count(*)
FROM plt
WHERE doc_date between '01.01.2002' AND '09.09.2002'

таки начинает использовать индекс!!!
...
Рейтинг: 0 / 0
23.10.2002, 14:18:05
    #32061214
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Тогда смотри число операций чтения при использовании и неиспользовании индекса, проверь обновляется ли статистика, если таблица занимает на диске более 8 МБ то
она строится по выборочным данным (SAMPLE), построй ее
"руками" с опцией FULLSCAN.Посмотри DBCC SHOW_STATISTICS ,думаю где-то здесь "собака порылась"
...
Рейтинг: 0 / 0
23.10.2002, 14:19:42
    #32061217
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
при count(*) все однозначно - индекс "накрывает" запрос
...
Рейтинг: 0 / 0
23.10.2002, 15:05:37
    #32061260
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
1. перестроил статистику с FULLSCAN
2. запустил запрос с выборкой за 4 дня (29 записей)
reads = 24 duration=10
3. запустил запрос с выборкой за 5 дней (33 записи)
reads = 156 duration=70
4. запустил запрос с выборкой за 5 дней (33 записи)
с указанием индекса
reads = 41 duration=10

т.е. все то-же самое
что же теперь все процедуры переписывать?
...
Рейтинг: 0 / 0
23.10.2002, 15:17:12
    #32061272
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Чего тут сказать?
Сервер колеблется между проходом по индексу + bookmark lookup и сканированием.
Варианты?
1 - добавить annot в индекс, не очень хорошо
2 - сделать этот индекс кластерным, это ИМХО будет получше
...
Рейтинг: 0 / 0
23.10.2002, 15:30:16
    #32061278
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
С каждым разом все интереснее...

SELECT inn, annot
FROM plt
WHERE doc_date between '10.01.2002' AND '11.01.2002'

47 строк - индекс задействован !
reads=73 duration=0

SELECT inn, annot
FROM plt
WHERE doc_date between '11.01.2002' AND '12.01.2002'

17 строк - индекс не используется !!!
reads=156 duration=70
...
Рейтинг: 0 / 0
23.10.2002, 15:41:28
    #32061284
Kilroy
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
А вот еще вариант
2 инlекса - по отдельности по doc_date и по inn
...
Рейтинг: 0 / 0
23.10.2002, 15:53:07
    #32061294
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
попробовал индексы по отдельности - результат тот же
а вот когда индекс по doc_date сделал кластерным - совсем другое дело, при выборке за любой период вначале сканируется индекс. На том и порешу. Сделать индекс по дате кластерным - вполне разумно.
...
Рейтинг: 0 / 0
23.10.2002, 16:22:00
    #32061305
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
А повторяться inn могут?
...
Рейтинг: 0 / 0
23.10.2002, 16:25:36
    #32061309
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
на то он и inn, чтобы не повторяться
...
Рейтинг: 0 / 0
23.10.2002, 16:41:00
    #32061316
dao
dao
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
Тогда у меня такая мысль - до того как ты создал кластерный индекс - на таблице был кластырный индекс?
Если небыл в принципе или очень давно - то тогда - решаюшим был наверное такой алгоритм - при использованиии обычного индекса на таблице без кластерного индекса - Он пределяет количесто чтений по индексу на какомто участке - и если их больше какого то порогового значения - он начинает сканировать всю таблицу. При кластерном индексе - записи физически перестраивыаются .
...
Рейтинг: 0 / 0
23.10.2002, 16:43:53
    #32061319
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
до этого кластерного индекса - не было
...
Рейтинг: 0 / 0
24.10.2002, 13:36:51
    #32061545
Alexes
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
А нельзя указать точнее, что происходит, когда задействуется индекс? Index scan или Index seek. В случае, если inn-первый столбец индекса, а doc_date-второй. И наоборот.
...
Рейтинг: 0 / 0
24.10.2002, 14:20:51
    #32061567
av2000
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Зачем сканировать таблицу
SELECT inn, annot
FROM plt
WHERE doc_date between '10.01.2002' AND '11.01.2002'
47 строк - index seek

SELECT inn, annot
FROM plt
WHERE doc_date between '11.01.2002' AND '12.01.2002'
17 строк - table scan

SELECT inn, annot
FROM plt (INDEX=my_index)
WHERE doc_date between '11.01.2002' AND '12.01.2002'
17 строк - index seek
...
Рейтинг: 0 / 0
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Зачем сканировать таблицу / 19 сообщений из 19, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]