如何强制 Django 使用 "JOIN VALUES"
How to enforce Django to use "JOIN VALUES"
我遇到性能问题,需要替换查询语句的一部分。现在我有以下内容:
select count(*) FROM "mytable" WHERE "field" IN ('v1', 'v2', ..., 'vN');
这可以翻译成 Django ORM:
Mytable.objects.all().filter(field__in=[myvalues]).count()
不过我需要执行以下操作:
select count(*) FROM "mytable" JOIN (values ('v1', 'v2', ..., 'vN')) as lookup(value) on lookup.value = "mytable".field;
有没有办法将其添加到 ORM 中?我需要处理 ORM,因为我已经有了其他过滤器。最坏的情况我想到了获取查询字符串并手动添加...
我正在使用 Postgresql 9.6
在反复阅读文档后,我找到了一种方法。我什至发现a patch前一段时间没有合并
它并没有真正进行连接,但它比直接使用 __in
快得多。
我正在做的是执行 Django 2.0 中引入的 RawSQL(),结果我再次执行 __in
。
所以这是一个代码示例:
query = """select myfield from mytable join (values
('v1'), ('v2'), ..., ('vN')
) as lookup(value) on lookup.value = mytable.myfield"""
r = RawSQL(query, [])
mymodel.filter(myfield__in=r)
现在只需几毫秒而不是几分钟!
我遇到性能问题,需要替换查询语句的一部分。现在我有以下内容:
select count(*) FROM "mytable" WHERE "field" IN ('v1', 'v2', ..., 'vN');
这可以翻译成 Django ORM:
Mytable.objects.all().filter(field__in=[myvalues]).count()
不过我需要执行以下操作:
select count(*) FROM "mytable" JOIN (values ('v1', 'v2', ..., 'vN')) as lookup(value) on lookup.value = "mytable".field;
有没有办法将其添加到 ORM 中?我需要处理 ORM,因为我已经有了其他过滤器。最坏的情况我想到了获取查询字符串并手动添加...
我正在使用 Postgresql 9.6
在反复阅读文档后,我找到了一种方法。我什至发现a patch前一段时间没有合并
它并没有真正进行连接,但它比直接使用 __in
快得多。
我正在做的是执行 Django 2.0 中引入的 RawSQL(),结果我再次执行 __in
。
所以这是一个代码示例:
query = """select myfield from mytable join (values
('v1'), ('v2'), ..., ('vN')
) as lookup(value) on lookup.value = mytable.myfield"""
r = RawSQL(query, [])
mymodel.filter(myfield__in=r)
现在只需几毫秒而不是几分钟!