![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизация запроса FireBird
Aristarh © (2003-07-24 19:39:00)Неужели все сортировки настолько(!) тормозят запрос?
Запросы:
SELECT SA.SALDODATE, S.NAME, A.HOUSE, A.LITERA, A.FLAT, A.FIO, SALDOIN, NACH, PAY, SALDOOUT, SA.ID
FROM STREETS S,
ABONENTS A,
SALDO SA
WHERE
(
(SA.SALDODATE = "01.07.2003")
and
(SA.ID = A.ID)
and
(S.CODE = A.STREET)
)
order by Streets.Name, House, Litera, Flat
Либо:
SELECT SA.SALDODATE, S.NAME, A.HOUSE, A.LITERA, A.FLAT, A.FIO, SALDOIN, NACH, PAY, SALDOOUT, SA.ID
FROM SALDO SA
INNER JOIN ABONENTS A ON (SA.ID = A.ID)
INNER JOIN STREETS S ON (A.STREET = S.CODE)
WHERE
(
(SA.SALDODATE = "01.07.2003")
)
order by Streets.Name, House, Litera, Flat
Выполняются 5 секунд каждый. Это запросы, которые возвращают одну и ту же выборку.
Стоит только убрать сортировку, т.е. строку
order by Streets.Name, House, Litera, Flat
как запросы начинают выполняться за 50 милисекунд (!!) В сто раз быстрее. Причем неважно какая сортировка, т.е. даже при сортировке по простому индексированомуSaldo.IDвсе равно наблюдается замедление в 100 раз. (5 сек)
Как можно уменьшить время сортировки? Или все безнадежно?
Структура таблиц:
SALDO:
ID INTEGER NOT NULL, (индекс)
SALDOIN DOUBLE PRECISION,
NACH DOUBLE PRECISION,
PAY DOUBLE PRECISION,
SALDOOUT DOUBLE PRECISION,
SALDODATE DATE NOT NULL (индекс)
ABONENTS:
ID INTEGER NOT NULL, (primary key)
FIO CHAR(30) NOT NULL, (индекс)
STREET INTEGER, (индекс)
HOUSE SMALLINT,
LITERA CHAR(3),
FLAT SMALLINT,
STREET:
CODE INTEGER NOT NULL, (primary key)
( 50)Неужели все сортировки настолько(!) тормозят запрос?
Запросы:
SELECT SA.SALDODATE, S.NAME, A.HOUSE, A.LITERA, A.FLAT, A.FIO, SALDOIN, NACH, PAY, SALDOOUT, SA.ID
FROM STREETS S,
ABONENTS A,
SALDO SA
WHERE
(
(SA.SALDODATE = "01.07.2003")
and
(SA.ID = A.ID)
and
(S.CODE = A.STREET)
)
order by Streets.Name, House, Litera, Flat
Либо:
SELECT SA.SALDODATE, S.NAME, A.HOUSE, A.LITERA, A.FLAT, A.FIO, SALDOIN, NACH, PAY, SALDOOUT, SA.ID
FROM SALDO SA
INNER JOIN ABONENTS A ON (SA.ID = A.ID)
INNER JOIN STREETS S ON (A.STREET = S.CODE)
WHERE
(
(SA.SALDODATE = "01.07.2003")
)
order by Streets.Name, House, Litera, Flat
Выполняются 5 секунд каждый. Это запросы, которые возвращают одну и ту же выборку.
Стоит только убрать сортировку, т.е. строку
order by Streets.Name, House, Litera, Flat
как запросы начинают выполняться за 50 милисекунд (!!) В сто раз быстрее. Причем неважно какая сортировка, т.е. даже при сортировке по простому индексированомуSaldo.IDвсе равно наблюдается замедление в 100 раз. (5 сек)
Как можно уменьшить время сортировки? Или все безнадежно?
Структура таблиц:
SALDO:
ID INTEGER NOT NULL, (индекс)
SALDOIN DOUBLE PRECISION,
NACH DOUBLE PRECISION,
PAY DOUBLE PRECISION,
SALDOOUT DOUBLE PRECISION,
SALDODATE DATE NOT NULL (индекс)
ABONENTS:
ID INTEGER NOT NULL, (primary key)
FIO CHAR(30) NOT NULL, (индекс)
STREET INTEGER, (индекс)
HOUSE SMALLINT,
LITERA CHAR(3),
FLAT SMALLINT,
STREET:
CODE INTEGER NOT NULL, (primary key)
NAME VARCHAR(50) NOT NULL
Aristarh (2003-07-25 11:52:00) [21]
>Sergey13 © (25.07.03 08:23)
Запрос возвращает порядка 5 тыс. записей из таблицы Saldo, в
которой содержится всего ~150 тыс. записей.
>Тем паче что первое сортируемое поле VARCHAR(50).
Даже по целомуSaldo.IDвремя выполнения точно такое
же: 5 сек. Так что VARCHAR ни при чем.
>Johnmen © (25.07.03 09:14)
Возможно и удастся... Где можно план посмотреть?
>Zacho © (25.07.03 09:42)
Версия Firebird-1.0.0.796-Win32
Zacho (2003-07-25 09:42:00) [22]
Какая версия FB ? Подозреваю, что попробовав выполнить тот же запрос на FB 1.5 или Yaffil ты приятно удивишься.
Johnmen (2003-07-25 09:14:00) [23]
Смотри планы выполнения запросов. Возможно, удастся оптимизировать...
Sergey13 (2003-07-25 08:23:00) [24]
>Неужели все сортировки настолько(!) тормозят запрос?
Не все. Вернее все, но не все "настолько(!)".
А что тебя так удивляет? Сколько записей возвращает запрос? Тем паче что первое сортируемое поле VARCHAR(50).