Oracle允许您更新SELECT语句的结果.
UPDATE (<SELECT Statement>)
SET <column_name> = <value>
WHERE <column_name> <condition> <value>;
Run Code Online (Sandbox Code Playgroud)
我想这可以用于根据另一个表中匹配行的值更新一个表中的列.
如何调用此功能,它是否可以有效地用于大型更新,当SELECT连接多个表时是否有效,如果是,如何?
我正在使用NHibernate与PostgreSQL数据库连接.
背景
我做了一些简单的测试......似乎需要2秒才能坚持300条记录.我有一个具有相同功能的Perl程序,但是发出直接SQL,只占70%的时间.我不确定这是否是预期的.我认为C#/ NHibernate会更快或至少相提并论.
问题
我的一个观察是(show_sql打开),NHibernate发出INSERT几百次,而不是进行处理多行的批量INSERT.请注意我自己分配主键,而不是使用"本机"生成器.
这是预期的吗?反正我是否可以让它发出批量INSERT语句?在我看来,这可能是我可以加速表现的领域之一.
在Active Admin中,是否可以为索引页面中的每个项目添加一个复选框(这并不难),并添加某种菜单以对所有选定项目执行批量操作,例如一次删除所有选定项目.
我找不到另一种方法来创建自定义页面,但我宁愿不这样做; 对我来说似乎有点矫枉过正.
我的用例是在存储在持久数据库中的数据上维护内存缓存.
我使用数据填充UI上的条目列表/映射.在任何给定时间,UI上显示的数据应尽可能地更新(这可以通过缓存的刷新频率来完成).
常规高速缓存实现与此特定高速缓存之间的主要区别在于,它需要定期刷新所有元素,因此与LRU类型的高速缓存非常不同.
我需要在Java中实现这个实现,如果有任何现有的框架可以用来构建它们,那将是很好的.
我已经探索了Google Guava缓存库,但它更适合每个条目刷新而不是批量刷新.没有简单的API可以在整个缓存上进行刷新.
任何帮助将受到高度赞赏.
另外,如果有可能逐步做刷新,它应是伟大的,因为同时刷新整个缓存它产生唯一的限制是,如果高速缓存的大小是非常大的,那么内存堆应该ATLEAST的两倍缓存以加载新条目并用新映射替换旧映射.如果缓存是增量的,或者有一个分块刷新(刷新大小相同),那就太好了.
我有表单集合,需要处理超过500个实体实例.在我将超时增加到60秒并且增加了max_input_vars形式工作之后,但是它的速度有多慢.渲染形式很慢,但提交这个大形式是痛苦的屁股.
我正在考虑创建纯HTML格式,但还有其他一些缺点作为验证.那么,是否有任何正确的方法通过symfony形式处理大量数据?
控制器:
public function ratesCardAction() {
$bannerList = $this->data;
$em = $this->getDoctrine()->getManager();
$form = $this->createForm(new AdvertiserRatesType($bannerList));
if ('POST' == $this->getRequest()->getMethod()) {
$form->handleRequest($this->getRequest());
$advertiserCampaign = $form->getData();
if ($form->isValid()) {
foreach ($advertiserCampaign['campaignsAdZones'] as $campaignAdZone) {
$em->persist($campaignAdZone);
}
$em->flush();
}
}
return array(
'form' => $form->createView()
);
}
class AdvertiserRatesType extends AbstractType {
public function buildForm(FormBuilderInterface $builder, array $options)
{
$builder ->add('campaignsAdZones', 'collection', array(
'type' => new AdvertiserRatePerCountryType(),
'data' => $this->rates,
'empty_data' => null,
'options' => array(
'attr' => array('class' => 'campaignAdZoneItem') …Run Code Online (Sandbox Code Playgroud) 我试图执行一个包含大约1000000个简单UPDATE查询的大型sql脚本.
此脚本文件的总大小约为100 MB.
当我运行这个脚本时,我得到一个Out Of Memory异常.
当我将文件分成10 MB的块时,我可以运行它们中的每一个.
但是,为了方便起见,我想只有一个我可以同时运行的脚本.我可以引入任何语句,以便SQL Server在运行每个查询后释放分配的内存,这样我就可以立即执行这个大型脚本吗?
我们有一个包含许多实体("项目")的大列表("集合").这一切都通过RESTful接口进行管理.可以通过项目上的order属性手动对项目进行排序.查询时,数据库会根据订单列出集合中的所有项目.
现在,我们希望将此机制公开给用户,他们可以在一个调用中更新所有项目的完整排序.数据库不允许order相同collection_id(唯一collection_id+ order)相同,因此您不能(绝对不应)逐个更新所有项目.
我想到了PATCH请求,但没有考虑资源,所以
PATCH /collections/123/items/
Run Code Online (Sandbox Code Playgroud)
身体像
[
{'id': 1, 'order': 3},
{'id': 2, 'order': 1},
{'id': 3, 'order': 2}
]
Run Code Online (Sandbox Code Playgroud)
但是,如何处理此批量类型的请求的错误?当部分更新成功时,如何发送响应?是否允许PATCH集合而不是资源?如果这是错误的想法,那么更好的方法是什么?
我有一个中间层,它在共享数据库上执行CRUD操作.当我将产品转换为.NET Core时,我认为我也会考虑使用REST作为API,因为CRUD应该是它的功能.似乎REST对于单个记录操作来说是一个很好的解决方案,但是当我想要删除1000条记录时会发生什么?
每个专业的多用户应用程序都会有一些乐观并发检查的概念:如果没有一些反馈,你就不能让一个用户消除另一个用户的工作.据我了解,REST使用HTTP ETag头记录处理此问题.如果客户端发送的ETag与服务器的标记不匹配,则发出412 Precondition Failed.到现在为止还挺好.但是,当我想删除1,000条记录时,我会使用什么?1,000次单独调用的来回时间是相当可观的,那么REST如何处理涉及Optimistic Concurrency的批处理操作?
我正在使用这个库来批量执行批量删除,如下所示:
while (castedEndedItems.Any())
{
var subList = castedEndedItems.Take(4000).ToList();
DBRetry.Do(() => EFBatchOperation.For(ctx, ctx.SearchedUserItems).Where(r => subList.Any(a => a == r.ItemID)).Delete(), TimeSpan.FromSeconds(2));
castedEndedItems.RemoveRange(0, subList.Count);
Console.WriteLine("Completed a batch of ended items");
}
Run Code Online (Sandbox Code Playgroud)
如您所见,我一次删除了一批 4000 个项目,并将它们作为参数传递给查询...
我正在使用这个库来执行批量删除:
https://github.com/MikaelEliasson/EntityFramework.Utilities
Run Code Online (Sandbox Code Playgroud)
然而,这样的性能绝对是糟糕的......我测试了几次应用程序并删除了 80000 条记录,例如需要 40 分钟!?
我应该注意,我要删除的参数 (ItemID) 是 varchar(400) 类型,并且出于性能原因对其进行了索引....
是否有任何其他库可以使用或调整此查询以使其工作得更快,因为目前的性能绝对糟糕..:/
还有一个关于风格和良好实践的问题。我将展示的代码可以工作并执行功能。但我想知道它是否可以作为解决方案,或者它可能太丑陋了?
由于问题有点晦涩难懂,我最后再给出一些观点。
那么,用例。
我有一个包含这些物品的网站。有一个按用户添加项目的功能。现在我想要一个通过 csv 文件添加多个项目的功能。
应该如何运作?
我已经看到了 django 批量上传的例子,它们看起来很清楚。但我没有找到带有中间“验证确认”页面的示例。那么我是怎么做到的:
def upload_item_csv_file(request):
if request.method == 'POST':
form = UploadItemCsvFileForm(request.POST, request.FILES)
if form.is_valid():
uploaded_file_name = handle_uploaded_item_csv_file(request.FILES['item_csv_file'])
request.session['uploaded_file'] = uploaded_file_name
return redirect('show_upload_csv_item')
else:
form = UploadItemCsvFileForm()
return render(request, 'myapp/item_csv_upload.html', {'form': form})
Run Code Online (Sandbox Code Playgroud)
def handle_uploaded_item_csv_file(f):
now = datetime.now()
# YY_mm_dd_HH_MM
dt_string = now.strftime("%Y_%m_%d_%H_%M")
file_name = os.path.join(settings.MEDIA_ROOT, f"tmp_csv/item_csv_{dt_string}.csv")
with open(file_name, 'wb+') as destination:
for chunk in f.chunks():
destination.write(chunk)
return f"tmp_csv/item_csv_{dt_string}.csv" …Run Code Online (Sandbox Code Playgroud) bulk ×10
bulkinsert ×2
rest ×2
sql ×2
sql-update ×2
activeadmin ×1
api-design ×1
asp.net ×1
asp.net-mvc ×1
bulk-delete ×1
c# ×1
caching ×1
django ×1
django-views ×1
forms ×1
http ×1
insert ×1
java ×1
nhibernate ×1
oracle ×1
php ×1
postgresql ×1
python ×1
sorting ×1
sql-server ×1
symfony ×1