Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/8.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/0/performance/5.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
Database 如何提高性能和速度_Database_Performance_Connection_Jython - Fatal编程技术网

Database 如何提高性能和速度

Database 如何提高性能和速度,database,performance,connection,jython,Database,Performance,Connection,Jython,我已经编写了这个程序来连接数据并将其提取到文件中,但是这个程序在提取数据时太慢了。是否有任何方法可以提高性能并更快地将数据加载到文件中。我的目标是10万到100万条记录,这就是为什么我担心性能的原因,我也可以像在java中那样使用数组获取大小和批处理大小 import java.sql as sql import java.lang as lang def main(): driver, url, user, passwd = ('oracle.jdbc.driver.OracleDri

我已经编写了这个程序来连接数据并将其提取到文件中,但是这个程序在提取数据时太慢了。是否有任何方法可以提高性能并更快地将数据加载到文件中。我的目标是10万到100万条记录,这就是为什么我担心性能的原因,我也可以像在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()

您不能直接使用Oracle命令行SQL客户端将查询结果导出到CSV文件中吗?

您可以使用带有硬编码索引的getString,而不是列名(在打印语句中),这样程序就不必反复查找名称。另外,我对Jython/Python文件输出的了解还不足以说明默认情况下是否启用了它,但是您应该尝试确保输出是缓冲的

编辑:

请求的代码(我不主张此代码的正确性):


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

除非您使用的是数据库和文件服务器的最佳设备,或者运行脚本的最差设备,否则此应用程序是I/O绑定的。从DB返回select后,数据的实际移动将比Jython、Java或此代码中的任何低效更为重要

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


您可以用C编写,我怀疑您是否会看到实质性的区别。

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

因此,您的SQL选择应该是select EMP|U ID | |','| | FIRST|U NAME | |','| | LAST| U NAME | |','| DATE|U OF | U JOIN MY|U DATA |。。。(取决于数据库和分隔符是什么)

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


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

了解速度有多慢(每个记录)以及您使用的硬件会有很大帮助。需要找到你的瓶颈。嗯,我正在尝试制作一个通用程序,这样我就可以更改数据库连接和驱动程序,并且它仍然适用于任何数据库。换句话说,“写一次,到处运行,只是速度非常慢”@APC:Jython是Java之上的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) )