powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с использованием индекса
16 сообщений из 16, страница 1 из 1
Проблема с использованием индекса
    #34387479
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день.
Я уже задавал вопрос в свяси с возникшей проблемой. Теперь - несколько иной вопрос.

На одном и том же ASA 8.0.3 лежат 2 базы. Одна - центральная, одна - региональная с одинаковой структурой.

В каждой из баз есть таблица DocLimits,
в которой есть поля LowLimit и HighLimit unsigned int NOT NULL

и индексы
Код: plaintext
CREATE INDEX I_DocLimits_Hi ON DocLimits (HighLimit)
Код: plaintext
CREATE INDEX I_DocLimits_Lo ON DocLimits (LowLimit)

В региональной базе в этой таблице 2млн. записей, в центральной - 16млн.

На региональной базе запрос
Код: plaintext
select * from DocLimits L WHERE L.LowLimit <=  35651891  AND L.HighLimit >=  35651896 
отрабатывает моментально по индексу:
Index Scan Scan L using index I_DocLimits_Hi

а
Код: plaintext
select * from DocLimits L WHERE L.LowLimit <=  1048807  AND L.HighLimit >=  1048807 
отрабатывает моментально по индексу:
Index Scan Scan L using index I_DocLimits_Lo

Т.е., понятно, в зависимости от условия выбирает более подходящий индекс (чтобы перебором обрабатывать меньшую часть таблицы).

На центральной базе же - полным перебором любой из этих запросов:
Table Scan Scan L sequentially

Результат запроса - 2 записи (на обеих базах).

Код: plaintext
CREATE STATISTICS DocLimits
я уже делал - не помогло.
Указывать план вручную - то же самое (
Код: plaintext
select * from DocLimits (Index I_DocLimits_Hi)...
)

Вопрос: можно ли все-таки как-то заставить мега-оптимизатор использовать для построения плана хоть какой-нибудь индекс на большой таблице, т.е. в центральной базе?

Спасибо.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34387938
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1
2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name))
3) Не стоит задавать индекс принудительно, это верный путь снизить производительность. Если оптимайзер считает что полный скан будет эффективней - значит он действительно будет эффективней. С исключениями я ни разу не встречался.
4) Ну и в конце концов, запусти dbisql, запусти в нем свой запрос и ПОСМОТРИ ПЛАН запроса. Не надо гадать, как работает оптимизатор, надо просто посмотреть лог его работы.
5) Запусти Sybase Central, включи в нем Index Consultant (кажется он уже был в ASA8 в Централе) позапускай разные запросы, потом посмотри что Консультант предложит.


---
http://www.rusug.ru] Портал русскоязычной группы пользователей Sybase
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388009
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl wrote:

> 4) Ну и в конце концов, запусти dbisql, запусти в нем свой запрос и
> ПОСМОТРИ ПЛАН запроса. Не надо гадать, как работает оптимизатор, надо
> просто посмотреть лог его работы.

Кстати, неплохо было бы заслать план сюда.
Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388045
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000
White Owl wrote:

> 4) Ну и в конце концов, запусти dbisql, запусти в нем свой запрос и
> ПОСМОТРИ ПЛАН запроса. Не надо гадать, как работает оптимизатор, надо
> просто посмотреть лог его работы.

Кстати, неплохо было бы заслать план сюда.
Posted via ActualForum NNTP Server 1.4

Это?

Table Scan Scan L sequentially

Table reference
Table name

DocLimits
Correlation name

L
Estimated rows

15185139
Estimated pages

1.1005e+005
Estimated pages in cache

102600
Estimated row size (bytes)

31
Page map

yes

Node Statistics

 
Estimates
 
Description
 
RowsReturned

1.5185e+007

Number of rows returned
PercentTotalCost

100

Run time as a percent of total query time
RunTime

92.988

Time to compute the results
CPUTime

37.963

Amount of CPU time required
DiskReadTime

55.026

Time to perform reads from disk
DiskWriteTime

0

Time to perform writes to disk
DiskRead

7451

Disk reads
DiskWrite

0

Disk writes

Subtree Statistics

 
Estimates
 
Description
 
RowsReturned

1.5185e+007

Number of rows returned
PercentTotalCost

100

Run time as a percent of total query time
RunTime

92.988

Time to compute the results
CPUTime

37.963

Amount of CPU time required
DiskReadTime

55.026

Time to perform reads from disk
DiskWriteTime

0

Time to perform writes to disk
DiskRead

7451

