Performance 从foo(100000行)中选择*需要4秒,这正常吗?

Performance 从foo(100000行)中选择*需要4秒,这正常吗?,performance,postgresql,ubuntu,Performance,Postgresql,Ubuntu,我在ubuntu服务器上安装了postgres 8.4,内存为4GB,英特尔E5504 2Ghz 我已经创建了一个表 create table foo ( id serial primary key, fname varchar(30), lname varchar(30) ) 插入10000行第一次大约需要4秒,第二次大约需要1秒 但是选择100000行总是需要4秒钟, select * from foo 这是正常的还是我的配置可能有误 可能是我的ubuntu remote bandwi

我在ubuntu服务器上安装了postgres 8.4,内存为4GB,英特尔E5504 2Ghz

我已经创建了一个表

create table foo
(
id serial primary key,
fname varchar(30),
lname varchar(30)
) 
插入10000行第一次大约需要4秒,第二次大约需要1秒
但是选择100000行总是需要4秒钟,

select * from foo
这是正常的还是我的配置可能有误


可能是我的ubuntu remote bandwith受到限制还是类似的问题?

100000行表使用6.4 MB(如果是Unicode,则使用12.4 MB)。这相当于64 MBit,在10 MBit/s的网络中大约需要6.4秒。因此,可用的网络带宽可能会导致您正在经历的4秒延迟。

表中的100000行使用6.4 MB(如果是Unicode,则为12.4 MB)。这相当于64 MBit,在10 MBit/s的网络中大约需要6.4秒。因此,可用网络带宽可能会导致您所经历的4秒延迟。

  • 尝试检查本地运行查询需要多长时间:

    使用psql连接到本地数据库:

    psql -U username dbname
    
    打开定时信息的显示:

    dbname=> \timing
    Timing is on.
    
    将输出设置为本地临时文件:

    dbname=> \o /tmp/foo.txt
    
    dbname=> select * from foo;
    Time: 104.442 ms
    
    将表中的所有行选择到临时文件:

    dbname=> \o /tmp/foo.txt
    
    dbname=> select * from foo;
    Time: 104.442 ms
    
  • 检查服务器和客户端之间的TCP带宽:

    (在客户端上-我假设Linux)暂时禁用防火墙:

    # service iptables stop
    
    (在客户端上)在端口10000上开始侦听:

    # nc -l 10000 > /dev/null
    
    (在服务器上)使用普通TCP向客户端发送文件:

    # time nc client_ip 10000 < /tmp/foo.txt
    real        0m0.190s
    user        0m0.004s
    sys         0m0.078s
    

  • 尝试检查本地运行查询需要多长时间:

    使用psql连接到本地数据库:

    psql -U username dbname
    
    打开定时信息的显示:

    dbname=> \timing
    Timing is on.
    
    将输出设置为本地临时文件:

    dbname=> \o /tmp/foo.txt
    
    dbname=> select * from foo;
    Time: 104.442 ms
    
    将表中的所有行选择到临时文件:

    dbname=> \o /tmp/foo.txt
    
    dbname=> select * from foo;
    Time: 104.442 ms
    
  • 检查服务器和客户端之间的TCP带宽:

    (在客户端上-我假设Linux)暂时禁用防火墙:

    # service iptables stop
    
    (在客户端上)在端口10000上开始侦听:

    # nc -l 10000 > /dev/null
    
    (在服务器上)使用普通TCP向客户端发送文件:

    # time nc client_ip 10000 < /tmp/foo.txt
    real        0m0.190s
    user        0m0.004s
    sys         0m0.078s
    


    您使用的是
    SELECT*FROM foo
    还是其他SELECT语句?数据库和客户端在同一台计算机上吗?@fmunkert我确实从foo中选择了*,我远程访问数据库,但服务器在我的本地网络中,在相对普通的硬件上(1G ram,1.83Ghz,慢速USB存储)有一个类似的表和200k行
    \Time on
    查询
    select*from foo
    给出时间:486ms on my postgres.@Unreason您是否调整过它,或者它是默认配置?插入200k记录需要1544ms,插入400k记录需要3574ms,插入800k记录需要11445ms(无索引)。选择1.6M记录需要3800ms。您使用的是
    SELECT*FROM foo
    还是其他SELECT语句?数据库和客户端在同一台计算机上吗?@fmunkert我确实从foo中选择了*,我远程访问数据库,但服务器在我的本地网络中,在相对普通的硬件上(1G ram,1.83Ghz,慢速USB存储)有一个类似的表和200k行
    \Time on
    查询
    select*from foo
    给出时间:486ms on my postgres.@Unreason您是否调整过它,或者它是默认配置?插入200k记录需要1544ms,插入400k记录需要3574ms,插入800k记录需要11445ms(无索引)。选择1.6M记录需要3800ms。@fmunkert是的postgre是utf-8,我在另一台服务器(相同的配置)上使用我的sql server express进行同样的操作,需要1秒,但sqlexpress是sql拉丁语1\u General\u CP1\u CI\u ASTry,可以直接在DB服务器上执行相同的语句。如果也需要4秒钟,则网络不是问题所在。如果速度大大加快,那么网络就是问题所在。如果网络没有问题,可能是数据库服务器上分配的表缓存不够大。Unicode并不意味着每个字符有2个字节。这取决于具体的编码(例如UTF-8使用一个字节表示ASCII)。@fmunkert在控制台中它是即时的,我看不到任何延迟(虽然我只看到前10行,我必须滚动,我不确定是全部还是只选择了前10行)@fmunkert我用拉丁语10创建了另一个数据库,结果是same@fmunkert是的,postgre是utf-8,我在另一台服务器(相同的配置)上使用我的sql server express进行同样的操作,需要1秒,但sqlexpress是sql拉丁语通用语言CP1,可以直接在DB服务器上执行相同的语句。如果也需要4秒钟,则网络不是问题所在。如果速度大大加快,那么网络就是问题所在。如果网络没有问题,可能是数据库服务器上分配的表缓存不够大。Unicode并不意味着每个字符有2个字节。这取决于具体的编码(例如UTF-8使用一个字节表示ASCII)。@fmunkert在控制台中它是即时的,我看不到任何延迟(虽然我只看到前10行,我必须滚动,我不确定是全部还是只选择了前10行)@fmunkert我用拉丁语10创建了另一个数据库,结果是同样的,我得到了93毫秒的时间,我能做些什么使它也能快速远程工作(Windows7PGADMINIII)?我认为这是pgadmin的错,不是Postgres的错。使用psql客户机尝试同样的方法:“psql-h servername-U username dbname”,然后从客户机中选择“\o foo.txt”、“select*from foo”。PgAdmin可能正在创建100k行小部件来显示您的结果,这就是您的4s的用途。谢谢您,这样我在客户端上获得了306毫秒(本地30毫秒)我获得了93毫秒的时间,我该怎么做才能使它也能快速远程工作(windows 7 PgAdmin III)?我认为这是PgAdmin的错,而不是Postgres的错。使用psql客户机尝试同样的方法:“psql-h servername-U username dbname”,然后从客户机中选择“\o foo.txt”、“select*from foo”。PgAdmin可能正在创建100k行小部件来显示您的结果,这就是您的4s的位置。谢谢,这样我在客户端上获得了306毫秒(本地30毫秒)