2008-09-22 9 views
0

값을 기록하고 테이블에 한 번만 기록합니다. 테이블에 값을 추가 할 때마다 매번 값을 삽입하거나 ID를 가져와야하는지 확인해야합니다. 테이블에 기본 키가 아닌 인덱스가 있지만 약 35 만 개의 행이 있습니다 (따라서이 값 중 10 개를 수행하는 데 10 초가 걸립니다). 데이터베이스 성능을 향상시키는 방법은 무엇입니까?

그래서 하나가

  • 우리는 그것을이 기능
  • 스트립을 최적화하는 방법을 알아낼 또는 이러한 값을 기록 할 때
  • 는 완전히 다른 무언가를.

답변

1

테이블에 쓰는 빈도와 테이블에서 읽는 빈도. 글쓰기가 빈번하고 가끔 읽는다면 삽입을 할 때 항상 고려한 다음 선택을 할 때 값을 축소하는 것을 고려하십시오.

모든 것을 하나의 테이블에 넣으 려한다면 크기를 줄이거 나 테이블에서 파티션을 사용하지 않으려면 별도의 테이블로 나누는 것이 좋습니다.

2

인덱스는 테이블의 (아마 varchar 또는 nvarchar) 필드에 있습니다. 맞습니까? PK가 아닌가요?

편집 후 : 큰 (n) 개의 varchar 텍스트 필드에서 색인화 된 검색을 수행하고 있습니다. 꽤 느릴 수있는 색인조차도 - 여전히 2 개의 큰 문자열 비교를 수행하고 있습니다. 나는 좋은 방법 정말 일이 이렇게 할 수는 없지만, 몇 가지 초기 그물은 :

  • 는-기록 할 텍스트의 해시를 계산하고, 다른 포스터 후속 조회
  • 에 대한 데이터베이스에 그 저장 제안하고, 모든 행을 저장하고, 쿼리에서 중복 된 내용을 필터링합니다 (또는 야간 일괄 처리에서
  • 은 중복을 확인하지 않습니다. 예외를 잡는 것은 여전히 ​​조회보다 저렴할 수 있습니다. *
  • 정말 마우스로 빠르게 기억할 수있는 좋은 기억 메시지가 기록 될 때 수락/거부 프롬프트로 화면에 깜박입니다. 항목이 속임수라면 "거부"를 클릭하십시오.


* 그래, 나는 그것을 위해 modded 될 거라는 것을 알고 있지만 때로는 실용주의가 효과가있다.

+0

내 질문이 업데이트되었으므로 색인은 PK가 아닙니다. 빠른 응답을 보내 주셔서 감사합니다. – RyanKeeter

+0

기본 키 * 항상 * 관련된 고유 인덱스가 있습니다. 우리는 더 많은 정보가 필요합니다. 테이블을 만드는 데 사용한 DDL은 무엇입니까? 검색을 수행하기 위해 어떤 DML을 사용합니까? 'like'절을 사용하고 있습니까? –

1

350k 행 테이블에서 색인 된 검색을 수행하는 데 1 초가 걸립니까? 그게 내게 정말로 불필요하게 느린 것처럼 들리 네요. 뭔가 다른 것이 틀림 없다고 확신합니까?

1

실제 검색어를 보지 않고는 일반화 만 할 수 있습니다. 그러나 다음과 같은 아이디어 나 조언을드립니다 :

1) 귀하의 색인이 조회 쿼리에 실제로 사용되고 있는지 확인 했습니까? 카디널리티가 높은 색인 인 경우 훨씬 빠릅니다.

 
IF EXISTS (SELECT ID FROM YourTable WHERE ID = @ID_to_look_for) 
     @ID_exists = 1 
ELSE 
     @ID_exists = 0 

당신은 무엇 정확한을 게시 할 경우 다음과 같은 필요한 .... 뭔가 경우

2) 먼저 행에 대해보고 한 후 삽입을 한 하나의 저장 프로 시저로이 작업을 결합 할 수 있습니다 검색어가 어떨지 좀 더 자세한 답변을 제공 할 수 있습니다.

+0

ID가 아니라 기록 된 텍스트를보고 있다고 생각합니다. 즉, my_table에서 @id = id를 선택하십시오. 여기서 log_text는 @text입니다. – Danimal

0

는 나는이 대답하기에 충분한 informaiton이 있는지 모르겠지만, 여기에 몇 가지 생각에 아무도 없습니다 덜 :

  1. 아직 당신은 삽입과에서 인증 할을 할 수 있습니다 일을하지 않는 경우 하나의 SQL에 모두 삽입 (값을 테이블에 삽입) (ID가 null 인 테이블에 외부 조인을 선택하십시오)
  2. DAL 계층 또는 저장 프로 시저를 사용하고 있습니까? 선택/삽입하는 데 사용되는 SQL을 제어합니까? ? 사용자가 SQL 프로필러를 사용하여 DB로 보내지는 내용을 조사하려면 형식이 인덱스를 무효화 할 수 있습니다.
