Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
Добрый день. Я уже задавал вопрос в свяси с возникшей проблемой. Теперь - несколько иной вопрос. На одном и том же ASA 8.0.3 лежат 2 базы. Одна - центральная, одна - региональная с одинаковой структурой. В каждой из баз есть таблица DocLimits, в которой есть поля LowLimit и HighLimit unsigned int NOT NULL и индексы Код: plaintext Код: plaintext В региональной базе в этой таблице 2млн. записей, в центральной - 16млн. На региональной базе запрос Код: plaintext Index Scan Scan L using index I_DocLimits_Hi а Код: plaintext Index Scan Scan L using index I_DocLimits_Lo Т.е., понятно, в зависимости от условия выбирает более подходящий индекс (чтобы перебором обрабатывать меньшую часть таблицы). На центральной базе же - полным перебором любой из этих запросов: Table Scan Scan L sequentially Результат запроса - 2 записи (на обеих базах). Код: plaintext Указывать план вручную - то же самое ( Код: plaintext Вопрос: можно ли все-таки как-то заставить мега-оптимизатор использовать для построения плана хоть какой-нибудь индекс на большой таблице, т.е. в центральной базе? Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 15:09 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 16:57 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
White Owl wrote: > 4) Ну и в конце концов, запусти dbisql, запусти в нем свой запрос и > ПОСМОТРИ ПЛАН запроса. Не надо гадать, как работает оптимизатор, надо > просто посмотреть лог его работы. Кстати, неплохо было бы заслать план сюда. Posted via ActualForum NNTP Server 1.4 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:11 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:17 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1 2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name)) 3) Не стоит задавать индекс принудительно, это верный путь снизить производительность. Если оптимайзер считает что полный скан будет эффективней - значит он действительно будет эффективней. С исключениями я ни разу не встречался. В моем случае выборка должна идти в 99% случаев по "концу" значений HighLimit, т.е. должен использоваться этот индекс. Я считаю, что это оптимально. А он НИКОГДА его не использует! (на "большой" таблице) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:20 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:26 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1 2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name)) 3) Не стоит задавать индекс принудительно, это верный путь снизить производительность. Если оптимайзер считает что полный скан будет эффективней - значит он действительно будет эффективней. С исключениями я ни разу не встречался. Или вот еще пример: Код: plaintext Index Scan Scan T using index ind_Talons_DatAzs_Status_Region_Fuel А если так: Код: plaintext Table Scan Scan T sequentially Это что, тоже оптимально? Не встречали Вы, говорите? Ну, а я встречал... Может быть, хоть вам от осознания этого факта легче станет... Мне не становится... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 17:38 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
YuRockЭто что, тоже оптимально?Да, скорее всего это оптимально. Индекс для работы тоже надо подгрузить с диска. Если сам индекс сильно фрагментирован, то оптимизатор может его забраковать именно из-за фрагментированости. Быстрее будет делать последовательное чтение всей таблицы с диска и нагрузить процессор, чем разгрузить процессор и нагрузить харддрайв беспорядочным чтением секторов. Сильно хочешь индекс? Сделай свой любий индекс кластерным и дефрагментируй таблицу. Смотри команды CREATE CLUSTERED INDEX и REORGANIZE TABLE. Поставь рядышком с ASA8 ASA9, загрузи в девятку копию своей базы и поиграйся с принудительным заданием индекса, смотри планы - увидишь на что тратится время. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 18:10 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
White Owl YuRockЭто что, тоже оптимально?Да, скорее всего это оптимально. Индекс для работы тоже надо подгрузить с диска. Если сам индекс сильно фрагментирован, то оптимизатор может его забраковать именно из-за фрагментированости. Быстрее будет делать последовательное чтение всей таблицы с диска и нагрузить процессор, чем разгрузить процессор и нагрузить харддрайв беспорядочным чтением секторов. Сильно хочешь индекс? Сделай свой любий индекс кластерным и дефрагментируй таблицу. Смотри команды CREATE CLUSTERED INDEX и REORGANIZE TABLE. Поставь рядышком с ASA8 ASA9, загрузи в девятку копию своей базы и поиграйся с принудительным заданием индекса, смотри планы - увидишь на что тратится время. Буду пробовать. Спасибо. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 18:17 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
Насчет неоптимального плана. АСА 9.02.3320 Есть таблица, которая хранит кто и как использует систему на определенные моменты времени (раз в несколько минут): время съема данных, IP, user_id, состояние. Есть индекс по полю времени съема данных. Значений 1,5миллиона. За один день около тысячи значений. Есть запрос типа: выбрать все уникальные IP адреса на заданную дату в разрезе времени съема данных (надо отслеживать параллельные сесиий пользователей с разных IP одновременно). Все было хорошо, выборка использует индекс. Но обнаружилось, что сразу после запуска сервера запрос не использует индекс и делает полное сканирование таблицы. Все последующие запросы уже используют индекс. Перестройка статистики, индексов не помогла. Размер кеша выделяемого под сервер на выбор плана не влиял. При использовании индекса запрос работает около 1сек. При table scan отрабатывает около 30 секунд. Ситуация стабильно воспроизводилась. Как только я захинтовал запрос на использовании индекса, то сразу после запуска сервера этот же запрос отработал за 2-3 сек. Почему, АСА так лажала я разбираться не стал, т.к выкалупывать план сложной ХП из хитрых логов сервера мне было не интерестно. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.03.2007, 19:14 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
Попробуй дропнуть статистику таблицы и посмотри, что получиться. В аналогичной ситуации мне в свое время здесь посоветовали снизить размер страницы. Помогло. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 06:58 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
YuRock Predicate expr( L.LowLimit ) <= 35651891 : 37.712% Statistics expr( L.HighLimit ) >= 35651896 : 61.545% Statistics Как и предполагалось, оптимизатор оказался прав. При 37% записей, удовлетворяющих условию, смысла использовать индекс нету. Не говоря уж про 61%. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 14:17 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
White Owl1) В ASA 8 нельзя задать принудительный индекс. Эта возможность появилась только в ASA 9.0.1 2) Правильный синтаксис задания принудительного индекса: ... from sometable WITH (INDEX(index_name)) Огромное спасибо. Поставил девятку, указал план запроса - и все взлетело! Проблема закрыта. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 16:41 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
YuRock Огромное спасибо. Поставил девятку, указал план запроса - и все взлетело! Проблема закрыта. Не переживай, еще откроется . Когда начнет тормозить из-за несоответствия индекса параметрам выборки. Посмотрел бы лучше index consultant. Попробуй сделать составной индекс, причем по одному полю ASC, по другому DESC. Послушай добрых людей: оптимизатор не так глуп, как тебе может показаться с поверхностного взгляда. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.03.2007, 17:52 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
Александр Гoлдун Не переживай, еще откроется . Когда начнет тормозить из-за несоответствия индекса параметрам выборки. Посмотрел бы лучше index consultant. Попробуй сделать составной индекс, причем по одному полю ASC, по другому DESC. Послушай добрых людей: оптимизатор не так глуп, как тебе может показаться с поверхностного взгляда. Такой индекс и был изначально, но он не использовался НИКОГДА, и я удалил его - сделал 2 на 2 поля. Сейчас я его вернул - без указания плана он по прежнему не используется, и запрос выполняется несколько минут. С Указанием плана - несколько миллисекунд. Так что может оптимизатор и не так глуп, но уж точно не безупречен. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 17:58 |
|
||
|
Проблема с использованием индекса
|
|||
|---|---|---|---|
|
#18+
Конечно не безупречен. Это машина, а машина ДУМАТЬ не умеет. А господ, которые говорят, что оптимизатор делает все правильно - не слушай, они значит не встречались на практике с такими случаями, когда простейший запрос над многомиллионной таблице сервер выполняет сканированием ее. Уж чего, чего, но читать таблицу с диска всяк труднее, чем по индексу одну ее стотысячную часть. А даже, если вся таблица в памяти, а индекс на диске, то все равно, разработчику может быть виднее, и есть смысл заставить сервер "неоптимально" закачать индекс в память, чтоб при последующих пяти вызовах (а это известно только разработчику) выиграть. Может в 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 ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.03.2007, 23:58 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=34388058&tid=2012201]: |
0ms |
get settings: |
6ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
36ms |
get topic data: |
8ms |
get forum data: |
2ms |
get page messages: |
73ms |
get tp. blocked users: |
2ms |
| others: | 248ms |
| total: | 395ms |

| 0 / 0 |