Disk reads
DiskWrite

0

Disk writes

Predicate
expr( L.LowLimit ) <= 35651891 : 37.712% Statistics
expr( L.HighLimit ) >= 35651896 : 61.545% Statistics
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388058
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1
2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name))
3) Не стоит задавать индекс принудительно, это верный путь снизить производительность. Если оптимайзер считает что полный скан будет эффективней - значит он действительно будет эффективней. С исключениями я ни разу не встречался.

В моем случае выборка должна идти в 99% случаев по "концу" значений HighLimit, т.е. должен использоваться этот индекс. Я считаю, что это оптимально.

А он НИКОГДА его не использует! (на "большой" таблице)
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388086
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000
White Owl wrote:

> 4) Ну и в конце концов, запусти dbisql, запусти в нем свой запрос и
> ПОСМОТРИ ПЛАН запроса. Не надо гадать, как работает оптимизатор, надо
> просто посмотреть лог его работы.

Кстати, неплохо было бы заслать план сюда.
Posted via ActualForum NNTP Server 1.4

По кнопке "View Plan" выдает еще такое:

SELECT
select * from DocLimits L WHERE L.LowLimit <= 35651891 AND L.HighLimit >= 35651896

Node Statistics

 
Estimates
 
Description
 
RowsReturned

3.5956e+006

Number of rows returned
PercentTotalCost

0

Run time as a percent of total query time
RunTime

0

Time to compute the results
CPUTime

0

Amount of CPU time required
DiskReadTime

0

Time to perform reads from disk
DiskWriteTime

0

Time to perform writes to disk

Subtree Statistics

 
Estimates
 
Description
 
RowsReturned

3.5956e+006

Number of rows returned
PercentTotalCost

100

Run time as a percent of total query time
RunTime

92.988

Time to compute the results
CPUTime

37.963

Amount of CPU time required
DiskReadTime

55.026

Time to perform reads from disk
DiskWriteTime

0

Time to perform writes to disk
DiskRead

16643

Disk reads
DiskWrite

0

Disk writes

Optimizer statistics

 
Value
 
Description
 
Costed subplans

1

The number of different enumeration strategies considered by the optimizer
Estimated cache pages

64260

Estimated cache pages available for this statement
CurrentCacheSize

524288

Current cache size in kilobytes
Isolation_level

0


Optimization_goal

All-rows


Optimization_level

9


ProductVersion

8.0.3 (5444)

Product version
User_estimates

Override-magic



Select list
L.DocLimitId

int
L.DocId

int
L.LowLimit

unsigned int
L.HighLimit

unsigned int
L.SalePrice

double

Options

 
Value
 
Description
 
Alias

talons0

Mounted database name
Ansi_blanks

Off


Ansi_integer_overflow

Off


Ansi_update_constraints

Cursors


Ansinull

On


BlankPadding

ON

Blank padding
BlobArenas

ON

Blob extension pages are stored separately from table pages
Blocking

On


Capabilities

13FFFDD

Database capability bits
CaseSensitive

OFF

Case sensitivity
CharSet

cp1251

Character Set
ClusteredIndexes

ON

Clustered indexes
CompressedBTrees

ON

Compressed B-Tree indexes are supported
Compression

OFF

Compression enabled
Conversion_error

On


Date_format

YYYY-MM-DD


Date_order

YMD


DBFileFragments

55

Database file fragments
DefaultCollation

1251CYR

Default Collation
Divide_by_zero_error

On


Encryption

None

Encryption type
Extended_join_syntax

On


File

D:\SQLData\Sybase\talons0.db

Database file
FileVersion

41

Database file version number
FreePageBitMaps

ON

Free database pages managed via bitmaps
HistogramHashFix

OFF

Fixed histogram hash implementation
Histograms

ON

Optimizer statistics maintained as histograms
IndexStatistics

OFF

Index Statistics
Language

us_english


MachineName

MAINKV

Name of the machine
MainHeapBytes

686776

Main heap bytes in cache
Max_plans_cached

20


MaxCacheSize

524288

Maximum cache size in kilobytes
Update_statistics

On


MinCacheSize

524288

Minimum cache size in kilobytes
Name

MAINKV


NumProcessorsAvail

4

Number of processors on server
PageSize

4096

Database page size
PeakCacheSize

524288

Peak cache size in kilobytes
Platform

Windows2003

Operating system platform
PlatformVer

Windows 2003 Build 3790

Operating system platform version
Precision

30


Prefetch

