Может ли SQL с условием CASE использовать индекс в PostgreSQL? - PullRequest
0 голосов
/ 30 мая 2020

Когда я пишу SQL как SELECT * FROM table WHERE table.col && object, я мог бы использовать построенный мной индекс (поскольку он поддерживает оператор &&), но с

SELECT * FROM table WHERE 
    CASE 
    WHEN table.col && object = true THEN true 
    ELSE false 
    END

Кажется, я не могу использовать индекс ?

В чем причина? Есть ли способ решить эту проблему? На самом деле я хочу реализовать logi c вроде CASE WHEN a&&b = true THEN a<b ELSE a>b END с поддержкой индекса, возможно ли это?

Ответы [ 3 ]

1 голос
/ 30 мая 2020

На самом деле вам даже не нужно использовать здесь выражение CASE:

SELECT *
FROM yourTable
WHERE (some_condition AND a < b) OR (!some_condition AND a > b);

При этом я удивлен, что индекс нельзя использовать, потому что в целом ваш logi c вероятно, можно оптимизировать до чего-то вроде приведенного выше, без необходимости выражения CASE.

0 голосов
/ 30 мая 2020

Я предполагаю, что не существует ситуации, когда выражение case могло бы использовать индекс в Postgres. Это связано с тем, что выражение case обеспечивает порядок оценки, что довольно сложно обеспечить, если задействованы индексы.

Могут быть некоторые исключения, когда компилятор распознает, что выражение case является избыточным и он удаляется перед фазой оптимизации.

Тем не менее, ваше выражение case бесполезно. Просто используйте:

SELECT *
FROM table
WHERE table.col AND object ;

Примечания:

  • Стандарт SQL для логических значений - AND. Используйте его.
  • = true избыточно. Вы можете включить его, но это не обязательно.
  • У вас есть два логических столбца. Во многих случаях индекс не будет использоваться, даже если он доступен, потому что столбцы (вероятно) не очень избирательны.
0 голосов
/ 30 мая 2020

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

SELECT CASE WHEN table.col && object = true THEN true ELSE false END as INTO #TEMP_TABLE FROM table

Затем вы можете создать CLUSTERED / NON_CLUSTERED INDEX

CREATE INDEX idx_col в TABLE #TEMP_TABLE ()

Затем вы можете выбрать результат:

SELECT * ОТ #TEMP_TABLE WHERE =

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...