Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/58.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新多行(如1000行)MSSQL与MySQL(ASP NET MVC 5与Django 1.6)_Mysql_Sql Server_Django_Sql Update - Fatal编程技术网

更新多行(如1000行)MSSQL与MySQL(ASP NET MVC 5与Django 1.6)

更新多行(如1000行)MSSQL与MySQL(ASP NET MVC 5与Django 1.6),mysql,sql-server,django,sql-update,Mysql,Sql Server,Django,Sql Update,我需要一次更新大量数据库行。我有一个订单列,在用户通过拖放更改它之后,它将被更新。用户可能无法一次更新1000个项目的订单,但我们假设他/她会 我试过: 在每个对象上迭代调用object.save在每个迭代中1000次调用一个接一个 正在进行一个大查询,如更新名称集顺序=大小写。。。在id所在的位置结束 我已经在Django+Django REST框架和ASP NET MVC 5 C中尝试过这一点。 使用第一种方法时,Django比ASP NET快得多。 使用第二种方法Django的速度是20-

我需要一次更新大量数据库行。我有一个订单列,在用户通过拖放更改它之后,它将被更新。用户可能无法一次更新1000个项目的订单,但我们假设他/她会

我试过:

在每个对象上迭代调用object.save在每个迭代中1000次调用一个接一个

正在进行一个大查询,如更新名称集顺序=大小写。。。在id所在的位置结束

我已经在Django+Django REST框架和ASP NET MVC 5 C中尝试过这一点。 使用第一种方法时,Django比ASP NET快得多。 使用第二种方法Django的速度是20-30毫秒,ASP网络需要400-600毫秒

和其他任何情况一样,它看起来很奇怪,比如生成视图,或者在api调用时返回原始JSON数据,更新单个或少数行ASP NET总是更快

我的Django代码:

def post(self, request):
    from django.db import connection
    photos_order = ""
    ids = ""
    for photo in request.DATA:
        photos_order += " WHEN id = %d THEN %d" % (photo["id"], photo["order"])
        ids += "%s, " % (photo["id"])
    ids = ids[:-2]
    ids = "(" + ids + ")"
    cursor = connection.cursor()
    query = "UPDATE mydb.photos_photo SET `order` = CASE %s END WHERE id IN %s" % (photos_order, ids)
    cursor.execute(query)
    row = cursor.fetchone()

    return Response(json.dumps({"message": _("ok")}), status=status.HTTP_200_OK)
我的ASP NET MVC 5代码:

[HttpPost]
[Authorize]
public HttpResponseMessage UpdatePhotosSorting(IEnumerable<Photo> photos)
{
    List<string> photosOrder = new List<string>();
    string photosOrderStrings = "";

    foreach (Photo photo in photos)
    {
        photosOrderStrings += String.Format("WHEN PhotoId = {0} THEN {1} ", photo.PhotoId, photo.Order);
    }

    q = String.Format("UPDATE dbo.Photo SET \"Order\" = CASE {0} ELSE \"Order\" END", photosOrderStrings);
    _db.Database.ExecuteSqlCommand(q);

    return Request.CreateResponse(HttpStatusCode.OK, "ok");
}
是我做错了什么,还是就是这样?MSSQL Express真的比MySQL慢吗


必须补充的是,Django在Apache+WSGI+MySQL下工作,但runserver的开发在35-40ms内完成了上述工作,并且ASP NET在IIS Express 8+MSSQL Express上进行了测试。

调用save 1000次可能是个坏主意。一般来说,底层框架可以在某些情况下消除这一潜在的性能问题

使用类似以下代码时的TSQL性能

从表中选择/update/etc,其中1,2,3,4,5,6…,1000中的id从性能角度看也是不好的。理想情况下,您可以在选择行的情况下以功能性方式进行替换

常见的高性能更新策略是在XML、blob、文本字段等中上载所有要更新的ID。将ID加载到临时表或临时变量中,通常在存储过程中

然后根据此表执行更新或合并。您还需要避免tsql代码中的循环来填充临时表

根据您的问题定义,我可能只需要在客户机中构建一个包含所有ID和所需顺序的xmlstring,然后将其传递给存储过程。对于这样一个简单的更新,假设您在ID上有适当的索引,那么性能应该相当好

增加


以防您以前没有以这种方式使用过XML,这是一个很好的例子。这通常被称为分解XML,而不是解析XML。在一般情况下,在TSQL中使用XML是工具箱中非常有用的一员。

这并不能回答问题,但您的代码容易受到SQL注入的攻击。看起来是这样的:我必须检查这些请求字段中是否有整数。这也不能保护你。相反,您应该绑定变量,而不是替换变量。如果不使用ORM,请查看这些信息,了解如何在Django中安全地执行此操作。好的,我将确定地进行研究。感谢您通知我这个问题,我可能会忘记在这个胃口的表现。