如何提高性能和速度

时间:2009-12-09 17:08:14

标签: database performance connection jython

我已编写此程序用于连接和将数据提取到文件中,但此程序在获取时速度很慢。有没有办法改善性能和更快的方式将数据加载到文件中。 iam目标大约有100,000到100万条记录,这就是为什么iam担心性能,我也可以使用数组获取大小和批量大小,就像我们在java中所做的那样。

import java.sql as sql
import java.lang as lang
def main():
    driver, url, user, passwd = ('oracle.jdbc.driver.OracleDriver','jdbc:oracle:thin:@localhost:1521:xe','odi_temp','odi_temp')
    ##### Register Driver
    lang.Class.forName(driver)
    ##### Create a Connection Object
    myCon = sql.DriverManager.getConnection(url, user, passwd)
    f = open('c:/test_porgram.txt', 'w')
    try:
        ##### Create a Statement
        myStmt = myCon.createStatement()
        ##### Run a Select Query and get a Result Set
        myRs = myStmt.executeQuery("select emp_id ,first_name,last_name,date_of_join from src_sales_12")
        ##### Loop over the Result Set and print the result in a file
        while (myRs.next()):
            print >> f , "%s,%s,%s,%s" %(myRs.getString("EMP_ID"),myRs.getString("FIRST_NAME"),myRs.getString("LAST_NAME"),myRs.getString("DATE_OF_JOIN") )
    finally:
        myCon.close()
        f.close()

### Entry Point of the program
if __name__ == '__main__':
    main()

5 个答案:

答案 0 :(得分:1)

除非您使用DB和文件服务器上最精细,最精美的设备,或运行脚本的最差设备,否则此应用程序受I / O限制。从数据库返回select之后,数据的实际移动将比Jython,Java或此代码中的任何低效率更为主导。

在这个过程中你的CPU基本上是无意识的,你根本就没有做足够的数据转换。您可以编写一个比I / O慢的进程,但这不是其中之一。

你可以用C写这个,我怀疑你会看到很大的不同。

答案 1 :(得分:0)

您是否只能使用Oracle命令行SQL客户端直接将该查询的结果导出到CSV文件中?

答案 2 :(得分:0)

您可以使用带有硬编码索引的getString而不是列名(在print语句中),因此程序不必反复查找名称。另外,我对Jython / Python文件输出知之甚少,无论是否默认启用,但你应该尝试确保输出是缓冲的。

编辑:

请求的代码(我没有声明此代码的正确性):

print >> f , "%s,%s,%s,%s" %(myRs.getString(0),myRs.getString(1),myRs.getString(2),myRs.getString(3) )

myRs = myStmt.executeQuery("select emp_id ,first_name,last_name,date_of_join from src_sales_12")
hasFirst = myRs.next()
if (hasFirst):
    empIdIdx = myRs.findColumn("EMP_ID")
    fNameIdx = myRs.findColumn("FIRST_NAME")
    lNameIdx = myRs.findColumn("LAST_NAME")
    dojIdx = myRs.findColumn("DATE_OF_JOIN")
    print >> f , "%s,%s,%s,%s" %(myRs.getString(empIdIdx),myRs.getString(fNameIdx),myRs.getString(lNameIdx),myRs.getString(dojIdx) )
    ##### Loop over the Result Set and print the result in a file
    while (myRs.next()):
        print >> f , "%s,%s,%s,%s" %(myRs.getString(empIdIdx),myRs.getString(fNameIdx),myRs.getString(lNameIdx),myRs.getString(dojIdx) )

答案 3 :(得分:0)

如果您只想将数据提取到文件中,可以尝试数据库工具(例如,“加载”,“导出”)。

答案 4 :(得分:0)

您可能还会发现,如果您构建了在SQL select语句中进入文件的字符串,您将获得更好的性能。

所以你的SQL select应该是SELECT EMP_ID || ','|| FIRST_NAME || ','|| LAST_NAME || ','|| DATE_OF_JOIN MY_DATA ...(取决于数据库和分隔符是什么)

然后在你的java代码中你只得到一个字符串empData = myRs.findColumn(“EMP_DATA”)并将其写入文件。我们已经看到了这方面的显着性能优势。

您可能会看到另一件好处是更改JDBC连接以使用更大的读取缓冲区 - 而不是在fetch中一次提取30行,获取5000行。