`
oaklet
  • 浏览: 108895 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

Oracle入库速度测试(Python版)

阅读更多
测试环境:
    Intel Xeon 2.4G四核心 2.5G内存
    Server 2003 Enterprise Edition Service Pack 2
    Oracle9i Enterprise Edition 9.2.0.1.0
    python-2.5.2
    组件cx_Oracle-4.3.1-win32-9i-py25

建立测试表:
CREATE TABLE TEST
(
TEST_ID NUMBER(10, 0),
TEST_NAME VARCHAR2(50),
TEST_TIME TIMESTAMP,
TEST_VALUE NUMBER(10, 3)
);

连接Oracle过程略。

几个测试用的方法:
import random
atoz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ"
def genString(length):
    temp = []
    for k in range(length):
        temp.append(atoz[random.randint(0, 51)])
    return "".join(temp)

def genDouble():
    d1 = 2500 * random.random()
    d2 = 500000 * random.random()
    return d1 + d2

def split2(total):
    splitSize = 51200
    result = []
    length = (total + splitSize - 1) / splitSize
    for i in range(length-1):
        total = total - splitSize
        result.append(splitSize)
    result.append(total)
    return result


拼sql入库:
def simpleInsert(total):
    time.sleep(3)
    currentStr = time.strftime("%Y-%m-%d %H:%M:%S")
    connOra = cx_Oracle.connect(connStr)
    begin = time.time()

    cursorOra = connOra.cursor()
    for i in range(1, total+1):
        sqlStr = "INSERT INTO TEST (TEST_ID, TEST_NAME, TEST_TIME, TEST_VALUE) VALUES (%s, '%s', to_date('%s','yyyy-MM-dd HH24:mi:ss'), %s)"%(i, genString(5), currentStr, genDouble())
        cursorOra.execute(sqlStr)
    connOra.commit()

    end = time.time()
    print "Count:%s Time:%s"%(total, end - begin)
    cursorOra.close()
    connOra.close()

测试结果:
Count:20480 Time:34.7809998989
Count:20480 Time:34.8599998951
Count:20480 Time:35.6400001049
Count:20480 Time:35.375
Count:20480 Time:35.9060001373
Count:20480 Time:34.9690001011
Count:20480 Time:35.7179999352
Count:20480 Time:35.1879999638
Count:20480 Time:36.4690001011
Count:20480 Time:35.1870000362

总结:
平均入库速度每1万条17.29秒

绑定参数法入库:
def traditionalInsert(total):
    time.sleep(3)
    cst = time.localtime()
    current = datetime.datetime(cst[0], cst[1], cst[2], cst[3], cst[4], cst[5])
    connOra = cx_Oracle.connect(connStr)
    begin = time.time()

    cursorOra = connOra.cursor()
    cursorOra.prepare("INSERT INTO TEST (TEST_ID, TEST_NAME, TEST_TIME, TEST_VALUE) VALUES (:1, :2, :3, :4)")
    for i in range(1, total+1):
        cursorOra.execute(None, (i, genString(5), current, genDouble()))
    connOra.commit()

    end = time.time()
    print "Count:%s Time:%s"%(total, end - begin)
    cursorOra.close()
    connOra.close()

测试结果:
Count:51200 Time:28.2030000687
Count:51200 Time:28.5160000324
Count:51200 Time:26.7349998951
Count:51200 Time:27.0309998989
Count:51200 Time:27.3910000324
Count:51200 Time:35.4370000362
Count:51200 Time:26.9070000648
Count:51200 Time:29.375
Count:51200 Time:27.7350001335
Count:51200 Time:27.5309998989

总结:
平均入库速度每1万条5.56秒

数组绑定法入库:
def arrayBindInsert(total):
    time.sleep(3)
    cst = time.localtime()
    current = datetime.datetime(cst[0], cst[1], cst[2], cst[3], cst[4], cst[5])
    splitTotal = split2(total)
    connOra = cx_Oracle.connect(connStr)
    begin = time.time()

    cursorOra = connOra.cursor()
    cursorOra.prepare("INSERT INTO TEST (TEST_ID, TEST_NAME, TEST_TIME, TEST_VALUE) VALUES (:1, :2, :3, :4)")
    for smallCount in splitTotal:
        tempitems = []
        for i in range(1, smallCount+1):
            tempitems.append((i, genString(5), current, genDouble()))
        cursorOra.executemany(None, tempitems)
        connOra.commit()

    end = time.time()
    print "Count:%s Time:%s"%(total, end - begin)
    cursorOra.close()
    connOra.close()

测试结果:
Count:1024000 Time:36.5779998302
Count:1024000 Time:35.375
Count:1024000 Time:37.6559998989
Count:1024000 Time:34.9060001373
Count:1024000 Time:36.5779998302
Count:1024000 Time:37.625
Count:1024000 Time:35.2809998989
Count:1024000 Time:36.1570000648
Count:1024000 Time:36.4219999313
Count:1024000 Time:37.1879999638

总结:
平均入库速度每100万条35.52秒
数组绑定法的注意事项:数组长度最好要小于65535。

python中有一个timeit专门用来测试代码执行时间的,有空可以用一用。
听说有个cython插件,代码稍加改动就可以大幅提高速度,有空可以试试。
分享到:
评论

相关推荐

    51CTO下载-java-操作Oracle-批量入库的问题.docx

    在Java中操作Oracle数据库进行批量入库时,可能会遇到性能问题,这涉及到数据库优化、批处理策略以及数据类型的选择。以下是一些关键知识点: 1. **Oracle自定义类型(Table类型)**: Oracle允许创建自定义的表...

    基于Python的并行编程技术在批量气象规范报表入库处理中的应用.pdf

    随后,作者利用Python的多进程并行编程技术编写了程序,该程序能够将大量的气象规范报表快速地转换,并载入Oracle数据库中。Oracle数据库是一个广泛应用于企业级应用的数据库管理系统,它能够存储大量的数据,并保证...

    电信服务器操作日志分析入库

    这个过程中,可能需要用到编程语言(如Python或Java)编写脚本,或者利用专门的日志分析工具(如ELK Stack:Elasticsearch, Logstash, Kibana)。通过对日志数据的统计、可视化,可以发现服务器的使用模式,追踪异常...

    悦行超市管理系统网站设计与实现.pdf

    数据库管理系统可能会选用MySQL或Oracle,用于存储商品信息、库存数据、交易记录等。考虑到响应式设计,可能还会利用Bootstrap或Vue.js等前端框架,确保网站在不同设备上都能良好运行。 三、需求分析 3.1 功能需求...

    计算机软件毕业设计_库存管理系统的设计与实现_计算机毕业设计源码_计算机毕业设计源代码.rar

    在系统设计阶段,我们需要考虑数据库设计,通常会采用关系型数据库如MySQL或Oracle,设计合理的数据表结构,包括商品信息表、库存表、出入库记录表等。同时,为了提高系统的响应速度和数据安全性,需要进行索引优化...

    软件开发与项目管理-1期 KC02_学生作品_仓库管理系统.doc

    - 可能使用的开发语言有Java、Python、C#等,配合数据库管理系统如MySQL、Oracle或SQL Server。 - 前端可能采用HTML、CSS、JavaScript,配合React、Vue或Angular等框架进行构建。 7. **实施与维护** - 系统上线...

    库存管理系统框架设计.doc

    设计库存管理系统的主要目的是提高企业的库存管理水平,减少库存积压,降低运营成本,同时提升订单处理速度和客户满意度。通过自动化处理库存数据,避免人为错误,确保库存信息的实时性和准确性。 二、系统目标 1. ...

    仓库管理信息系统源码

    - 测试验证:单元测试、集成测试确保各模块功能正确,性能测试评估系统性能。 - 部署上线:在生产环境中安装系统,进行数据迁移和系统配置。 - 维护更新:定期修复漏洞,添加新功能,持续优化系统性能。 5. **...

    中小企业的仓储管理系统.doc

    开发者可能使用如Visual Studio、Eclipse或IntelliJ IDEA等集成开发环境,配合Java、C#或Python等编程语言进行开发。同时,可能使用如Spring Boot、Django或ASP.NET等框架来加速开发进程。 2. 开发过程: 开发过程...

    公司库存管理代码下载

    1. **入库管理**:系统应能跟踪货物的入库流程,包括供应商信息、入库数量、日期等,确保准确记录每一批货物的来源。 2. **出库管理**:处理订单发货、退货等操作,跟踪货物的去向,同时更新库存状态。 3. **库存...

    图书管理系统开发文档

    常用的开发语言可能是Java、Python或C#,框架如Spring Boot、Django或ASP.NET,配合数据库管理工具如MySQL或Oracle进行数据操作。 四、测试 测试环节包括单元测试、集成测试和系统测试,确保每一个功能都能正常工作...

    毕业设计—图书馆管理系统

    还可以进行性能测试,评估系统在高并发情况下的响应速度和稳定性。 总的来说,这个毕业设计项目不仅锻炼了学生的编程技能,也让他们掌握了软件工程的完整流程,包括需求分析、系统设计、编码实现和质量保证。通过这...

    图书管理系统设计文档

    系统开发通常采用B/S架构,前端使用HTML、CSS和JavaScript,构建用户界面,后端使用Java或Python等服务器端语言处理业务逻辑,数据库选用MySQL或Oracle。开发过程中,需注意代码规范,确保系统的可维护性和扩展性。 ...

    仓库管理信息系统

    5. 持续集成/持续部署(CI/CD):通过Jenkins等工具,自动化完成代码构建、测试和部署,提高迭代速度。 综上所述,仓库管理信息系统是企业实现精细化管理的关键工具,其设计和实现涉及多方面技术,包括前端界面开发...

    图书馆管理系统(完整毕业设计)-毕业设计(源码+论文).rar

    - 功能需求:包括图书入库、出库、借阅、归还、续借、预约、查询等功能。 - 非功能需求:系统应具有良好的用户界面,稳定性和安全性,以及一定的扩展性。 2. **数据库设计** - 数据表设计:如图书表(包含书名、...

    数据库课程设计___库存管理系统

    - **关系型数据库**:通常会选择如MySQL、SQL Server或Oracle等关系型数据库来存储库存数据,因为它们支持ACID(原子性、一致性、隔离性和持久性)特性,确保数据的完整性和一致性。 - **实体设计**:库存管理系统...

    库存管理系统设计方案

    2. **入库管理**:记录进货信息,自动更新库存,支持批量入库操作。 3. **出库管理**:处理销售订单、领料申请等出库操作,防止超卖。 4. **库存预警**:设定安全库存水平,当库存低于预设值时触发警告。 5. **库存...

    图书管理信息系统的设计和实现

    前端采用HTML、CSS和JavaScript等技术实现用户交互界面,后端则用Java、Python或.NET等语言开发服务器端逻辑,数据库选择MySQL、Oracle或SQL Server等,用于存储大量图书和用户数据。 数据库设计是核心环节,需确保...

    数据库课设实验报告——进销存管理系统.pdf

    这里可能包括操作系统(如Windows或Linux)、编程语言(如Java或Python)、数据库管理系统(如MySQL或Oracle)以及前端开发框架(如Vue.js或React)。开发平台的选择应考虑到系统的可维护性、性能和安全性等因素。 ...

    仓储物流管理系统的设计与实现.docx

    1. **开发工具的确定**:选择合适的开发语言和框架,如Java、Python等,以及数据库系统如MySQL、Oracle等。 2. **系统功能设计**:基于需求分析结果,详细规划每个功能模块的具体实现细节。 3. **系统模块设计**:...

Global site tag (gtag.js) - Google Analytics