我正在用npgsql检查Postgresql预准备语句。 在安装了Postgresql服务器的同一台机器上,它可以完美工作。 在服务器(同一台机器)上使用简单的随机值的100000 INSERT语句
在大约12.16秒内插入100k记录。 8224条/秒
如果没有准备。
大约在7.76秒内插入100k记录。 12886条/秒
如果准备好的陈述
在客户端上(同一局域网中具有相同IP范围和相同配置8Gb RAM的另一台计算机)
它以89.36秒(约)的速度插入100k记录。 1119条记录/秒
如果没有准备。
它在87.95秒内以@插入100k记录。 1137条记录/秒。
如果准备语句。
LAN上的这种性能是非常不可接受的。请帮忙。
我已经使用https://www.pgconfig.org/#/tuning
配置了我的Postgresql服务器。还禁用了两台计算机上的防病毒+防火墙。
该表已被取消登录,并且没有任何约束或索引。
Postgresql版本9.6.12
private void button1_Click(object sender, EventArgs e)
{
button1.Enabled=false;
button2.Enabled=false;
button3.Enabled = false;
lblUnprepared.Text = "Executing... Please Wait...!";
lblUnprepared.Refresh();
npgCmd.CommandText = "TRUNCATE TABLE TBL_ETCBLACKLIST_TEST";
npgCmd.ExecuteNonQuery();
procInsertData();
}
private void procInsertData()
{
string strFileDownloadId = string.Empty;
string strValues_0 = string.Empty;
string strValues_1 = string.Empty;
string strValues_2 = string.Empty;
string strValues_3 = string.Empty;
string strBlacklistFileNameWithoutExtension = string.Empty;
DateTime strDateTime = DateTime.Now;
DateTime strstarttime= DateTime.Now;
objLog.Log(0, "Start Executing SQL");
npgCmd.CommandType = CommandType.Text;
npgCmd.Connection = npgConn;
for (int i = 0; i <= lRows; i++)
{
//npgCmd = new NpgsqlCommand();
//NpgsqlDataReader npgRD = null;
strFileDownloadId = i.ToString();
strValues_0 = RandomString(10, true) + i;
strValues_1 = RandomString(1, true);
strValues_2 = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");
strValues_3 = RandomString(10, true);
strBlacklistFileNameWithoutExtension = RandomString(10, true);
strSQL = "INSERT INTO TBL_ETCBLACKLIST_TEST(ETCFileDownload_ID, ETC_Tag_ID, Tag_Status, Effective_Date, "
+ " Reason_Code, CCHFile_ID, Create_DateTime, Last_Update_Date, CCHBank_ID) VALUES("
+ strFileDownloadId + ", '" + strValues_0 + "', '" + strValues_1 + "', TO_TIMESTAMP('" + strValues_2 + "','YYYY/MM/DD HH24:MI:SS') "
+ ", '" + strValues_3 + "', '" + strBlacklistFileNameWithoutExtension + "','" + DateTime.Now +"','" + DateTime.Now + "', 1 )";
npgCmd.CommandText = strSQL;
npgCmd.ExecuteNonQuery();
}
DateTime strEndTime = DateTime.Now;
var diffInSeconds = (strEndTime - strstarttime).TotalSeconds;
var lRecPerSec = Math.Round(lRows / diffInSeconds);
lblUnprepared.Text = string.Format("UnPrepared SQL Inserted {0} Records In {1} Seconds \n@{2} Records Per Second.", lRows, diffInSeconds, lRecPerSec);
objLog.Log(0, "UnPrepeared SQL Processed in: " + diffInSeconds);
//npgCmd.Dispose();
//MessageBox.Show(string.Format("UnPreapared Statement Processed in {0} Seconds.", diffInSeconds));
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
//npgRD.Dispose();
}
private void button2_Click(object sender, EventArgs e)
{
string strFileDownloadId = string.Empty;
string strValues_0 = string.Empty;
string strValues_1 = string.Empty;
string strValues_2 = string.Empty;
string strValues_3 = string.Empty;
string strBlacklistFileNameWithoutExtension = string.Empty;
DateTime strDateTime = DateTime.Now;
DateTime strstarttime = DateTime.Now;
button1.Enabled = false;
button2.Enabled = false;
button3.Enabled = false;
npgCmd.CommandText = "TRUNCATE TABLE TBL_ETCBLACKLIST_TEST";
npgCmd.ExecuteNonQuery();
objLog.Log(0, "Start Executing SQL");
lblPrepared.Text = "Executing... Please Wait...!";
lblPrepared.Refresh();
strSQL = "INSERT INTO TBL_ETCBLACKLIST_TEST(ETCFileDownload_ID, ETC_Tag_ID, Tag_Status, Effective_Date, "
+ " Reason_Code, CCHFile_ID, Create_DateTime, Last_Update_Date, CCHBank_ID) VALUES("
+ "@Param1 , @Param2,@Param3,@Param4,@Param5,@Param6,@Param7,@Param8,@Param9)";
npgCmd.CommandText = strSQL;
npgCmd.CommandType = CommandType.Text;
npgCmd.Connection = npgConn;
npgCmd.Parameters.Add("@Param1", NpgsqlDbType.Numeric);
npgCmd.Parameters.Add("@Param2", NpgsqlDbType.Text);
npgCmd.Parameters.Add("@Param3", NpgsqlDbType.Text);
npgCmd.Parameters.Add("@Param4", NpgsqlDbType.Date);
npgCmd.Parameters.Add("@Param5", NpgsqlDbType.Text);
npgCmd.Parameters.Add("@Param6", NpgsqlDbType.Text);
npgCmd.Parameters.Add("@Param7", NpgsqlDbType.Date);
npgCmd.Parameters.Add("@Param8", NpgsqlDbType.Date);
npgCmd.Parameters.Add("@Param9", NpgsqlDbType.Numeric);
npgCmd.Prepare();
for (int i = 0; i <= lRows; i++)
{
// npgCmd = new NpgsqlCommand();
strFileDownloadId = i.ToString();
strValues_0 = RandomString(10, true) + i;
strValues_1 = RandomString(1, true);
strValues_2 = DateTime.Now.ToString("yyyy/MM/dd hh:mm:ss");
strValues_3 = RandomString(10, true);
strBlacklistFileNameWithoutExtension = RandomString(10, true);
npgCmd.Parameters[0].Value = strFileDownloadId;
npgCmd.Parameters[1].Value = strValues_0;
npgCmd.Parameters[2].Value = strValues_1;
npgCmd.Parameters[3].Value = strValues_2;
npgCmd.Parameters[4].Value = strValues_3;
npgCmd.Parameters[5].Value = strBlacklistFileNameWithoutExtension;
npgCmd.Parameters[6].Value = DateTime.Now;
npgCmd.Parameters[7].Value = DateTime.Now;
npgCmd.Parameters[8].Value = 1;
npgCmd.ExecuteNonQuery();
}
DateTime strEndTime = DateTime.Now;
var diffInSeconds = (strEndTime - strstarttime).TotalSeconds;
var lRecPerSec = Math.Round(lRows / diffInSeconds);
lblPrepared.Text = string.Format("Prepared SQL Inserted {0} Records In {1} Seconds \n@ {2} Records Per Second.", lRows, diffInSeconds, lRecPerSec);
//MessageBox.Show(string.Format("Preapared SQL Processed in {0} Seconds.", diffInSeconds));
objLog.Log(0, "Prepeared SQL Processed in: " + diffInSeconds);
lblPrepared.Text = string.Format("Prepared SQL Inserted {0} Records In {1} Seconds \n@ {2} Records Per Second.", lRows, diffInSeconds, lRecPerSec);
//MessageBox.Show(string.Format("Preapared SQL Processed in {0} Seconds.", diffInSeconds));
objLog.Log(0, "Prepeared SQL Processed in: " + diffInSeconds);
button1.Enabled = true;
button2.Enabled = true;
button3.Enabled = true;
//Cant find npgsql.Unprepare();
//npgCmd.Dispose();
//npgRD.Dispose();
}
postgresql.auto.conf如下。
shared_buffers = '512MB'
effective_cache_size = '6GB'
work_mem = '82MB'
maintenance_work_mem = '512MB'
min_wal_size = '512MB'
max_wal_size = '2GB'
checkpoint_completion_target = '0.7'
wal_buffers = '16MB'
listen_addresses = '*'
max_connections = '100'
random_page_cost = '4.0'
logging_collector = 'on'
log_checkpoints = 'on'
log_connections = 'on'
log_disconnections = 'on'
log_lock_waits = 'on'
log_temp_files = '0'
lc_messages = 'C'
log_min_duration_statement = '10s'
log_autovacuum_min_duration = '0'
log_destination = 'stderr'
log_line_prefix = '%t [%p]: [%l-1] user=%u,db=%d,app=%a,client=%h '
答案 0 :(得分:2)
正如@ felice-pollano上面所写,您可能想检出Npgsql's bulk copy support,它使您可以在一次往返中插入大量数据。与简单插入相比,它的优化程度往往要高得多。
如果您对每个SQL执行一次往返,那么与本地主机相比,在LAN上的性能大幅下降很有意义。在后者中,几乎没有延迟,但是在前者中,您花费大部分时间等待协议消息到达PostgreSQL并返回。
答案 1 :(得分:1)
如果LAN速度变慢,可能是由于LAN问题引起的。顺便说一句,通常需要使用某种“批量”或“分批”策略来完成大量插入操作,与实际执行db代码相比,您每次与数据库进行交谈的时间可能更多。