ЛЮБОЙ оператор имеет значительные проблемы с производительностью при использовании массива в качестве параметра - PullRequest
1 голос
/ 25 марта 2019

Я начал использовать функцию «ANY ()» в запросе вместо «IN» из-за ошибки, связанной с каким-либо параметром. В настоящее время это что-то подобное.

Select * 
FROM geo_closure_leaf 
WHERE geoId = ANY(:geoIds)

Но это оказывает огромное влияние на производительность. Использование запроса с IN намного быстрее, чем с ЛЮБЫМ.

Любое предложение, как мы можем связать массив строковых параметров, может быть передано в выражении 'IN'.

Я пробовал временное исправление, используя

Select * 
FROM geo_closure_leaf 
WHERE geoId IN (''('' || array_to_string(:geoIds::text[] ,''),('') || '')'')

Select * 
FROM geo_closure_leaf 
WHERE geoId IN (select unnest(:geoIds::text[]))

geoIds = массив строк

Так работает.

**public override T Query<T>(string query, IDictionary<string, object> parameters, Func<IDataReader, T> mapper)**
        {
            T Do(NpgsqlCommand command)
            {
                IDataReader reader = null;
                try
                {
                   ** command.CommandText = query;
                    reader = command.AddParameters(parameters).ExecuteReader();**
                    return mapper(reader);
                }
                finally
                {
                    CloseDataReader(reader);
                }
            }

            return Execute(Do);
        }

Объект является массивом строк.

Ожидается: я должен быть в состоянии сделать это, не прибегая к дополнительной логике в sql.

Select * 
FROM geo_closure_leaf 
WHERE geoId IN (:geoIds)

Ответы [ 2 ]

1 голос
/ 26 марта 2019

Разница в производительности не может быть IN против = ANY, поскольку PostgreSQL будет преобразовывать IN в = ANY во время оптимизации запроса.

Разница должна быть подвыборкой.Если вы используете unnest, PostgreSQL всегда будет оценивать, что подзапрос возвращает 100 строк, потому что именно так определяется unnest.

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

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

0 голосов
/ 29 марта 2019

https://dba.stackexchange.com/questions/125413/index-not-used-with-any-but-used-with-in

Нашел этот пост, объясняющий, как Indeexs используются в различных конструкторах 'ANY' & 'IN'.

...