1

조회를 수행하는 대신 값을 삽입 해보십시오. 테이블이 중복 레코드를 거부하도록 설계된 경우 (예 : 기본 키 또는 고유 인덱스가있는 경우) 삽입 오류가 발생합니다. 단순히 삽입 오류에 대한 함정과 그것이받은 경우 그때 평소처럼 ID를 잡아.

나는 조회가 그다지 오래 걸리지 않아야한다는 것에 동의하지만, 엔진이 쿼리를 구문 분석하고, 경로를 지정하고, 조회를 수행 한 다음 결과를 보낼 때 둘 다 동시에 수행 할 수있을 때 .

또한로 볼 수 있습니다 : SQL Server에 사용할 수있는 메모리를 증가 IO

  • 을 개선하기 위해 데이터베이스의 물리적 레이아웃을 변경하면 개선
  • 을위한 공간이 가정

    1. 색인 더 나은
  • +0

    고유 색인을 사용하면 데이터베이스가 항상 자체 select를 수행하여 레코드가 이미 존재하는지 판별합니다. 따라서 삽입 전에 응용 프로그램 내에서 동일한 선택을 수행하면 안됩니다. 성능이 중요하지 않으며 메시지를 제어하기 위해 예외를 피할 필요가없는 경우가 아니면. –

    0

    "테이블에 값을 추가 할 때마다 매번 값을 삽입해야하는지 또는 ID를 가져와야하는지 확인해야합니다."

    우리는 이것을 "upsert"연산이라고합니다.

    try: 
        UPDATE log SET blah blah blah WHERE key = key; 
    except Missing Key: 
        INSERT INTO log(...) VALUES(...); 
    

    우리는 키가 존재하는 경우 즉, UPDATE 문의 작업이기 때문에,보고 우리 자신의 쿼리를 결코하지 않았다.

    1

    우선 무엇을하고 있는지 쿼리 계획을 살펴보십시오. 인덱스를 사용하고 있는지 알려줍니다. 단일 행 테스트/삽입에 대한 1 초가 너무 느립니다. 350k 행의 경우 캐시 된 테이블을 통한 테이블 스캔을 수행 할 수있을 정도로 충분히 길다.

    초. 서버의 실제 레이아웃을보십시오. 동일한 디스크를 공유하는 로그 및 데이터 같은 것이 있습니까?

    세 번째로 고유 키의 인덱스 열이 선택 쿼리의 조건 자와 동일한 순서인지 확인하십시오. 순서의 차이로 인해 쿼리 최적화 프로그램이 혼동 될 수 있습니다.

    넷째, 고유 키에 대한 클러스터 된 인덱스를 고려하십시오. 이 행을 찾는 주 모드 인 경우 테이블 데이터가 실제로 클러스터 된 인덱스와 함께 저장되므로 디스크 액세스가 줄어 듭니다. 클러스터 된 인덱스에 대한 설명은 This을 참조하십시오. 테이블을 충분한 채우기 비율로 설정하십시오.

    BLOB 열이 없으면 파티션이 차이를 만들어야하는 임계 값보다 350KB 줄이 길습니다. 이 크기 표는 전적으로 캐시에 맞아야합니다.

    0

    우연히 커서를 사용하고 있습니까? 당신이하고있는 말을하기 위해 작은 테이블에서 10 초가 걸리지 않아야합니다.

    설정 기반 업데이트 및 삽입 문이 필요합니다.

    0
    1. 규칙 밖으로 연결 및 드라이버 문제 - 충분히 빨리 당신이 내에서 실행 할 수있는 다른 작전에서 독립적으로이 작업을 측정해야합니다

    2. 확인되는 동일한 방법으로 동일한 데이터베이스에 다른 작업을 보장 동일한 거래

    3. 잠금 시나리오가 없는지 확인하십시오. 다른 모든 작업은 중지하고 관리 도구에서 조회 및 업데이트 순서를 실행하기 만하면됩니다.

    4. 조회가 비용이 많이 드는 (99 %) 디스크 쓰기가 비용이 많이 드는지 확인하십시오. 느린 디스크라도 10 초가 지나치게 길어도 확인하십시오. 완전을 위해서 이것을하십시오.

    5. 인덱스가 쿼리에서 사용되고 있는지 확인하십시오. 테이블 스캔이 일어날 수 있습니다.

    6. 색인에 사용 된 열이 텍스트 필드 인 경우 색인이있는 텍스트가 아닌 열에서 조회를 실행하여 텍스트 색인 생성이 문제의 루트에 있는지 확인하십시오. 그렇다면 논리를 변경하여 PK를 사용하거나 텍스트 대신 해시를 사용하십시오.

    관련 문제