powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Sybase ASA, ASE, IQ [игнор отключен] [закрыт для гостей] / Вопрос по индексам
21 сообщений из 21, страница 1 из 1
Вопрос по индексам
    #33373969
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Всем привет!
Сервер 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 секунд.

Вопрос: Как оптимально построить запрос и какой выбрать индекс для увеличения скорости?
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33374037
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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 описано).
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33374088
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUSЕсли гарантировано для каждой записи A существует запись в таблице B, то почему вместого прямого соединения используется внешнее LEFT JOIN ?

Вообще-то не для каждой, но не более одной записи. Но таких записей очень мало (на 1000 записей ~ 30 несуществующих)
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33374099
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUS
P.S. Индекс консультант посоветовал правильно. Я вот только не понимаю, как это 20 000 записей может столько долго выбираться. А вообще то неплохо к таким вопросам сразу в XML прикладывать графический план запросов, чтобы не гадать на кофейной гуще (как делать, в FAQ описано).

Сервер: Pentium 4 2.4GHz, ОЗУ 512Mb.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33374129
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Забыл файлик плана приложить ...
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33374272
Фотография ASCRUS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А индексы на таблицу "tbPrihod_Aktiv" какие есть ?
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33375427
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ASCRUSА индексы на таблицу "tbPrihod_Aktiv" какие есть ?
Никаких. Я ж говорю, что без индексов выполнялся запрос 28 сек, а с индексом по nfrom(который посоветовал IndexConsultant) - 32.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33377543
Владимор Конев
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
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.
SELECT * 
  FROM A LEFT JOIN 
       B 
    ON number >= nfrom 
   AND number <= nto
Выполняя запрос, сервер видя наличие индекса срывается с HashJoin-а и переходит на соединение посредством NestedLoops.
В итоге все сводится к следующим издержкам:
1 чтение таблицы А (1000 строк) + 1000 диапазонных чтений индекса по полю nfrom таблицы В (от MIN значения в индексе до текущего значения number и так для всех 1000 записей из таблицы А ) + чтение (1000 - (~30)) * f(А) записей с таблицы В .
Где: 1000 - число записей в таблице А (уазано автором темы)
30 - число несовпадающих записей (тоже ин-фа от автора)
При этом на каждом цикле соединения приходится извлекать из индекса по nfrom столько записей, сколько укладывается в условие number >= nfrom (это число f(А), фактически дискретная функция, зависящая от значения в поле number таблицы А ). После этого для каждой извлеченной записи индекса приходится читать строку из таблицы В , дабы проверить условие AND number <= nto (ведь в построенном индексе нет никакой информации о значении поля nto таблицы В )
В итоге, получаем нехилое число "левых" чтений. Что и приводит к замедлению работы запроса...

А вот почему происходит переход с HashJoin на NestedLoops - это уже вопрос к ГУРУ в Sybase. Тут уж я ничего сказать не могу...

З.Ы.
Если в чем не прав, ГУРУ меня поправят...
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33377651
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Огромное спасибо, что объяснили, в чем тормознутось этого индекса, но неужели на такой довольно неплохой машине и при относительно небольших данных он так долго выполняется даже при тупом 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.
Но как по такому алгоритму составить какой-то запрос?
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33377691
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
создал схожие таблички с примерно таким же набором записей.
Вначале не создавал индексы, время выборки 12 сек.
Потом создал индекс на A.number и составной индекс на поля B.nfrom и B.nto, время выборки составило 3-4 сек.
P!!! 1GHz
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33377692
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ASA 9.0.2 3207
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33378547
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рыжий Котсоздал схожие таблички с примерно таким же набором записей.
Вначале не создавал индексы, время выборки 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
Во вложении планы запроса с индексом и без.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33378999
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Давайте сделаем так.
База дома, а я на работе.
Если возможно вышлите на почту red_cat1930 собака mail.ru базу в которую вы вставили только эти две таблички, я прям сейчас посмотрел бы.
З.Ы. а вообще, неплохо было бы, чтобы у модераторов была возможность класть на фтп данного сайта подобные вещи, чтобы можно было скачать всем желающим.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33379607
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Получил базу и ошарашен.
время выполнения запроса что с индексами, что без индексов - 0 (ноль) секуд! ASA 9.0.2 3207. Использовался процессор Centrino работающий в энергосберегающем режиме, т.е. где-то 600 мегагерц. Так что база и запрос - в порядке. Вечером дополнительно проверю на домашей машине, где стоит такая же версия сервера.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33380485
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Чудеса и только. На P!!! 1Ггц время 18 секунд. Никакой разницы в версии сервера и баз нет. На самом деле Центрино задумывается на 2-3 секунды, но время выполнения выдает от 0 до 0,7 сек. Ничего не понимаю.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33382564
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рыжий КотЧудеса и только. На P!!! 1Ггц время 18 секунд. Никакой разницы в версии сервера и баз нет. На самом деле Центрино задумывается на 2-3 секунды, но время выполнения выдает от 0 до 0,7 сек. Ничего не понимаю.

А 18 сек - это с индексами или без? И сколько с индексами?

Кстати проверил у себя дома на Athlon'e 2200XP+,Озу 512Mb, без индесов работает 12 сек, с индексами - 17, т.е. даже быстрее, чем на работе (P4,3.4Ghz,Озу 1Gb).

Мистика какая-то! А может это зависит от дистрибутива сервера, или от каких-то тонких настроек операционной системы
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33382597
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
без индексов на полсекунды побыстрее
единственное бредовое объяснение: в центрино 2Мб кэша на проце, таблички маленькие и все туда помещается... больше пока ничего не могу сказать
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33382621
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
получил 6 сек. на гигагерцовой машине: удалил все индексы из таблицы а и b, создал только 2 индекса по каждому из полей nfrom и nto. т.е. составной индекс только мешает...
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33383601
Filimonenko Sergey
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Рыжий Котполучил 6 сек. на гигагерцовой машине: удалил все индексы из таблицы а и b, создал только 2 индекса по каждому из полей nfrom и nto. т.е. составной индекс только мешает...

Получил 7 секунд на P4,3.4FGhz(1Gb) - минимально возможное при единственном индексе на nto. Если ставить два индекса (на nfrom,nto) - віполняется 12 сек (столько же, сколько и без индексов)
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33385756
old_joy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для чистоты эксперимента нужно убивать и создавать статистику перед каждой выборкой. Так же имеет значение размер страницы для каждой конкретной машины. Ну, и калибровку желательно выполнить.
...
Рейтинг: 0 / 0
Вопрос по индексам
    #33385768
Фотография Рыжий Кот
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
old_joyДля чистоты эксперимента нужно убивать и создавать статистику перед каждой выборкой. Так же имеет значение размер страницы для каждой конкретной машины. Ну, и калибровку желательно выполнить.

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


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