2010-04-27 5 views
0

나는 pymssql을 사용하여 python에서 레코드를 SQL 서버에 삽입하고 있습니다. 데이터베이스는 쿼리를 실행하는 데 2 ​​밀리 초가 걸리지 만 초당 6 행을 삽입합니다. 유일한 문제는 코드 측면입니다. 다음 코드를 최적화하는 방법 또는 레코드를 삽입하는 가장 빠른 방법은 무엇입니까?최적화 pymssql 코드

def save(self): 
    conn = pymssql.connect(host=dbHost, user=dbUser, 
          password=dbPassword, database=dbName, as_dict=True) 
    cur = conn.cursor() 

    self.pageURL = self.pageURL.replace("'","''") 

    query = "my query is there"    
    cur.execute(query) 

    conn.commit() 
    conn.close() 

답변

4

삽입 당 새 연결을 만드는 것처럼 보입니다. 이것은 아마도 경기 침체의 주된 이유 일 것입니다. 새로운 연결을 구축하는 것은 일반적으로 매우 느립니다. 메서드 외부에서 연결을 만들면 큰 발전을 볼 수 있습니다. 함수 밖에서 커서를 만들고 다시 사용하면 다른 속도 향상이 가능합니다.

상황에 따라 하나 이상의 삽입에 대해 동일한 트랜잭션을 사용할 수도 있습니다. 이것은 트랜잭션을 원자 적으로 처리하고 완전히 성공했거나 완전히 실패했기 때문에 약간의 동작을 변경하지만 전체 트랜잭션이 성공했는지 확인해야하기 때문에 일반적으로 트랜잭션 커밋은 느린 작업입니다. 토마스 '좋은 조언뿐만 아니라

+0

@ 토마스 감사합니다. 작동합니다. 이미 메서드 외부에서 연결 개체를 시도했지만 속도는 여전히 낮습니다. autocommit 속성을 True로 설정하면 속도가 향상됩니다. – developer

2

,
난 당신이 executemany() *로 보면 좋을 것, e.g. : executemany()의 두 번째 인수는 삽입 할 행의 순서해야

cur.executemany("INSERT INTO persons VALUES(%d, %s)", 
    [ (1, 'John Doe'), (2, 'Jane Doe') ]) 

... .

이 다른 점을 제공합니다 :
당신은 아마 당신의 쿼리를 보낼 및 쿼리는 execute() 또는 executemany() 중 하나에 별도의 인수로 매개 변수. 이렇게하면 PyMSSQL 모듈에서 인용 문제를 처리 할 수 ​​있습니다. Python DB-API에 기재된

* executemany() :

.executemany(operation,seq_of_parameters)
데이터베이스 조작 (조회 또는 명령)를 준비하고 대해 시퀀스 seq_of_parameters에있는 모든 매개 변수 시퀀스 또는 매핑 그것을 실행한다.

+0

팁 주셔서 감사합니다. – developer