Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Всем привет! Сервер ASA9.0.2. Существует две таблицы: A(key - primary key; number - integer;1000 записей), B(key - primary key; nfrom,nto - integer; 20000-записей) Для каждой записи из таблицы A существует одна запись из таблицы B, где number лежит в пределах nfrom и nto. Диапазоны nfrom:nto не пересекаются. Выполняется следующий запрос: SELECT * FROM A LEFT JOIN B ON number BETWEEN nfrom AND nto Выполняется 28сек (без дополнительных индексов) :( IndexConsultant посоветовал добавить индекс по nfrom. После добавления этого индекса время выполнения этого же запроса увеличилось до 32 секунд. Вопрос: Как оптимально построить запрос и какой выбрать индекс для увеличения скорости? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 15:21 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Filimonenko SergeyДля каждой записи из таблицы A существует одна запись из таблицы B, где number лежит в пределах nfrom и nto. Диапазоны nfrom:nto не пересекаются. Выполняется следующий запрос: SELECT * FROM A LEFT JOIN B ON number BETWEEN nfrom AND nto Если гарантировано для каждой записи A существует запись в таблице B, то почему вместого прямого соединения используется внешнее LEFT JOIN ? P.S. Индекс консультант посоветовал правильно. Я вот только не понимаю, как это 20 000 записей может столько долго выбираться. А вообще то неплохо к таким вопросам сразу в XML прикладывать графический план запросов, чтобы не гадать на кофейной гуще (как делать, в FAQ описано). ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 15:41 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
ASCRUSЕсли гарантировано для каждой записи A существует запись в таблице B, то почему вместого прямого соединения используется внешнее LEFT JOIN ? Вообще-то не для каждой, но не более одной записи. Но таких записей очень мало (на 1000 записей ~ 30 несуществующих) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 15:58 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
ASCRUS P.S. Индекс консультант посоветовал правильно. Я вот только не понимаю, как это 20 000 записей может столько долго выбираться. А вообще то неплохо к таким вопросам сразу в XML прикладывать графический план запросов, чтобы не гадать на кофейной гуще (как делать, в FAQ описано). Сервер: Pentium 4 2.4GHz, ОЗУ 512Mb. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 16:02 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Забыл файлик плана приложить ... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 16:13 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
А индексы на таблицу "tbPrihod_Aktiv" какие есть ? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 11.11.2005, 17:05 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
ASCRUSА индексы на таблицу "tbPrihod_Aktiv" какие есть ? Никаких. Я ж говорю, что без индексов выполнялся запрос 28 сек, а с индексом по nfrom(который посоветовал IndexConsultant) - 32. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 13.11.2005, 15:02 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Filimonenko Sergey ASCRUSА индексы на таблицу "tbPrihod_Aktiv" какие есть ? Никаких. Я ж говорю, что без индексов выполнялся запрос 28 сек, а с индексом по nfrom(который посоветовал IndexConsultant) - 32.Сам я не местный, поэтому не судите строго, но есть у меня пару мыслей... Планы посмотреть не сумел, поэтому всё нижесказанное есть ничто иное , как мои личные предположения... 1) Построенный индекс (хоть это и посоветовал сделать IndexConsultant) в данном конкретном случае совершенно не принесет никакой пользы. Фактически получается так, что мы индексируем столбец одной таблицы, а ограничение на попадание в диапазон указываем для столбца другой таблицы. Ведь как ни крути, но условие соединения таблиц number BETWEEN nfrom AND nto ограничивает столбец number таблицы А (а по нему индекса-то и не нету) 2) Почему с индексом запрос стал медленнее работать??? Это тоже совершенно понятно. Когда индекса не было, сервер при выполнении запроса делал следующие действия: полностью читал таблицу А , полностью читал таблицу В , после чего соединял данные из этих таблиц методом HashJoin. Итого, в этом случае имеем следующие растраты: 1 чтение таблицы А (1000 строк) + 1 чтение таблицы В (20000 строк) + 1 соединение HashJoin. Построили индекс... Получили следующее: С учетом того, что исходный запрос выполняется сервером фактически вот в таком виде: Код: plaintext 1. 2. 3. 4. В итоге все сводится к следующим издержкам: 1 чтение таблицы А (1000 строк) + 1000 диапазонных чтений индекса по полю nfrom таблицы В (от MIN значения в индексе до текущего значения number и так для всех 1000 записей из таблицы А ) + чтение (1000 - (~30)) * f(А) записей с таблицы В . Где: 1000 - число записей в таблице А (уазано автором темы) 30 - число несовпадающих записей (тоже ин-фа от автора) При этом на каждом цикле соединения приходится извлекать из индекса по nfrom столько записей, сколько укладывается в условие number >= nfrom (это число f(А), фактически дискретная функция, зависящая от значения в поле number таблицы А ). После этого для каждой извлеченной записи индекса приходится читать строку из таблицы В , дабы проверить условие AND number <= nto (ведь в построенном индексе нет никакой информации о значении поля nto таблицы В ) В итоге, получаем нехилое число "левых" чтений. Что и приводит к замедлению работы запроса... А вот почему происходит переход с HashJoin на NestedLoops - это уже вопрос к ГУРУ в Sybase. Тут уж я ничего сказать не могу... З.Ы. Если в чем не прав, ГУРУ меня поправят... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 19:04 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Огромное спасибо, что объяснили, в чем тормознутось этого индекса, но неужели на такой довольно неплохой машине и при относительно небольших данных он так долго выполняется даже при тупом TableScan'e? Мне кажется, что сдесь проблема не в индексе, а нужно правильно построить запрос, ведь в нем не используется то условие, что для каждой записи первой таблицы есть не больше одной соответствующей записи из второй таблицы, и эти диапазоны не пересекаются. Логически подумав можно предложить такой мнемонический алгоритм нахождения решения: Sort(A.Number); Sort(B.NFrom); FOR i=1 TO A.Count DO WHILE A.Number >B.NTo DO B.Next; IF A.Number BETWEEN B.NFrom AND B.NTo Link(A.Key,B.key); ELSE Link(A.key,Null); ENDIF A.Next; ENDFOR Я думаю такой алгоритм будет работать значительно быстрее, чем тупой Left Join. Но как по такому алгоритму составить какой-то запрос? ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 20:19 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
создал схожие таблички с примерно таким же набором записей. Вначале не создавал индексы, время выборки 12 сек. Потом создал индекс на A.number и составной индекс на поля B.nfrom и B.nto, время выборки составило 3-4 сек. P!!! 1GHz ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 14.11.2005, 21:11 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Рыжий Котсоздал схожие таблички с примерно таким же набором записей. Вначале не создавал индексы, время выборки 12 сек. Потом создал индекс на A.number и составной индекс на поля B.nfrom и B.nto, время выборки составило 3-4 сек. P!!! 1GHz Если вас не затруднит, не могли бы вы выслать мне эту базу с индексами на falcon@online.com.ua. Создал новую базу, создал в ней заново две таблицы: CREATE TABLE "DBA"."a" ( "km" integer NOT NULL DEFAULT autoincrement, "nomer" integer NOT NULL, CONSTRAINT "km" PRIMARY KEY ( "km" ) ); CREATE TABLE "DBA"."b" ( "km" integer NOT NULL DEFAULT autoincrement, "nfrom" integer NOT NULL, "nto" integer NOT NULL, PRIMARY KEY ( "km" ) ); Скопировал туда поля nomer из первой таблицы(1000) и nfrom, nto из второй(~20000). Запрос: SELECT count(*) FROM a left join b on nomer between nfrom and nto без индексов работал 12 сек. Создал индексы: CREATE INDEX "aa" ON "DBA"."a" ( "nomer" ASC ) IN "SYSTEM"; CREATE INDEX "bb" ON "DBA"."b" ( "nfrom" ASC, "nto" ASC ) IN "SYSTEM"; Тот же запрос стал работать 20 секунд:( P4,3.4Ghz,Озу 1Gb Во вложении планы запроса с индексом и без. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 11:53 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Давайте сделаем так. База дома, а я на работе. Если возможно вышлите на почту red_cat1930 собака mail.ru базу в которую вы вставили только эти две таблички, я прям сейчас посмотрел бы. З.Ы. а вообще, неплохо было бы, чтобы у модераторов была возможность класть на фтп данного сайта подобные вещи, чтобы можно было скачать всем желающим. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 13:38 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Получил базу и ошарашен. время выполнения запроса что с индексами, что без индексов - 0 (ноль) секуд! ASA 9.0.2 3207. Использовался процессор Centrino работающий в энергосберегающем режиме, т.е. где-то 600 мегагерц. Так что база и запрос - в порядке. Вечером дополнительно проверю на домашей машине, где стоит такая же версия сервера. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 15.11.2005, 16:22 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Чудеса и только. На P!!! 1Ггц время 18 секунд. Никакой разницы в версии сервера и баз нет. На самом деле Центрино задумывается на 2-3 секунды, но время выполнения выдает от 0 до 0,7 сек. Ничего не понимаю. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 09:20 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Рыжий КотЧудеса и только. На P!!! 1Ггц время 18 секунд. Никакой разницы в версии сервера и баз нет. На самом деле Центрино задумывается на 2-3 секунды, но время выполнения выдает от 0 до 0,7 сек. Ничего не понимаю. А 18 сек - это с индексами или без? И сколько с индексами? Кстати проверил у себя дома на Athlon'e 2200XP+,Озу 512Mb, без индесов работает 12 сек, с индексами - 17, т.е. даже быстрее, чем на работе (P4,3.4Ghz,Озу 1Gb). Мистика какая-то! А может это зависит от дистрибутива сервера, или от каких-то тонких настроек операционной системы ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 19:40 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
без индексов на полсекунды побыстрее единственное бредовое объяснение: в центрино 2Мб кэша на проце, таблички маленькие и все туда помещается... больше пока ничего не могу сказать ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 20:11 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
получил 6 сек. на гигагерцовой машине: удалил все индексы из таблицы а и b, создал только 2 индекса по каждому из полей nfrom и nto. т.е. составной индекс только мешает... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 16.11.2005, 20:30 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Рыжий Котполучил 6 сек. на гигагерцовой машине: удалил все индексы из таблицы а и b, создал только 2 индекса по каждому из полей nfrom и nto. т.е. составной индекс только мешает... Получил 7 секунд на P4,3.4FGhz(1Gb) - минимально возможное при единственном индексе на nto. Если ставить два индекса (на nfrom,nto) - віполняется 12 сек (столько же, сколько и без индексов) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 17.11.2005, 11:50 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
Для чистоты эксперимента нужно убивать и создавать статистику перед каждой выборкой. Так же имеет значение размер страницы для каждой конкретной машины. Ну, и калибровку желательно выполнить. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 08:50 |
|
||
|
Вопрос по индексам
|
|||
|---|---|---|---|
|
#18+
old_joyДля чистоты эксперимента нужно убивать и создавать статистику перед каждой выборкой. Так же имеет значение размер страницы для каждой конкретной машины. Ну, и калибровку желательно выполнить. меня удивляет другое: почему для более быстрой выборки нужно удалять другие индексы, ведь они могут использоваться для ускорения других запросов... ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 18.11.2005, 09:01 |
|
||
|
|

start [/forum/topic.php?fid=55&msg=33379607&tid=2013253]: |
0ms |
get settings: |
9ms |
get forum list: |
14ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
28ms |
get topic data: |
12ms |
get forum data: |
3ms |
get page messages: |
76ms |
get tp. blocked users: |
1ms |
| others: | 216ms |
| total: | 365ms |

| 0 / 0 |
