문제

업데이트:처럼 보이는 쿼리를 던지지 않는 모든 시간 제한.연결의 시간이 다 되어가고 있습니다.

이 예제 코드를 실행하기 위한 쿼리를 수행합니다.때때로,실행하는 동안 시간이 걸리는 쿼리를,그것을 던져 시간 초과 예외는 아니다.

할 수 없 를 사용하는 이러한 기법:1)증가한다.2)실행하는 비동기적으로와 콜백입니다.이 요구에서 실행하는 동기 방식이다.

어른 techinques 연결을 유지하는 동안 실행 시간이 걸리는 쿼리?

private static void CreateCommand(string queryString,
    string connectionString)
{
    using (SqlConnection connection = new SqlConnection(
               connectionString))
    {
        SqlCommand command = new SqlCommand(queryString, connection);
        command.Connection.Open();
        command.ExecuteNonQuery();
    }
}
도움이 되었습니까?

해결책

을 사용하기 때문에 ExecuteNonQuery 는 반환하지 않는 모든 행에,당신은 이것을 시도할 수 있는 폴링 기반 접근 방법이다.그것은 쿼리를 실행하는 asyc 방식으로(없는 callback) 하지만 응용 프로그램을 기다릴 것입니다(잠시 내에서 루프)쿼리를 완료합니다.서 MSDN.이를 해결해야하는 시간 제한 문제입니다.그것을 시도해 보시기 바랍니다.

하지만,나는 다른 사람을 생각해야한 더 많은 최적화에 대한 쿼리를 수행하에 30 초 동안 울립니다.

        IAsyncResult result = command.BeginExecuteNonQuery();

        int count = 0;
        while (!result.IsCompleted)
        {
            Console.WriteLine("Waiting ({0})", count++);
            System.Threading.Thread.Sleep(1000);
        }
        Console.WriteLine("Command complete. Affected {0} rows.",
        command.EndExecuteNonQuery(result));

다른 팁

당신이 먼저 확인해야 합니다 쿼리를 보는 경우 그것은 최적화되지 않게 실행하는 누락에 인덱스입니다. 30 초 할당 대부분의 쿼리, 도에 대형 데이터베이스의 경우 그들은 제대로 조정합니다.이 있는 경우 단단한 증거를 쿼리 계획을 사용하는 쿼리를 실행할 수 없습에 어떤 이보다 더 빨리 해야 하는 다음을 증가 시간 초과,다른 방법이 없어서 연결을 유지하기에,그 목적의 제한 시간이 종료하는 경우 연결 쿼리가 완료되지 않는 시간에 프레임입니다.

게 자라.

당신은 몇 가지 옵션을 얻는 방법에 대한 당신의 시간다.첫째,당신의 회사 사용 Dba,나 묻는 것이 좋습니다 그들을 위한 제안.

하지 않을 경우,옵션 또는 시도하려는 경우 다른 어떤 일을 먼저 여기에 세 가지 주요 옵션:

  1. 헤어 쿼리로 실행되는 구성 요소에서 시간을 초과했습니다.이것은 아마도 가장 쉬운 방법입니다.
  2. 쿼리를 변경 액세스를 최적화하기 위한 경로를 통해 데이터베이스(일반적으로:치는 인덱스를 가깝게 당신이 할 수 있습니다)
  3. 변경하거나 추가 지수에 영향을 미치 쿼리의 접근 경로입니다.

당신은에서 제한 기본값을 사용하는 프로세스의 변화하는 시간 제한 값을 가장 가능성이 할 일이 더 많이 작동합니다.다음 옵션을 마음에 올

  1. 검증으로 DBA 와 다른 코드를 검토하는 당신은 진정으로 최적화된 쿼리는 가능한 한 최선
  2. 작업에 기본 DB 구조를 볼 수 있는 경우에 어떤 이득을 얻을 수 있는 DB 측면,생성/수정 idex(es).
  3. 으로 나누어 여러 부분에,심지어 이를 실행하는 것을 의미하는 절차로 여러 매개 변수를 반환하는 단순히 부르는 또 다른 param.(이 옵션은 우아한,그리고 정직하는 경우에는 코드는 정말 걸릴 것입니다 이것은 많은 시간이 나는 것을 관리하고 다시-논의하는 30 초의 시간 제한)

우리는 최근 유사한 문제에 SQL Server2000 데이터베이스입니다.

하는 동안 당신의 쿼리로 실행에 대한 쿼리 마스터 데이터베이스에 db 서버와 볼 수 있다면 잠금 해결 해야 합니다.:

select 
  spid,
  db_name(sp.dbid) as DBname,
  blocked as BlockedBy,
  waittime as WaitInMs,
  lastwaittype,
  waitresource,
  cpu,
  physical_io,
  memusage,
  loginame,
  login_time,
  last_batch,
  hostname,
  sql_handle
from sysprocesses sp
where (waittype > 0 and spid > 49) or spid in (select blocked from sysprocesses where blocked > 0)

SQL 서버 관리 Studio2008 도 포함되어 아주 멋진 활동 모니터링 볼 수 있는 건강의 데이터베이스를 검색합니다.