On


ProcessorArchitecture

X86

Processor architecture
ReadOnly

OFF

Database read-only mode
Row_counts

Off


Scale

6


SeparateCheckpointLog

ON

Checkpoint log maintained at end of system dbspace
SeparateForeignKeys

ON

Primary and foreign key indexes are stored separately
String_rtruncation

Off


StringHistogramsFix

ON

Fixed string histograms implementation
TableBitMaps

ON

Table bit maps supported
TempFileName

C:\WINDOWS\TEMP\asat0001.tmp

Database temporary file name
Time_format

HH:NN:SS.SSS


Timestamp_format

YYYY-MM-DD HH:NN:SS.SSS


Userid

DBA

User ID
VariableHashSize

ON

Hash length may be specified for BTree indexes
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388139
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1
2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name))
3) Не стоит задавать индекс принудительно, это верный путь снизить производительность. Если оптимайзер считает что полный скан будет эффективней - значит он действительно будет эффективней. С исключениями я ни разу не встречался.

Или вот еще пример:
Код: plaintext
select * from talons T where T.DatAzs >= '2007\03\01' and T.DatAzs<= '2007\03\01'
использует индекс по дате, как надо:
Index Scan Scan T using index ind_Talons_DatAzs_Status_Region_Fuel

А если так:
Код: plaintext
select * from talons T where T.DatAzs >= '2007\03\01' and T.DatAzs<= '2007\03\02'
Уже нет!!!
Table Scan Scan T sequentially

Это что, тоже оптимально? Не встречали Вы, говорите? Ну, а я встречал... Может быть, хоть вам от осознания этого факта легче станет... Мне не становится...
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388273
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRockЭто что, тоже оптимально?Да, скорее всего это оптимально. Индекс для работы тоже надо подгрузить с диска. Если сам индекс сильно фрагментирован, то оптимизатор может его забраковать именно из-за фрагментированости. Быстрее будет делать последовательное чтение всей таблицы с диска и нагрузить процессор, чем разгрузить процессор и нагрузить харддрайв беспорядочным чтением секторов.
Сильно хочешь индекс? Сделай свой любий индекс кластерным и дефрагментируй таблицу. Смотри команды CREATE CLUSTERED INDEX и REORGANIZE TABLE.

Поставь рядышком с ASA8 ASA9, загрузи в девятку копию своей базы и поиграйся с принудительным заданием индекса, смотри планы - увидишь на что тратится время.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388292
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl YuRockЭто что, тоже оптимально?Да, скорее всего это оптимально. Индекс для работы тоже надо подгрузить с диска. Если сам индекс сильно фрагментирован, то оптимизатор может его забраковать именно из-за фрагментированости. Быстрее будет делать последовательное чтение всей таблицы с диска и нагрузить процессор, чем разгрузить процессор и нагрузить харддрайв беспорядочным чтением секторов.
Сильно хочешь индекс? Сделай свой любий индекс кластерным и дефрагментируй таблицу. Смотри команды CREATE CLUSTERED INDEX и REORGANIZE TABLE.

Поставь рядышком с ASA8 ASA9, загрузи в девятку копию своей базы и поиграйся с принудительным заданием индекса, смотри планы - увидишь на что тратится время.

Буду пробовать. Спасибо.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34388463
Фотография Ggg_old
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Насчет неоптимального плана.
АСА 9.02.3320
Есть таблица, которая хранит кто и как использует систему на определенные моменты времени (раз в несколько минут): время съема данных, IP, user_id, состояние. Есть индекс по полю времени съема данных. Значений 1,5миллиона. За один день около тысячи значений.
Есть запрос типа:
выбрать все уникальные IP адреса на заданную дату в разрезе времени съема данных (надо отслеживать параллельные сесиий пользователей с разных IP одновременно).
Все было хорошо, выборка использует индекс. Но обнаружилось, что сразу после запуска сервера запрос не использует индекс и делает полное сканирование таблицы. Все последующие запросы уже используют индекс. Перестройка статистики, индексов не помогла. Размер кеша выделяемого под сервер на выбор плана не влиял. При использовании индекса запрос работает около 1сек. При table scan отрабатывает около 30 секунд. Ситуация стабильно воспроизводилась.
Как только я захинтовал запрос на использовании индекса, то сразу после запуска сервера этот же запрос отработал за 2-3 сек.
Почему, АСА так лажала я разбираться не стал, т.к выкалупывать план сложной ХП из хитрых логов сервера мне было не интерестно.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34389023
old_joy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Попробуй дропнуть статистику таблицы и посмотри, что получиться.

