在PostgreSQL中读取bytea数据很慢

时间:2016-05-25 06:06:07

标签: c# .net postgresql npgsql bytea

我将数据存储在Windows上的PostgreSQL 9.5数据库的bytea列中。

数据传输速度低于我的预期:每秒约1.5mb。

以下代码

        using (var conn = ConnectionProvider.GetOpened())
        using (var comm = new NpgsqlCommand("SELECT mycolumn FROM mytable", conn))
        using (var dr = comm.ExecuteReader())
        {
            var clock = Stopwatch.StartNew();
            while (dr.Read())
            {
                var bytes = (byte[])dr[0];
                Debug.WriteLine($"bytes={bytes.Length}, time={clock.Elapsed}");
                clock.Restart();
            }
        }

生成以下输出

bytes=3895534, time=00:00:02.4397086
bytes=4085257, time=00:00:02.7220734
bytes=4333460, time=00:00:02.4462513
bytes=4656500, time=00:00:02.7401579
bytes=5191876, time=00:00:02.7959250
bytes=5159785, time=00:00:02.7693224
bytes=5184718, time=00:00:03.0613514
bytes=720401, time=00:00:00.0227767
bytes=5182772, time=00:00:02.7704914
bytes=538456, time=00:00:00.2996142
bytes=246085, time=00:00:00.0003131
Total: 00:00:22.5199268

奇怪的是,读取最后246kb的时间不到一毫秒,中间读取720kb只需要22ms。

每3秒读取速度5mb是否正常?如何提高阅读速度?

详情。

我的应用程序在启动时启动PostgreSQL服务器并在退出时关闭它。

我使用以下代码启动服务器

public static void StartServer(string dataDirectory, int port)
{      
    Invoke("pg_ctl", $"start -w  -D \"{dataDirectory}\" -m fast -o \"-B 512MB -p {port} -c temp_buffers=32MB -c work_mem=32MB\"");
}

另外,我将存储类型更改为我的列:

ALTER TABLE mytable ALTER COLUMN mycolumn SET STORAGE EXTERNAL;

我在Windows 10上使用npgsql 3.0.4.0和PostgreSQL 9.5

1 个答案:

答案 0 :(得分:1)

使用Npgsql 3.0.8运行(应该是相同的),PostgreSQL 9.5,Windows 10和Npgsql我根本没有得到你的结果:

bytes=3895534, time=00:00:00.0022591
bytes=4085257, time=00:00:00.0208912
bytes=4333460, time=00:00:00.0228702
bytes=4656500, time=00:00:00.0237144
bytes=5191876, time=00:00:00.0317834
bytes=5159785, time=00:00:00.0268229
bytes=5184718, time=00:00:00.0159028
bytes=720401, time=00:00:00.0130150
bytes=5182772, time=00:00:00.0153306
bytes=538456, time=00:00:00.0021693
bytes=246085, time=00:00:00.0005174

首先,您运行的是哪台服务器,是在localhost还是在某台远程计算机上?

首先想到的是,您在测试过程中停止并启动服务器。你看到的性能缓慢可能是PostgreSQL方面热身的一部分。尝试删除它,看看几次运行测试后是否可以重现结果。

否则,这看起来像一些环境问题(客户机,服务器机器或网络)。我试着在不同的机器上或不同的设置中重现问题并从那里开始。