우리의 경우,그것은 networkio 잠금 보관 데이터베이스 바쁘다.그것은 일부 레거시 VB 코드는 연결을 끊는 결과 집 빠른 충분하다.

는 경우는 금지되어서의 기능을 사용하여 데이터 액세스 API 을 허용하는 쿼리를 마지막으로 30 초,우리가 볼 필요가 SQL.

성능 향상을 만들 수를 최적화하여 사용의 ADO.NET 는 약간의 비교에서의 이익의 최적화 SQL.

그리고 당신은 이미 있는 가장 효율적인 방법을 사용하여 수행한 SQL.다른 기술을 것 마저 가망없는 느린(하지만,당신이 한 경우 빠른 검색을 당신의 행하고 일부는 정말로 느린이 클라이언트 측면 처리를 사용하여 데이터를 얻을 수 있을 처음 검색을 아래로 30 초 미만이지만,저는 그것을 의심합니다.)

는 경우에 우리가 알고 있는 경우에 당신은 하고 있었다 삽입,어쩌면 당신이 사용해야 bulk insert.하지만 우리는 알지 못합의 콘텐츠에 sql.

이것은 추한 해킹이지만,를 해결하는 데 도움이 될 수 있습니다 당신의 문제를 일시적으로까지 해결할 수 있습니다 실제 문제

    private static void CreateCommand(string queryString,string connectionString)
    {
        int maxRetries = 3;
        int retries = 0;
        while(true)
        {
            try
            {
                using (SqlConnection connection = new SqlConnection(connectionString))
                {
                    SqlCommand command = new SqlCommand(queryString, connection);
                    command.Connection.Open();
                    command.ExecuteNonQuery();
                }
                break;
            }
            catch (SqlException se)
            {
                if (se.Message.IndexOf("Timeout", StringComparison.InvariantCultureIgnoreCase) == -1)
                    throw; //not a timeout

                if (retries >= maxRetries)
                    throw new Exception( String.Format("Timedout {0} Times", retries),se);

                //or break to throw no error

                retries++;
            }
        }
    }
command.CommandTimeout *= 2;

두 번 것입니다 기본적인 제한 시간은 30 초입니다.

또,값을 넣 에서는 대한 구성 파일에서,그래서 당신은 그것을 조정할 수 있습으로 필요없이 다시 컴파일해야 합니다.

신의 쿼리로 여러 덩어리로 각 내에서 실행합니다.

당신이 절대적으로 수 없이 증가 시간 제한,당신은 시간을 줄이기 위해 쿼리를 실행에는 기본 30 초의 시간을 초과했습니다.

나를 싫어하는 경향이 있 증가 연결/명령을 제한 시간 이후에 내 마음이 하는 것이 문제의의 치료를 증상이 문제가 아닙

당신에 대해 생각 깨 쿼리로 여러 작은 덩어리가?

또한,당신은 당신의 데이터베이스에 대한 쿼리를 엔진 튜닝에서는:

Management Studio>도구>데이터베이스 엔진 튜닝

마지막으로,우리는 얻을 보면 쿼리가?

환호

당신을 감싸는 sql 내부에 저장된 절차로,그들은 더 나은 메모리를 관리합니다.본 시간 전에 이 계획에서 sql 문으로 내부 쿼리를 사용하여 클래식 ADO.즉선택*부터(선택합니다....) t 내부 조 somthingTable.내부 쿼리했을 반환하는 매우 큰 숫자의 결과입니다.

다른 팁 1.을 수행하 읽으로(nolock)실행 힌트를,그것의 더럽고 나가지 않는 것이 좋습니다하지만 그것은 경향이 있을 것이 더 빠를 수 있습니다.2.또한 실행 계획의 sql 의 실행하려고 줄 줄 검사는 순서 당신은 가입 테이블이 있습니다.3.보 추가 인덱스 테이블에 대한 빠르게 읽습니다.4.나 또한 발견하는 행을 삭제하는 것은 매우 비싼,당신이 시도할 수 있습고의 수를 제한 행당 호출합니다.5.왑@변수 테이블과 함께#임시 테이블은 또한 나를 위해 일했다.6.수도 있습 저장 나쁜 실행 계획(들어 본 적이 없).

업데이트:처럼 보이는 쿼리하지 않는 을 던져 모든 시간 제한.연결이 합니다.

I.o.w., 도하지 않는 경우 쿼리를 실행하고,연결 시까?이 있기 때문에 두 시간:연결 및 쿼리가 있습니다.모두에 초점을 맞출 것이 쿼리,하지만 당신은 연결을 얻을 시간 제한,그것의 네트워크에 문제가 없으로 쿼리:연결은 먼저 설정할 수 있기 전에는 쿼리를 실행할 수 있습니다,분명합니다.

수도 시도 가치가 있는 페이징니다.

다만 설정한다.의 에서 제공하는 0 이의 원인이됩니다 명령을 때까지 기다리 쿼리가 완료되...예를 들어:

SqlCommand cmd = new SqlCommand(spName,conn);
cmd.CommandType = CommandType.StoredProcedure;
cmd.CommandTimeout = 0;
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top