문제

나는 비교적 간단한 쿼리(이 시간)내가 필요로 하는 모든 결과에서(나는 그들을 저장하는 Excel 스프레드시트).쿼리 시간 자체 서버,그래서 나는 어떻게 대략을 실행하지 않고 그것이 발생하고 있는 것일까요?

도움이 되었습니까?

해결책

가장 쉬운 방법은 쿼리 도메인을 여러 부분으로 나누는 것입니다. 예를 들어, 키 범위의 전반전 만 선택하는 표현식을 where 절을 추가 한 다음 두 번째 쿼리를 실행하여 하단 절반을 선택하십시오. 그런 다음 출력을 병합하십시오.

다른 팁

페이지의 요청 시간 초과를 늘릴 수 있습니다.

<cfsetting requestTimeout="3600" />

이것은 모든 항목을 처리 할 시간이 있는지 확인합니다.

목록을 "청크"로 나누고 싶을 수도 있습니다. 최적의 청크 크기가 무엇인지 알아 내기 위해 약간의 튜닝이 필요하지만 결과를 한 번에 100 라인 씩 가져 와서 사용할 수 있습니다.u003Ccfflush> 결과를 사용할 수있게되면 결과를 화면으로 밀어 넣습니다. 이 접근법은 또한 SQL 서버에서 철회 된 모든 행이 CFML 메모리에로드되고 쿼리 객체 변수가 덮어 쓰거나 범위를 벗어날 때까지 ( 그 페이지). 이것은 특히 행이 "넓은"경우 (즉, 큰 바르 차르 또는 텍스트를 포함하는 경우) 수십만 행을 읽을 수있는 콜드 펜션 메모리를 쉽게 채울 수 있음을 의미합니다.

첫째로 떨어져 나가는 것을 확인 이유를 쿼리가니다.

당신은 무엇을 할 수 있는 데이터베이스 레벨에서의 성능을 개선하기 위해 쿼리를 실행합니다.같은 소리는 어쩌면 당신은하지 않는 데이터베이스 제대로 인덱스.을 쿼리고 그것을 던져 몇 가지 프로그램을 분석할 수 있습니다 실행 계획을 실행합니다.를 찾고 해결하는 방법을 설명합니다.

성능 찾으로 색인을 만들 전망하는 경우의 데이터베이스에서 지원하는 종류의 것입니다.

옆에서 보 캐싱의 몇몇 부분은 쿼리다.아무 이유도 없을 하고 있을 계산에 대한 역사적 데이터는 모든 요청을 때 수행되면 다음 캐시 테이블에서 어딘가에.

로 coldfusion 끝입니다.하고 있는지 확인하여 java.io.BufferedWriter 을 만들기 스프레드시트에서도 합니다.를 사용하여 일반 문자열 연결 방법에 CF 개 느리고 BufferedWriter 은 무한히 빠르다.첨부 CFC 내가 만들어 만들기 위한 tabed 으로 구분 스프레드시트,수정할 수 있습니다 그것은 당신의 요구에 맞게 수 있습니다.

<!--- init --->
<cffunction name="init" access="public" returntype="Any" output="false">
    <cfargument name="name" type="string" required="true">
    <cfset var local = {}>

    <!--- name of file when downloading --->
    <cfset variables.name = arguments.name & ".xls">
    <!--- name of temp file --->
    <cfset variables.filename = CreateUUID() & ".csv">
    <!--- full path to temp file for downloading --->
    <cfset variables.fullfilename = expandpath("/_temp") & "\" & variables.filename>
    <!--- file write java object --->
    <cfset variables.filewriter = CreateObject("java","java.io.FileWriter").init(
            variables.fullfilename
            ,JavaCast("boolean","true")
        )>
    <!--- buffered writer java object --->
    <cfset variables.bufferedwriter = CreateObject("java","java.io.BufferedWriter").init(
                variables.filewriter
            )>
    <!--- row delimeter --->
    <cfset variables.row = chr(10)>
    <!--- col delimeter --->
    <cfset variables.col = chr(9)>
    <!--- header container --->
    <cfset variables.headers = []>
    <!--- data container --->
    <cfset variables.data = []>
    <cfset newrow()>
    <cfreturn this>
</cffunction>


<!--- addheader --->
<cffunction name="addheader" access="public" returntype="void" output="false">
    <cfargument name="str" type="string" required="true">
    <cfset arrayappend(variables.headers, arguments.str)>
</cffunction>

<!--- newrow --->
<cffunction name="newrow" access="public" returntype="void" output="false">
    <cfset arrayappend(variables.data, arraynew(1))>
    <cfset variables.data_counter = arraylen(variables.data)>
</cffunction>

<!--- adddata --->
<cffunction name="adddata" access="public" returntype="void" output="false">
    <cfargument name="str" type="string" required="true">
    <cfset arrayappend(variables.data[variables.data_counter], arguments.str)>
</cffunction>

