Мой индекс будет использоваться, если все столбцы не будут использоваться?

Исключение нулевого указателя - это индикатор того, что вы используете объект, не инициализируя его.

Например, ниже - класс ученика, который будет использовать его в нашем коде.

public class Student {

    private int id;

    public int getId() {
        return this.id;
    }

    public setId(int newId) {
        this.id = newId;
    }
}

Приведенный ниже код дает вам исключение с нулевым указателем.

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}

Поскольку вы используете Obj_Student, но вы забыли инициализировать его, как в правильном коде, показанном ниже:

public class School {

    Student obj_Student;

    public School() {
        try {
            obj_Student = new Student();
            obj_Student.setId(12);
            obj_Student.getId();
        }
        catch(Exception e) {
            System.out.println("Null Pointer ");
        }
    }
}
16
задан Dustin Laine 8 June 2011 в 17:07
поделиться

8 ответов

David B прав, что необходимо проверить план выполнения, чтобы проверить, что индекс используется.

индекс будет использоваться, или отдельное индексирует быть необходимым, который только включает A, B, C?

Для ответа на эту последнюю часть вопроса, который я думаю, базовая базовая тема (в противоположность непосредственному решению), существует почти никогда причина индексировать подмножество индексированных столбцов. Если Ваш индекс (A, B, C, D), ГДЕ против (A, B, C), скорее всего, приведет к индексу , ищут , который является идеальной ситуацией - индекс включает всю информацию, механизм должен перейти непосредственно к набору результатов. Я полагаю, что это, сохраняется для числовых типов и для тестов равенства в строковых типах, хотя это может сломаться с ПОДОБНЫМ '% 's). С другой стороны, если Ваш, ГДЕ только D, на который ссылаются, Вы, скорее всего, закончили бы с индексным сканированием , который будет означать, что механизм SQL должен был бы просканировать через все комбинации A, B, и C, и затем проверить, соответствовал ли D Вашим критериям прежде, чем решить, добавить ли строку к набору результатов. На особенно большой таблице, когда я имел необходимость, чтобы сделать много запросов против столбца "D", я добавил дополнительный индекс для D только и занялся 90%-м повышением производительности.

Редактирование: Я должен также рекомендовать использовать Настраивающего Советника по вопросам Механизма базы данных в Studio управления SQL. Это скажет Вам, если Ваша таблица не будет индексирована идеально для запроса, Вы хотите работать.

11
ответ дан 30 November 2019 в 17:05
поделиться

Это зависит!

WHERE A like '%x%'
  and B = 1
  and C = 1
//
WHERE A = 1
  OR B = 1
  OR C = 1
//
WHERE DateAdd(dd, 1, A) = '2008-01-01'
  AND B = 1
  AND C = 1

Они не будут полагаться на индекс, потому что индекс не полезен.

Нажимают на "display estimated execution plan" для подтверждения потенциального индексного использования.

8
ответ дан 30 November 2019 в 17:05
поделиться

в базах данных Oracle это называют Сводный индекс (12-граммовые документы, но допустимым для более ранних версий)

, Сводные индексы могут ускорить извлечение данных для операторов SELECT в который ссылки оператора Where вся ведущая часть столбцов в сводном индексе. Поэтому порядок столбцов, используемых в определении, важен. В целом столбцы, к которым обычно получают доступ, идут сначала.

так в Вашем случае, Да. индекс/может использоваться. это могло быть проверено при помощи объяснить плана.

, если MS SQLSERVER отличается (и я подозреваю, это могло бы), Вы нуждаться в новом ответе.

Редактирование: Должен также упомянуть, что это будет только рассматривать индекс для использования.. это не обязательно означает, что будет использовать его.

Edit2: Oracle 11 г и позже теперь имеют опцию, которая позволит ей пропускать столбцы в индексе. так запрос на A, B и D мог бы все еще использовать индекс

5
ответ дан 30 November 2019 в 17:05
поделиться

Индекс будет использоваться, да. Это довольно умно, о котором индексы произведут более оптимальный план запросов, и это не должно испытывать затруднения из-за этого.

