Хотя я вижу здесь несколько хороших ответов, пару важных моментов упущены -
SELECT Table_1.Field_1,
Table_1.Field_2,
SUM(Table_1.Field_5) BALANCE_AMOUNT
FROM Table_1, Table_2
WHERE Table_1.Field_3 NOT IN (1, 3)
AND Table_2.Field_2 <> 2
AND Table_2.Field_3 = 'Y'
AND Table_1.Field_1 = Table_2.Field_1
AND Table_1.Field_4 = '31-oct-2011'
GROUP BY Table_1.Field_1, Table_1.Field_2;
Сказать, что наличие в предложении select значения SUM (Table_1.Field_5) приводит к тому, что индекс не будет использоваться в неверном виде.Ваш индекс на (Field_1,Field_2,Field_3,Field_4)
все еще может быть использован.Но есть проблемы с вашим индексом и SQL-запросом.
Так как ваш индекс только на (Field_1,Field_2,Field_3,Field_4)
, даже если ваш индекс используется, БД будет вынужден получить доступ к фактической строке таблицы, чтобы получить Field_5 для применения фильтра.Теперь это полностью зависит от плана выполнения, составленного из оптимизатора SQL, который является экономически эффективным.Если оптимизатор SQL обнаружит, что full table scan
имеет меньшую стоимость, чем использование индекса, он будет игнорировать индекс.Скажем так, теперь я расскажу вам о возможных проблемах с вашим индексом -
- Поскольку у других есть состояния, вы можете просто добавить Field_5 в индекс, чтобы не требовался отдельный доступ к таблице.
- Ваш порядок индекса очень важен для производительности.Например,в вашем случае, если вы отдадите ордер как
(Field_4,Field_1,Field_2,Field_3)
, это будет быстрее, так как у вас есть равенство в Field_4 - Table_1.Field_4 = '31-oct-2011'
.Подумайте, это было -
Table_1.Field_4 = '31-oct-2011'
даст вам меньше возможностей для выбора окончательного результата, чем Table_1.Field_3 NOT IN (1, 3)
.Вещи могут измениться, так как вы делаете соединение.Всегда лучше увидеть план выполнения и соответствующим образом спроектировать индекс / sql.