<!--- flush --->
<cffunction name="flush" access="public" returntype="void" output="false">
    <cfset var local = {}>

    <!--- write headers --->
    <cfset local.counter = 0>
    <cfset local.headers_count = arraylen(variables.headers)>
    <cfloop array="#variables.headers#" index="local.header">
        <cfset local.counter++>
        <cfset variables.bufferedwriter.write(local.header & variables.col)>
    </cfloop>

    <cfif not arrayisempty(variables.headers)>
        <cfset variables.bufferedwriter.write(variables.row)>
    </cfif>

    <!--- write data --->
    <cfloop array="#variables.data#" index="local.data">
        <cfloop array="#local.data#" index="local.cell">
            <cfset variables.bufferedwriter.write(local.cell & variables.col)>
        </cfloop>
        <cfset variables.bufferedwriter.write(variables.row)>
    </cfloop>

    <cfset variables.bufferedwriter.close()>
    <cfsetting showdebugoutput="No">
    <cfheader name="Content-Description" value="File Transfer">
    <cfheader name="Content-Disposition" value="attachment;filename=#variables.name#">
    <cfcontent type="application/vnd.ms-excel" file="#variables.fullfilename#" deletefile="true" reset="true">
</cffunction>

다른 사람들이 지적으로 시도할 수 있습니다 증가하는 요청한 제한 시간의 페이지는 않지만 적당하는 경우 쿼리 실행은 측정 , 보다는,초 밀리초 단위입니다.CF 만 서비스 설정 요청 수 시간에,그래서 당신이 원하는 조심해야에 대해 잠금까지 그 중 하나는 요청을 기다리고 5 분 거리에는 쿼리를 완료합니다.

를 사용하는 경우 또는 SQL Server Oracle,내 생각 CFQUERY 노출 자체당 쿼리 시간 제한하는 특성을 설정할 수 있습니다.다시,이것에 대한 것이 정말로 오래 실행되는 검색어입니다.

내 경험에 의하면 쿼리가 너무 복잡하거나,또는 반 그래서 많은 데이터,소요 을 실행,그것은 시간을 분리 실행에서 쿼리되는 요청을 시작합니다.의 수 있는 방법 당신이 할 수 있는 이와 같은:

  1. 을 만들 어떤 종류의 큐 시스템을 기록 보류 중인 요청을 제공합니다.이 될 수 있는 DB 테이블,XML 파일에 디스크,etc.할 때 사용자의 요청이 데이터를 등록하는 요청과 함께 이 큐가 있습니다.

  2. 쓰기 예약하는 작업(예:Java,DTS,이나 예약 CF 페이지)에 주기적으로 확인 이 큐 있습니다.귀하의 요구에 따라할 수 있 스 백그라운드 스레드를 처리하는 각 요청,또는 어쩌면 예약된 작업을 처리합니다.를 사용하는 경우 예약 CF 페이지로,당신은 휴식하고 싶은 총 작업으로 작은 조각 처리할 수 있는 반복적으로,그렇지 않으면 당신은 같은 문제는 이제 수 있습니다.

  3. 한 번은 예약된 작업을 결정하는 요청이 가득했습니다,그것은 개막 일종의 알림을 처리할 수 있는 시스템을 준비합니다.예를 들어,이메일 사용자들에게 말하기는 데이터가 준비와 함께,에 대한 링크를 다운로드.csv 파일에서 만든 디스크에 있습니다.

분명히,올바른 선택에 달려있 특정한 문제가 해결되고있다.에서 일반적인 나는 이런 일을 시도,에서 이 순서는:

  1. 적극적으로 공격하는 쿼리를 실행한다.을 사용할 수 있는 인덱스 또는 쓰기 더 나은 T-SQL?
  2. 는 경우 쿼리 분,그리고 실행에 매우 자주,증가하는 페이지 또는 쿼리 시간 제한될 수 있습 허용됩니다.
  3. 면 쿼리가 자주 실행,또는 더 이상 2~3 분,쌩 및 구축을 처리 또는 큐를 처리하는 시스템에서 쿼리를 배경입니다.

여러 쿼리를 병합하는 것이 더 나은 접근 방식 일 수 있지만 요청 당 시간을 설정할 수 있습니다.

<cfsetting 
enableCFoutputOnly = "yes|no" 
requestTimeOut = "value in seconds"
showDebugOutput = "yes|no" >

인덱싱을 올바르게 사용하십시오. 할 수있는 곳에 외국 키를 만듭니다. 정규화되는 DB의 쿼리는 절대 시간을 초래하지 않습니다.

당신이 가지고있는 것처럼 조인과 조항에 대해 매우 조심하십시오. group by 사용하는 대신 쿼리의 조항 where 절, having 절은 더 빨리 작동합니다. 따라서 쿼리 실행 시간을 줄입니다.

비용 추정을 사용하여 DB에서 가장 많은 시간이거나 정규화가 필요한 테이블을 확인하십시오.

쿼리를 별도의 스레드에 던져 영구적 인 범위 (예 : 세션)에로드합니다. 쿼리의 존재를 확인하는 페이지로 전달하십시오. 쿼리가 존재할 때까지 확인을 반복 한 다음 표시/프로세스/whatevers를 표시하는 페이지로 전달하십시오.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top