Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/297.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在postgres中有没有比WHERE-IN子句更快的东西?_C#_Postgresql_.net Core_Npgsql - Fatal编程技术网

C# 在postgres中有没有比WHERE-IN子句更快的东西?

C# 在postgres中有没有比WHERE-IN子句更快的东西?,c#,postgresql,.net-core,npgsql,C#,Postgresql,.net Core,Npgsql,我正在使用.NETCore3.1 我正在使用postgres Npgsql包 在本例中,我在数据库中有一个名为messages的表。 我想从表中获取满足特定条件的行,这些行的id需要包含在我提供的数组/列表中 该表可以有数千个结果,ID最多可以包含1000个值 例如: ids是一个列表 这段代码运行得很好,我的问题是,是否有比{string.Join,,ids}中的WHERE-id更快的方法 或者我可能做了一些与问题无关的事情,也可能表现不佳。谢谢 所使用的postgres版本为11。您可以将数

我正在使用.NETCore3.1

我正在使用postgres Npgsql包

在本例中,我在数据库中有一个名为messages的表。 我想从表中获取满足特定条件的行,这些行的id需要包含在我提供的数组/列表中

该表可以有数千个结果,ID最多可以包含1000个值

例如:

ids是一个列表

这段代码运行得很好,我的问题是,是否有比{string.Join,,ids}中的WHERE-id更快的方法

或者我可能做了一些与问题无关的事情,也可能表现不佳。谢谢


所使用的postgres版本为11。

您可以将数组作为数组发送,而不是将其串接在一起:

从id=ANY@arrayParam的消息中选择* 然而,在一天结束时,您强制PG检查整个表,并根据您的数组检查每个ID——这是一个固有的缓慢操作


如果重复使用相同的数组值,可能值得将这些值插入到临时表中,而不是在每次查询时将其重新发送到数据库,等等。

性能是一件与上下文相关且棘手的事情。以下是可能影响/解决您的问题的许多事情中的一小部分:

它现在有多慢?你需要它快多少? ID的最终用途是什么?他们是否完全退出系统?它们是否再次用于其他地方的另一个查询? 消息表的静态/动态性如何?如何分发/访问消息? 数据库是如何配置的,查询是如何执行的?数据库是单独查找每个值,还是对表进行单个索引扫描?解释和分析? 使用CAP定理-如果您比正常情况更快地需要它,也许您可以放宽一致性要求?
如果您的性能很差,那么它可能在DB端,而不是C端。您是否在messages.id上有索引?您可以尝试将ID加载到表中并进行连接。什么版本的PostgreSQL?请显示解释分析,查询缓冲区。Hi@NetMage,有人告诉我创建临时表并进行连接,我不知道你的意思是否相同。我怎样才能找到更多的信息呢?嗨@jjanes,postgres的版本是11,你的意思是我应该解释更多关于提供的/预期的代码?
        using (var cmd = new NpgsqlCommand($"SELECT * FROM \"messages\" WHERE id IN ({string.Join(",", ids)});", conn))
        {
            long key;
            MessagesJson val;
            NpgsqlDataReader reader = cmd.ExecuteReader();
            while (reader.Read())
            {
                key = Int64.Parse(reader[0].ToString());
                var content = reader[1].ToString();
                val = JsonSerializer.Deserialize<MessagesJson>(content);
                messages.Add(new Message<long, MessagesJson>() { Key = key, Value = val });
            }
            reader.Close();
        }