복붙노트

[SQL] AddWithValue DBTYPE 쿼리가 느리게 실행하는 원인없이

SQL

AddWithValue DBTYPE 쿼리가 느리게 실행하는 원인없이

나는 cmd.Parameters.AddWithValue를 사용하고, DBTYPE (INT, VARCHAR, ...) 쿼리를 실행하기를 지정하지 있었어요. SQL 프로파일 러보고 후에는 쿼리가 느린 사용자가 데이터 형식을 지정할 때보다 훨씬을 실행하는이 방법으로 실행하는 것이 보인다.

당신이 얼마나 느린의 아이디어를 제공하기 위해, 여기에 예입니다. 쿼리는 하나의 테이블에 간단한 조회, 그리고 문이 인덱스되어있는 열입니다. 데이터 타입 (측정하는 SQL 서버 너무 작은) 0에 대한 MS의 특정 쿼리 실행을 지정하고, 필요한 경우 41 읽는다. 나는 DBTYPE을 제거하면 약 200 밀리 초 걸릴 수 있으며, 10000은 전체의 쿼리에 대해 읽습니다.

난 그냥 SQL 프로파일 러 잘못 읽는 값을, 또는 잘 모르겠어요이 값이 실제로 올바른지,하지만 난 추가하고 DBTYPE를 제거하고 SQL 프로파일 러에 주어진 값을 생성 할 수 있다는 점에서이 재현됩니다.

다른 사람이 문제를 건너, 그리고 그것을 해결하는 간단한 방법이 있습니다. 난 내 코드를 통해 모두 데이터 유형을 추가 갈 수 있다는 것을 인식하지만, 물건을 많이가에 추가 할 그 것, 그리고 그것을 해결하는 쉬운 방법이 있는지, 그 많이 주시면 감사하겠습니다.

[편집하다]

(루프의 두 시나리오를 실행) 일부 초기 테스트 후에는 프로파일 러의 정확성을 제공하는 값처럼 보인다.

마찬가지로 제가 DB에 대한 Windows 2000에서 윈도우 XP 프로, 그리고 SQL 서버 2000에서 닷넷 2.0을 실행하고있어 정보를 추가했습니다.

[최신 정보]

일부 파고 주위 후, 나는 관련이있을 수 있습니다이 블로그 게시물을 찾을 수 있었다. 자동 NVARCHAR 매개 변수로 생성 닷넷에서 해당 문자열 값을 (그들이 유니 코드 때문에) 보인다. 나는이 문제를 해결하는이 주위에 뭔가를 할 수 있다면 내가보고 작업에 들어갈 때 월요일까지 기다려야한다. 아직도 내가 피하려고 하였다 어떤 데이터 형식을 설정해야 할 것입니다 것처럼 보인다.

이 문제는 여전히 문제가있는 쿼리의 DBTYPE 설정에 의지 할 수 있도록 단지가, 몇 가지 선택, 내가 한 모든 쿼리에 표시되지 않습니다,하지만 난 문제에 더 일반화 된 솔루션을 찾고 있어요.

해결법

  1. ==============================

    1.이 문제는 SQL 서버가 암시 적 형식 변환을 수행하는 방법과 관련이 있습니다. 당신은 NVARCHAR 값 (예. N'some 텍스트를 ')를 사용하여 VARCHAR 열을 필터링하면 SQL은 선택의 여지가 있지만, NVARCHAR은 VARCHAR로 암시 적으로 변환 돌아올 수 없기 때문에 NVARCHAR에 열을 변환 할 수 있습니다.

    이 문제는 SQL 서버가 암시 적 형식 변환을 수행하는 방법과 관련이 있습니다. 당신은 NVARCHAR 값 (예. N'some 텍스트를 ')를 사용하여 VARCHAR 열을 필터링하면 SQL은 선택의 여지가 있지만, NVARCHAR은 VARCHAR로 암시 적으로 변환 돌아올 수 없기 때문에 NVARCHAR에 열을 변환 할 수 있습니다.

    가장 좋은 해결 방법은 하나가 유형을 지정하거나 NVARCHAR로 데이터베이스 열을 변경하는 것입니다.

  2. ==============================

    2.난 그냥이 정확한 문제 다 퉜다. 나는 문자 열이 많은 기존의 데이터베이스를 가지고있다. 열 유형을 지정하지 않고 결과를 내 쿼리 중 하나에 몇 분했다. (이 NVARCHAR로 기본 설정.) 결과가 초 정도 걸릴 원인이 된 열 유형을 지정.

    난 그냥이 정확한 문제 다 퉜다. 나는 문자 열이 많은 기존의 데이터베이스를 가지고있다. 열 유형을 지정하지 않고 결과를 내 쿼리 중 하나에 몇 분했다. (이 NVARCHAR로 기본 설정.) 결과가 초 정도 걸릴 원인이 된 열 유형을 지정.

    cmd.Parameters.AddWithValue("charcolumn", "stringvalue");
    cmd.Parameters[0].SqlDbType = SqlDbType.Char;
    

    나는 내가 문자 유형으로 모든 문자열 쿼리를 가지고 시도거야 생각하고 그것이 어떻게되는지.

    [편집하다]

    사실 ...이 글을 읽고 후 : http://www.u2u.info/Blogs/U2U/Lists/Posts/Post.aspx?ID=11

    나는이 솔루션을 가기로 결정했습니다 :

    cmd.Parameters.AddWithValue(colName, val);
    if(val is string)
      cmd.Parameters[i].DbType = DbType.AnsiString;
    
  3. ==============================

    3.사례 모두에서 생성 된 SQL 문은 무엇입니까?

    사례 모두에서 생성 된 SQL 문은 무엇입니까?

    난 당신이 명시 적으로 지정하지 않을 때 VARCHAR와 같은 값을 가정 것으로 의심하고있다.

    예를 들면 주문 FROM SELECT OrderID를 WHERE OrderID를 = 1001 주문 FROM 대 SELECT OrderID를 WHERE OrderID를 = '1001'

  4. from https://stackoverflow.com/questions/345323/addwithvalue-without-dbtype-causing-queries-to-run-slowly by cc-by-sa and MIT license