Performance 从foo(100000行)中选择*需要4秒,这正常吗?
我在ubuntu服务器上安装了postgres 8.4,内存为4GB,英特尔E5504 2Ghz 我已经创建了一个表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
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 -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
# 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 -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
# 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毫秒)