"Ivan Markov" <[EMAIL PROTECTED]> wrote:
SELECT DOSTAVKA.DOSTAVKA_ID, DOSTAVKA.DOSTAVKA_DATE,
DOSTAVKA.STATUS, DOSTAVKA_SCHETA.SCHET
FROM DOSTAVKA
INNER JOIN DOSTAVKA_SCHETA ON
(DOSTAVKA.DOSTAVKA_ID = DOSTAVKA_SCHETA.DOSTAVKA_ID)
WHERE
DOSTAVKA_SCHETA.SCHET = '111/111'
AND
DOSTAVKA.STATUS = 1
ORDER BY DOSTAVKA.DOSTAVKA_DATE, DOSTAVKA.DOSTAVKA_ID
План:
PLAN SORT (JOIN (DOSTAVKA INDEX (DOSTAVKA_IDX2),DOSTAVKA_SCHETA INDEX
(DOSTAVKA_SCHETA_IDX1,FK_DOSTAVKA_SCHETA_1)))
Лезу в анализ производительности,
удивляюсь:
Индексные чтения:
DOSTAVKA_SCHETA - 2 ... как и ожидалось!
DOSTAVKA - 8 !!!!!
Дык на таблицу DOSTAVKA есть только условие по STATUS, так что все логично.
В твоем конкретном варианте лучший результат был бы, если бы джойн начался с
таблицы DOSTAVKA_SCHETA, но если у тебя там будут записи по счету '111/111',
относящиеся к неподписанным доставкам, то все равно чтений из первой таблицы
будет больше, чем записей в результате. Это абсолютно нормально.
Получается что что бы сформировать
результат из 2-х строк, запрос молотит
все индексы STATUS со значением 1 ?
Результат из 2-х строк получается пересечением условий по двум таблицам. При
этом теоретически невозможно прочитать каждую лишь минимально необходимое
число раз.
--
Дмитрий Еманов