В аналогичной ситуации мне в свое время здесь посоветовали снизить размер страницы. Помогло.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34390291
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Predicate
expr( L.LowLimit ) <= 35651891 : 37.712% Statistics
expr( L.HighLimit ) >= 35651896 : 61.545% Statistics
Как и предполагалось, оптимизатор оказался прав. При 37% записей, удовлетворяющих условию, смысла использовать индекс нету. Не говоря уж про 61%.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34390896
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1
2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name))

Огромное спасибо. Поставил девятку, указал план запроса - и все взлетело!
Проблема закрыта.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34391181
Фотография Александр Гoлдун
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
YuRock
Огромное спасибо. Поставил девятку, указал план запроса - и все взлетело!
Проблема закрыта.
Не переживай, еще откроется . Когда начнет тормозить из-за несоответствия индекса параметрам выборки. Посмотрел бы лучше index consultant. Попробуй сделать составной индекс, причем по одному полю ASC, по другому DESC. Послушай добрых людей: оптимизатор не так глуп, как тебе может показаться с поверхностного взгляда.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34394306
YuRock
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Александр Гoлдун
Не переживай, еще откроется . Когда начнет тормозить из-за несоответствия индекса параметрам выборки. Посмотрел бы лучше index consultant. Попробуй сделать составной индекс, причем по одному полю ASC, по другому DESC. Послушай добрых людей: оптимизатор не так глуп, как тебе может показаться с поверхностного взгляда.
Такой индекс и был изначально, но он не использовался НИКОГДА, и я удалил его - сделал 2 на 2 поля. Сейчас я его вернул - без указания плана он по прежнему не используется, и запрос выполняется несколько минут. С Указанием плана - несколько миллисекунд.

Так что может оптимизатор и не так глуп, но уж точно не безупречен.
...
Рейтинг: 0 / 0
Проблема с использованием индекса
    #34394857
iLLer
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Конечно не безупречен. Это машина, а машина ДУМАТЬ не умеет.
А господ, которые говорят, что оптимизатор делает все правильно - не слушай,
они значит не встречались на практике с такими случаями, когда простейший
запрос над многомиллионной таблице сервер выполняет сканированием ее. Уж
чего, чего, но читать таблицу с диска всяк труднее, чем по индексу одну ее
стотысячную часть. А даже, если вся таблица в памяти, а индекс на диске, то
все равно, разработчику может быть виднее, и есть смысл заставить сервер
"неоптимально" закачать индекс в память, чтоб при последующих пяти вызовах
(а это известно только разработчику) выиграть.
Может в 99% случаях оптимизатор и прав, даже я думаю может и в 100%, вот
только вся проблема наверняка в кривой статистике или ее оценке
оптимизатором (уж не знаю разрядности может ему для расчетов не хватает),
поэтому и "тупит". Такое бывает. Иногда помогает указание селективности
условия, а не прямого указания индекса, например:
select ...
from ...
where (a<=b,0.0001)
Я не являюсь сторонником каких-бы то ни было вмешательств в работу
оптимизатора. Но бывают очень редкие моменты, очень-очень, когда заранее
известно 100%, что в данном месте нужно делать только с таким планом, а не
иначе. То тогда можно прибегнуть к такого рода интервенциям в жизнь
оптимизатора.

Что касается дат, то я как-то домогался тут до всех с такой проблемой
год-полтора назад. Простое изменение написание запроса меняло его план с
полного сканирования таблицы на использование индекса, а вся разница крылась
в оборачивании строки '2006.02.24' функцией конвертом типа
convert(date,'2006.02.24'). Оптимизатор почему-то решал, что ему выгоднее
мое поле с датой конвертить в строку и сравнивать с константой, чем
конвертнуть константу и схватить индекс по дате. И все это на больших
таблицах с большими объемами работы и временами жизни.

P.S.: А 9-ка тут просто случайно помогла. Если делал ребилд, то это понятно,
что это помогло, статистика обновилась, таблица дефрагментировалась. Если не
делал, то все равно 9-ый оптимизатор и 8-ый - разные. Просто каждый тупит в
своем углу. И со временем проблемы такого плана могут всплыть, а могут и не
всплыть.


Posted via ActualForum NNTP Server 1.4
...
Рейтинг: 0 / 0
16 сообщений из 16, страница 1 из 1
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Проблема с использованием индекса
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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