我正在测试Postgres插入性能.我有一个表,其中一列以数字作为数据类型.它上面也有一个索引.我使用此查询填充数据库:
insert into aNumber (id) values (564),(43536),(34560) ...
Run Code Online (Sandbox Code Playgroud)
我通过上面的查询一次非常快速地插入了400万行.数据库达到600万行后,性能每15分钟急剧下降到100万行.有没有提高插入性能的技巧?我需要在这个项目上获得最佳插入性能.
在具有5 GB RAM的计算机上使用Windows 7 Pro.
我想运行一个只在内存中运行的小型PostgreSQL数据库,用于我编写的每个单元测试.例如:
@Before
void setUp() {
String port = runPostgresOnRandomPort();
connectTo("postgres://localhost:"+port+"/in_memory_db");
// ...
}
Run Code Online (Sandbox Code Playgroud)
理想情况下,我将在版本控件中检查一个postgres可执行文件,单元测试将使用该版本控件.
有点像HSQL,但对于postgres.我怎样才能做到这一点?
我可以获得这样的Postgres版本吗?如何指示不使用磁盘?
我们正在使用Postgresql 9.1.4我们的数据库服务器.我一直在努力加快我的测试套件的速度,所以我盯着db稍微分析一下,看看到底发生了什么.我们使用database_cleaner在测试结束时截断表.是的我知道交易更快,我不能在某些情况下使用它们所以我不关心它.
我关心的是,为什么TRUNCATION需要这么长时间(比使用DELETE更长)以及为什么它在我的CI服务器上需要更长时间.
现在,在本地(在Macbook Air上)一个完整的测试套件需要28分钟.拖尾日志,每次我们截断表...即:
TRUNCATE TABLE table1, table2 -- ... etc
Run Code Online (Sandbox Code Playgroud)
执行截断需要1秒多的时间.在我们的CI服务器(Ubuntu 10.04 LTS)上记录日志,需要花费整整8秒才能截断表格,构建需要84分钟.
当我切换到:deletion策略时,我的本地构建花了20分钟,CI服务器下降到44分钟.这是一个显着的差异,我真的很惊讶为什么会这样.我已经调整 了 CI服务器上的数据库,它有16GB系统RAM,4gb shared_buffers ......和一个SSD.所有好东西.这怎么可能:
一个.它比我的Macbook Air慢了2gb
.当postgresql文档 明确指出它应该快得多时,TRUNCATION比DELETE慢得多.
有什么想法吗?
我有PostgreSQL数据库.它用于单元测试.
您对内存数据库的选择有什么建议吗?我希望该数据库与PostgreSQL兼容.
我正在运行各种测试,这些测试在数据库中花费了大量时间.
我想把它全部保留在内存中并且不要触摸数据库,希望这会加快速度.就像使用sqlite3的内存中选项一样.我不需要持久性/持久性/诸如此类,测试后一切都会立即丢弃.
那可能吗?我尝试调整我的postgres内存相关变量(如下面的解决方案),但这似乎并没有影响它执行的db写入次数,我找不到任何看起来像'内存'选项的东西.
https://dba.stackexchange.com/questions/18484/tuning-postgresql-for-large-amounts-of-ram
我正在阅读有关 postgres 方言上的 upsert 操作的 SqlAlchemy 文档,网址为http://docs.sqlalchemy.org/en/latest/dialects/postgresql.html#insert-on-conflict-upsert
有没有办法知道更新插入是插入还是更新?
该文档似乎省略了这个细节。
我有一个Django 1.1应用程序,需要每天从一些大的json文件导入数据.为了给出一个想法,其中一个文件超过100 Mb并且有90K条目导入到Postgresql数据库.
我遇到的问题是导入数据需要很长时间,即数小时.我原以为将数量的条目写入数据库会花费一些时间,但肯定不会那么长,这让我觉得我在做一些内在错误的事情.我已经阅读了类似的stackexchange问题,并且提出的解决方案建议使用transaction.commit_manually或transaction.commit_on_success装饰器分批提交,而不是每次都提交.save(),我已经在做了.
正如我所说,我想知道我做错了什么(例如批量生成太大了?太多的外键?......),或者我是否应该放弃Django模型来实现这个功能和使用DB API直接.任何想法或建议?
以下是我在导入数据时要处理的基本模型(为了简单起见,我删除了原始代码中的一些字段)
class Template(models.Model):
template_name = models.TextField(_("Name"), max_length=70)
sourcepackage = models.TextField(_("Source package"), max_length=70)
translation_domain = models.TextField(_("Domain"), max_length=70)
total = models.IntegerField(_("Total"))
enabled = models.BooleanField(_("Enabled"))
priority = models.IntegerField(_("Priority"))
release = models.ForeignKey(Release)
class Translation(models.Model):
release = models.ForeignKey(Release)
template = models.ForeignKey(Template)
language = models.ForeignKey(Language)
translated = models.IntegerField(_("Translated"))
Run Code Online (Sandbox Code Playgroud)
这里的代码似乎需要很长时间才能完成:
@transaction.commit_manually
def add_translations(translation_data, lp_translation):
releases = Release.objects.all()
# There are 5 releases
for release in releases:
# translation_data has about 90K entries
# this is …Run Code Online (Sandbox Code Playgroud) 我们在Ubuntu 12.04上使用Django 1.4和PostgreSQL.我们有很多测试,问题是运行测试非常慢,我认为因为每次测试都是从头开始创建数据库.我希望通过在内存中使用数据库(而不是硬盘)来加快测试速度.我该怎么做?你有任何链接或教程吗?
django postgresql django-testing in-memory-database django-tests
postgresql ×9
django ×3
python ×2
testing ×2
unit-testing ×2
bulkinsert ×1
django-tests ×1
java ×1
sql ×1
sql-insert ×1
sqlalchemy ×1
sqlite ×1
truncate ×1