Как с этим видом вещи, не делайте честное слово - сравнивают его. Составьте таблицу, заполните ее представительными данными, запросите ее, индексируйте ее и запросите ее снова.

4
ответ дан 30 November 2019 в 17:05
поделиться

То, что индекс содержит столбец, который не используется в Вашем запросе, не будет препятствовать тому, чтобы он использовался.

Но это вовсе не значит, что это определенно будет использоваться, это может быть проигнорировано по другой причине (возможно, потому что один или несколько других индексов более полезны).

Как всегда, возьмите squizz в предполагаемом плане выполнения для наблюдения то, что, вероятно, произойдет.

2
ответ дан 30 November 2019 в 17:05
поделиться

Запустите с простого, равняется поиску (ГДЕ A=1 и B ='Red' и C=287) да, индекс будет (скорее всего), использоваться. Индекс будет использоваться сначала, чтобы помочь оптимизатору "предположить" количество строк, которые будут соответствовать выбору, и затем второй, к на самом деле получают доступ к тем строкам.

В ответ на комментарий B David о "подобном" предикате, SQLServer может все еще использовать индекс, он зависит от того, что Вы выбираете. Например, при выборе количества (*) затем, SQLServer, вероятно, просканировал бы индекс и считал бы хиты, которые соответствуют, где пункт начиная с индекса меньше и потребовал бы, чтобы меньше iOS просканировало. И это может решить сделать это даже при выборе некоторых столбцов из базовой таблицы, в зависимости от того, как выборочный SQLServer чувствует, что индекс.

2
ответ дан 30 November 2019 в 17:05
поделиться

Вот другой, "это зависит", ответ... это также зависит от того, насколько большой Ваша таблица...

я соглашаюсь со всеми остальными, кто упомянул, что проверил план выполнения, чтобы проверить, используется ли Ваш индекс.

Вот несколько статей о чтении плана выполнения, который необходимо найти полезным:

http://www.sqlservercentral.com/articles/Administering/executionplans/1345/ http://www.codeproject.com/KB/database/sql-tuning-tutorial-1.aspx

существует также хорошая статья о, ищет по сравнению со сканированиями, которые я рекомендовал бы: http://blogs.msdn.com/craigfr/archive/2006/06/26/647852.aspx

существует журнал хороших статей о блоге Craig Freedman, вот другой, необходимо найти полезным. Эта статья о части использования SQL Server факторов для определения который индекс использовать...

http://blogs.msdn.com/craigfr/archive/2006/07/13/664902.aspx

Заботится! Jeff

1
ответ дан 30 November 2019 в 17:05
поделиться

Вообще говоря, да это будет, все современные базы данных достаточно умны, чтобы сделать это. Существуют исключения, например, если статистические данные по таблице покажут, что объем данных в ней является достаточно небольшим, что полное чтение таблицы будет более эффективным затем, то индекс будет обесценен, но как правило, можно полагаться на нее в соответствующих случаях.

, Следовательно, можно использовать в своих интересах это при разработке индексов. Скажите, например, что у меня есть таблица, которая содержит A, B, C как значения ключа и столбцы Y и Z, содержащие данные, которые я знаю, будет часто получаться операторами

SELECT Y FROM table WHERE A = alpha and B = beta and C = gamma 

SELECT Z FROM table WHERE A = alpha and B = beta and C = gamma 

, я будет обычно создавать индекс на A, B, C, X, Z - предполагающий, что X и Z некоторое довольно небольшое поле. Причина этого состоит в том, что я знаю, что трасса доступа в операторах выше будет использовать индекс, и , поскольку данные, которые я хочу получить, уже находятся в индексном чтении затем, никакое отдельное чтение блока данных, требуемого получать сами данные таблицы, не будет необходимо. Эта стратегия может существенно ускорить поиск данных при некоторых обстоятельствах. Конечно, Вы платите за него в затратах на обновление и дисковом пространстве, таким образом, необходимо понять то, что база данных делает прежде, чем применить его, но поскольку в большинстве чтений баз данных существенно превосходят численностью записи, это обычно определенно стоит соображения.

1
ответ дан 30 November 2019 в 17:05
поделиться
Другие вопросы по тегам:

Похожие вопросы: