|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
почему следующий запрос в упор не хочет использовать индекс при сортировке результата? что нужно сделать, чтобы уговорить его изменить свое мнение? Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16.
Код: sql 1. 2. 3.
QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is INSERT. The update mode is direct. Worktable1 created, in allpages locking mode, for ORDER BY. FROM TABLE Test1 Nested iteration. Using Clustered Index. Index : XPKTest1 Forward Scan. Positioning at index start. Index contains all needed columns. Base table will not be read. Using I/O Size 8 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages. TO TABLE Worktable1. STEP 2 The type of query is SELECT. This step involves sorting. FROM TABLE Worktable1. Using GETSORTED Table Scan. Forward Scan. Positioning at start of table. Using I/O Size 8 Kbytes for data pages. With MRU Buffer Replacement Strategy for data pages. Код: sql 1.
Adaptive Server Enterprise/15.0.3/EBF 19956 ESD#4.1/P/NT (IX86)/Windows 2003/ase1503/2782/32-bit/OPT/Tue Jun 12 23:37:46 2012 ... |
|||
:
Нравится:
Не нравится:
|
|||
25.08.2012, 00:20 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, Using Clustered Index. Index : XPKTest1 а это что по вашему? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 21:46 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
cherrex_Den, что угодно, но не использование индекса для сортировки. как видно из описания, оно создает временную таблицу для сортировки Worktable1 created, in allpages locking mode, for ORDER BY. на реальных данных(~600 тысяч строк) из-за этой лишней операции происходит переполнение tempdb ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 22:19 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, я бы попробовал следующее: 1) убрать null из полей таблицы 2) явно указать порядок сортировки полей при создании индекса 3) накатить последний ebf или взять последнюю версию 15.5 - есть сильно ненулевая вероятность отсебятины ASE ранних версий 15-шки ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 22:39 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
komrad, 1) таблица стейджинговая, наполняется данными во время работы отчета. сначала частью, затем обогащается. 2) пробовал, не помогает. 3) сервер чужой, не получится... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 22:49 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASEkomrad, 1) таблица стейджинговая, наполняется данными во время работы отчета. сначала частью, затем обогащается. 2) пробовал, не помогает. 3) сервер чужой, не получится... а order by убрать? кластерный индекс и так позволит получить данные в порядке ключа индекса ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 23:18 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
komrad, в данный момент за отсутствием других способов так и сделано, потому как иначе отчет вообще не строится. но не хотелось бы отдавать данную операцию на откуп серверу, мало ли что ему в очередной раз взгрустнется? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 23:24 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASEkomrad, в данный момент за отсутствием других способов так и сделано, потому как иначе отчет вообще не строится. но не хотелось бы отдавать данную операцию на откуп серверу, мало ли что ему в очередной раз взгрустнется? ясно а с некластерным индексом поведение аналогично? а скорость построения отчета? ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 23:26 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE на реальных данных(~600 тысяч строк) из-за этой лишней операции происходит переполнение tempdb а размер tempdb какой? таблица не широкая, размер записи мал, 600 тысяч не большое кол-во ... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 23:29 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
komradа с некластерным индексом поведение аналогично? а скорость построения отчета? неклсатерным создавал его изначально. когда не помогло - попробовал сделать кластерным. отчет тяжелый, строится долго. полчаса-час. на деле таблица заметно шире представленной, и сортировка там идет по 7 полям. но проблема с планом запроса воспроизводится на любом количестве полей и записей, разве что темпдб не переполняется... ... |
|||
:
Нравится:
Не нравится:
|
|||
26.08.2012, 23:36 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASEkomradа с некластерным индексом поведение аналогично? а скорость построения отчета? неклсатерным создавал его изначально. когда не помогло - попробовал сделать кластерным. отчет тяжелый, строится долго. полчаса-час. на деле таблица заметно шире представленной, и сортировка там идет по 7 полям. кластерный по 7-ми полям строится на пустой таблице, так? SortSybASEно проблема с планом запроса воспроизводится на любом количестве полей и записей, разве что темпдб не переполняется... полагаю, что это особенность ранних версий 15-шки не зря после esd 4.1 идет сразу 15.5 вот например классная ошибка: When the ASE ESD number is not an integer (e.g. 1.1, 4.1 or 5.1 etc), then anything using the sp_versioncrack stored procedure (e.g. sp_spaceusage) may encounter a 249 error (conversion error). а чему равно Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 00:20 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
komradкластерный по 7-ми полям строится на пустой таблице, так? ага Код: sql 1.
Parameter NameDefaultMemory UsedConfig ValueRun ValueUnitTypeoptimizer levelase_default 0ase_defaultase_defaultnumberdynamic ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 10:28 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, А нафига вообще что-то сортировать на сервере? ORDER BY это на мой взгляд вообще не нужная вещь. То есть совсем не нужная. Всю сортировку надо делать на клиенте. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 19:52 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
White OwlА нафига вообще что-то сортировать на сервере? а также, для чего на серверной стороне обработка XML, к чему вообще создан процедурный подход, кто придумал курсоры и много других философских вопросов... Если по теме - то клиентская часть подлежит настройке, но не доработке. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 20:51 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASEWhite OwlА нафига вообще что-то сортировать на сервере? а также, для чего на серверной стороне обработка XML, к чему вообще создан процедурный подход, кто придумал курсоры и много других философских вопросов...Твои философские вопросы ехидны. Мой реален. SortSybASEЕсли по теме - то клиентская часть подлежит настройке, но не доработке.Именно что настройке. Если ты на сервере делаешь сортировку по возрастанию алфавита, а клиент хочет обратную сортировку или вообще сортировать по другому полю? Ты будешь сортировать дважды? Сначала на сервере, потом на клиенте? Ну-ну... Да еще и объемы в 600 тысяч строк... Так я повторяю свой вопрос: Нафига сортировать на сервере? Какой реальный выигрыш ты надеешься получить от решения своей задачи? ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 21:12 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
White Owl, все мои ехидные вопросы периодически всплывают в качестве ответов. Снова по теме. представьте себе "черный ящик", на вход которого требуется подать отсортированный поток данных. Это будет практически то, что есть в данном случае. ... |
|||
:
Нравится:
Не нравится:
|
|||
27.08.2012, 21:33 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
> CREATE TABLE dbo.test1 > ( > int1INT NULL, > numb1numeric(10) NULL, > int2INT NULL, > vchar1varchar(10), > ) Схема блокирования таблицы какая ? Если DOL, то таблица реально не сортирована по этому ключу и соответственно не может быть поводом для оптимизации ORDER BY. Posted via ActualForum NNTP Server 1.5 ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 01:57 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
MasterZiv, каюсь, грешен, пока не знаю как посмотреть. но по идее вроде заявлено, что при попадании в индекс сервер должен им пользоваться для сортировки. и в требованиях стоит только чтоб он был покрывающим и порядок сортировки был либо прямой, либо обратный. даже кластеризованным он быть не обязан. Кластеризованным я его сделал, чтобы убрать order by совсем. Но, как Вы заметили, при схеме DOL физический порядок строк не гарантируется... ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 11:08 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, Нет, все правильно! Индекс должен использоваться. ASE 15.7 ESD#2 Есть уникальный не кластерный индекс по полям которые в order by(порядок тотже) Код: sql 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12.
планQUERY PLAN FOR STATEMENT 1 (at line 1). Optimized using Parallel Mode STEP 1 The type of query is SELECT. 1 operator(s) under root |ROOT:EMIT Operator (VA = 1) | | |SCAN Operator (VA = 0) | | FROM TABLE | | crg_specification | | Index : uniq_spec_itm | | Forward Scan. | | Positioning at index start. | | Using I/O Size 64 Kbytes for index leaf pages. | | With LRU Buffer Replacement Strategy for index leaf pages. | | Using I/O Size 64 Kbytes for data pages. | | With LRU Buffer Replacement Strategy for data pages. Так что, проблема в оптимизаторе, или в его настройках. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 13:39 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, >каюсь, грешен, пока не знаю как посмотреть select case when sysstat2 & 57344 =8192 then 'Table uses allpages locking scheme.' when sysstat2 & 57344 =16384 then 'Table uses datapages locking scheme.' when sysstat2 & 57344 =32768 then 'Table uses datapages locking scheme.' end from sysobjects where name='test1' Во первых, попробуйте обновить статистику. Если статистика актуальна, то это похоже на баг оптимизатора. При работе с ASE до 15.5 было замечено достаточно много багов в оптимизаторе как в native mode, так и в compatible mode. Причем с native оптимизатором решать проблемы можно значительно проще используя хотя-бы параметр "optimizer level", или явно настраивая опции оптимизатора. В вашем случае, судя по плану, используется compatible mode. поэтому никаких "костылей" для устранения такого неоптимального плана не получится использовать. Проверил у себя на ASE15.5 ESD4 , (таблица содержит 160 000 строк) . Планы ожидаемые, как в родном режиме оптимизатора так и в режиме совместимости Для compatible mode FROM TABLE test1 Nested iteration. Using Clustered Index. Index : XPKTest1 Forward Scan. Positioning at index start. Index contains all needed columns. Base table will not be read. Using I/O Size 4 Kbytes for index leaf pages. With LRU Buffer Replacement Strategy for index leaf pages. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 13:46 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
moris, спасибо! Я правда, уже в явном виде пытался пересоздать таблицу с использованием lock allpages. Не помогло. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 13:57 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
cherrex_DenSortSybASE, Нет, все правильно! Индекс должен использоваться. Правильно, что должен использоваться. MasterZiv же говорил, видимо об этом(немного выдрано из контекста, но смысл вроде как понятен) A clustered index on a DOL table is STILL a placement index and therefore behaves EXACTLY as a clustered index on APL. The only difference (and all of this is documented) that in the "placement", we do not escalate locks to strictly enforce order - so the row may be put at the end of the page, or in the middle of page - where there is space - or on a new page in same extent - the goal is to place the row NEAR where it needs to go ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 14:10 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
SortSybASE, Index contains all needed columns. Base table will not be read. ... Для данного примера схема блокировки таблицы не важна. Что APL, что DOL. Это index covered scan. Кстати кластерным индекс тоже может не быть. Временная таблица не должна создаваться для index covered scan, если порядок колонок в индексе и направление ASC/DESC совпадают с порядком в order by. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 14:56 |
|
Использование индекса для сортировки
|
|||
---|---|---|---|
#18+
забыл парольSortSybASE, Временная таблица не должна создаваться для index covered scan, если порядок колонок в индексе и направление ASC/DESC совпадают с порядком в order by. Весь вопрос состоит в том, как заставить сервер понять это. Кластеризованный индекс создал, чтобы убрать конструкцию order by. но мне такое решение не нравится и видится неверным. ... |
|||
:
Нравится:
Не нравится:
|
|||
28.08.2012, 15:16 |
|
|
start [/forum/topic.php?fid=55&fpage=14&tid=2010082]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
37ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
others: | 224ms |
total: | 358ms |
0 / 0 |