gpt4 book ai didi

postgresql - 使用数组作为参数时,ANY 运算符会出现严重的性能问题

转载 作者:行者123 更新时间:2023-11-29 13:10:33 24 4
gpt4 key购买 nike

由于某些参数绑定(bind)错误,我开始在查询中使用“ANY()”函数而不是“IN”。目前是这样的。

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

但是对性能影响很大。使用带有 IN 的查询比使用 ANY 快得多。

关于如何绑定(bind)字符串参数数组的任何建议都可以在“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)

最佳答案

性能差异不能是 IN= ANY,因为 PostgreSQL 会将 IN 转换为 = ANY查询优化。

区别一定是subselect。如果您使用 unnest,PostgreSQL 将始终估计子查询返回 100 行,因为这就是 unnest 的定义方式。

一定是 100 的估计以某种方式产生了一个不同的执行计划,该计划恰好运行得更好。

我们需要完整的执行计划来说明不确定性。

关于postgresql - 使用数组作为参数时,ANY 运算符会出现严重的性能问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55337272/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com