프레임워크는 ci를 사용하고 데이터베이스는 sqlsrv(sql server 2008)입니다. sql 쿼리에서 반환된 결과 집합에는 20,000개의 데이터가 있습니다. ci 프레임워크에서 이 sql 문을 실행하면 웹페이지가 계속 회전합니다. 20,000개의 데이터를 회전하는 데 약 초가 소요되지만 SQL Server 2008 R2에서는 SQL 문이 몇 초 만에 실행됩니다. CI에서 기본 제공 쿼리 SQL을 사용할 때 실행 시간은 200밀리초입니다. 느린. 개인적으로는 반환되는 데이터가 너무 많아서 너무 느리다고 생각합니다. 반환되는 데이터는 20개 정도의 데이터이고, 통계를 하고 있고, 데이터를 csv 파일로 내보내기 때문에 데이터가 많습니다. 이 문제를 어떻게 처리해야 합니까?
내 SQL 문은 'xxxx-xx-xx 00:00:00'과 'xxxx-xx-xx 23:59:59' 사이에 create_time이 있는 테이블에서 *를 선택합니다. 사용자가 선택한 기간을 기준으로 합니다. 시간 범위가 작으면 데이터가 적습니다. 범위가 크면 데이터가 커집니다.
공개 함수 aa(){
으아악}
이미 가장 간단한 쿼리인데, SQL 문을 몇 초 안에 확인할 수 있지만 브라우저로 실행하는 것은 매우 느립니다.
쿼리 결과가 수만 개이면 브라우저가 실행합니다. 계속 돌리면 4일이 걸립니다. 10초 이상이면 500개의 데이터이면 충분합니다. 3~4초
result_array() 단계를 반복해야 하고 시간이 너무 많이 걸리는지 궁금합니다. 레코드가 수만 개이고 필드가 20개 있습니다
==============2017-05-16 16:01 업데이트===============
함께 제공되는 result_array(를 사용하지 않았습니다. ci 프레임워크), ci 프레임워크 문서를 볼 때 다음 구절을 보았습니다.
종종 데이터베이스 연결 ID 또는 결과 ID를 제공해야 하며 연결 ID는 다음과 같습니다.
결과 ID는 다음과 같이 쿼리에서 반환된 결과 개체에서 얻을 수 있습니다.
으아악그래서 result_id를 사용하여 루프의 각 레코드를 읽도록 코드를 수정했습니다.
$sql ="select xxx";
$query=$this->db->query($sql);
//여기서는 제가 sqlsrv를 사용하므로 sqlsrv_fetch_array를 사용하여 루프의 각 행을 읽습니다
//그런 다음 각 행을 읽은 후 csv 파일을 작성합니다
while($row=sqlsrv_fetch_array($query->result_id,SQLSRV_FETCH_ASSOC)){
// 다음은 다음과 같습니다. csv 파일에 행을 쓰는 코드
}
구체적인 코드는 아래와 같습니다
으아악이렇게 하면 파일을 내보낼 수 있는데 행 19204개, 열 16개로 이루어진 csv 파일을 보니 3M 정도네요. 이 시간을 더 빨리 최적화할 수 있는지 여쭤보고 싶습니다.
大家讲道理2017-05-17 09:57:57
모든 데이터를 엑셀로 내보내는 방법입니다. 데이터를 엑셀로 작성하기 전에 먼저 체크아웃을 해야 합니다. 이 경우에는 보통 백그라운드 프로세스를 사용하여 데이터를 내보낸 다음 이메일로 보냅니다
给我你的怀抱2017-05-17 09:57:57
은 몇 가지 아이디어를 제공합니다:
데이터베이스에서 데이터를 가져오는 작업은 고객의 사용에 영향을 미치지 않습니다.
프런트엔드는 선택할 수 있는 여러 시간 범위가 있어야 합니다. 백엔드는 정기적으로 이러한 시간 범위에 따라 작업을 실행하여 데이터베이스를 가져와 서버에 정적 파일로 저장하고 바인딩합니다. 시간 수정된 필드
#🎜🎜 #- 테이블이 추가, 삭제 또는 수정될 때마다 예약된 업데이트 작업이 트리거됩니다. 예약된 작업 업데이트는 매일 고객 수가 상대적으로 적은 기간에도 수행될 수 있습니다. 밤에
- 내보낼 때마다
을 비교하여 동일하면 이전에 내보낸 정적 파일을 미리 가져갈 수 있습니다. 동일하지 않으면 사이트에서 업데이트해야 합니다. , 하지만 이 경우에는 Less로 비교해야 합니다.
timemodified
회신하다0