답변:
다음은 최적화에 대해 묻는 사람에게 항상 유용한 것들을 보여줍니다.
우리는 주로 Sybase를 사용하지만 대부분의 조언은 전반적으로 적용됩니다.
예를 들어 SQL Server에는 다양한 성능 모니터링 / 튜닝 비트가 제공되지만 이와 같은 것이 없으면 (아마도 가능할 경우) 다음을 고려할 것입니다 ...
내가 본 문제의 99 %는 너무 많은 테이블을 조인 에 넣음으로써 발생합니다 . 이에 대한 수정은 일부 테이블과 함께 조인의 절반을 수행하고 결과를 임시 테이블에 캐시하는 것입니다. 그런 다음 해당 임시 테이블에서 나머지 쿼리 조인을 수행하십시오.
#temp
테이블은 @table
많은 양 (수천 행)의 변수 보다 훨씬 성능이 좋을 수 있습니다 .주제를 약간 벗어 났지만 이러한 문제를 제어 할 수있는 경우 ...
높은 수준 및 높은 영향.
CREATE INDEX
WHERE
및 JOIN
조항에 사용할 수있는 색인이 있는지 확인하십시오 . 이렇게하면 데이터 액세스 속도가 크게 향상됩니다.
환경이 데이터 마트 또는웨어 하우스 인 경우 거의 모든 쿼리에 대해 인덱스가 풍부해야합니다.
A의 트랜잭션 환경 이 인덱스 유지 관리 자원을 아래로 드래그하지 않도록, 인덱스의 수는 낮은 및 그 정의 전략적이어야한다. (인덱스 유지 관리는 기본 테이블의 변경 사항 INSERT, UPDATE,
과 DELETE
작업 을 반영하여 인덱스의 리프를 변경해야하는 경우 입니다.)
또한 색인에서 필드의 순서를 명심하십시오. 필드가 더 선택적 일수록 (더 높은 카디널리티) 색인에서 더 일찍 나타납니다. 예를 들어 중고차를 검색한다고 가정 해 보겠습니다.
SELECT i.make, i.model, i.price
FROM dbo.inventory i
WHERE i.color = 'red'
AND i.price BETWEEN 15000 AND 18000
가격은 일반적으로 카디널리티가 더 높습니다. 사용 가능한 색상은 수십 가지에 불과하지만 수천 가지 다른 가격이 있습니다.
이러한 인덱스 선택 중에서 idx01
쿼리를 충족시키는 더 빠른 경로를 제공하십시오.
CREATE INDEX idx01 ON dbo.inventory (price, color)
CREATE INDEX idx02 ON dbo.inventory (color, price)
이는 색상 선택보다 가격대를 만족시키는 자동차 수가 적기 때문에 쿼리 엔진이 분석 할 데이터가 훨씬 적기 때문입니다.
필드 순서에서만 다른 두 개의 매우 유사한 인덱스를 사용하여 하나의 쿼리 (이름, 성)와 다른 하나의 (성, 이름)을 가속화하는 것으로 알려져 있습니다.
최근에 배운 요령은 SQL Server가 업데이트 문에서 필드뿐만 아니라 로컬 변수도 업데이트 할 수 있다는 것입니다.
UPDATE table
SET @variable = column = @variable + otherColumn
또는 더 읽기 쉬운 버전 :
UPDATE table
SET
@variable = @variable + otherColumn,
column = @variable
나는 이것을 재귀 계산을 구현할 때 복잡한 커서 / 조인을 대체하기 위해 사용했으며 성능도 많이 얻었습니다.
성능을 크게 향상시킨 세부 사항 및 예제 코드는 다음과 같습니다. http://geekswithblogs.net/Rhames/archive/2008/10/28/calculating-running-totals-in-sql-server-2005---the-optimal. aspx
여기에 MySQL이 있다고 가정하면 EXPLAIN을 사용하여 쿼리에서 수행중인 작업을 찾고 인덱스가 가능한 한 효율적으로 사용되고 있는지 확인하고 파일 정렬을 제거하십시오. 고성능 MySQL : 최적화, 백업, 복제 등 은 MySQL 성능 블로그 와 마찬가지로이 주제에 대한 훌륭한 책입니다 .
@ Terrapin은 언급 할 가치가있는 isull과 coalesce 사이에 몇 가지 다른 차이점이 있습니다 (ANSI 준수 이외에도 큰 문제입니다).
항상 바인드 변수를 사용하는 습관을 들였습니다. RDBMS가 SQL 문을 캐시하지 않으면 바인드 변수가 도움이되지 않을 수 있습니다. 그러나 바인드 변수를 사용하지 않으면 RDBMS는 쿼리 실행 계획 및 구문 분석 된 SQL 문을 재사용 할 기회가 없습니다. : 저축은 엄청난 수 있습니다 http://www.akadia.com/services/ora_bind_variables.html . 나는 주로 Oracle과 함께 일하지만 Microsoft SQL Server는 거의 같은 방식으로 작동합니다.
내 경험에 따르면 바인드 변수를 사용하는지 여부를 모른다면 아마도 사용하지 않을 것입니다. 응용 프로그램 언어가 지원하지 않는 언어를 찾으십시오. 때때로 쿼리 B에 대한 바인드 변수를 사용하여 쿼리 A를 수정할 수 있습니다.
그 후, 나는 DBA와 대화하여 RDBMS가 가장 고통스러운 원인을 찾아냅니다. "이 쿼리가 왜 느린가요?"라는 질문을하지 않아야합니다. 의사에게 부록을 꺼내달라고 요청하는 것과 같습니다. 쿼리가 문제가 될 수는 있지만 다른 문제가 발생했을 가능성이 높습니다. 개발자로서 우리는 코드 라인의 관점에서 생각하는 경향이 있습니다. 회선이 느리면 해당 회선을 수정하십시오. 그러나 RDBMS는 매우 복잡한 시스템이므로 느린 쿼리는 훨씬 더 큰 문제의 증상 일 수 있습니다.
너무 많은 SQL 튜닝 팁은화물 컬트 우상입니다. 대부분의 경우 문제는 사용하는 구문과 관련이 없거나 최소한의 관련성이 있으므로 일반적으로 가능한 가장 깨끗한 구문을 사용하는 것이 가장 좋습니다. 그런 다음 쿼리가 아닌 데이터베이스를 튜닝하는 방법을 살펴볼 수 있습니다. 실패하면 구문을 조정하십시오.
다른 성능 조정과 마찬가지로 항상 의미있는 통계를 수집하십시오. 튜닝하는 사용자 경험이 아닌 한 벽시계 시간을 사용하지 마십시오. 대신 CPU 시간, 페치 된 행 및 디스크 읽기 차단과 같은 것을보십시오. 너무 자주 사람들이 잘못된 것을 최적화합니다.
가능하면 NOT IN 쿼리를 왼쪽 외부 조인으로 변환하십시오. 예를 들어 Table2의 외래 키에서 사용하지 않는 Table1의 모든 행을 찾으려면 다음과 같이하십시오.
SELECT *
FROM Table1
WHERE Table1.ID NOT IN (
SELECT Table1ID
FROM Table2)
그러나 이것으로 훨씬 더 나은 성능을 얻을 수 있습니다.
SELECT Table1.*
FROM Table1
LEFT OUTER JOIN Table2 ON Table1.ID = Table2.Table1ID
WHERE Table2.ID is null
@ 데이빗
여기에 MySQL이 있다고 가정하면 EXPLAIN을 사용하여 쿼리 진행 상황을 확인하고 인덱스가 가능한 한 효율적으로 사용되는지 확인하십시오 ...
SQL Server에서 실행 계획은 같은 것을 얻습니다. 어떤 인덱스가 히트되는지 등을 알려줍니다.
나는 다음을 찾습니다.
SET NOCOUNT ON
실제로 사용하지 않는 한 일반적으로 저장 프로 시저 내부의 첫 번째 줄 @@ROWCOUNT
입니다.
SQL Server에서는 nolock 지시문을 사용하십시오. 기다리지 않고 select 명령을 완료 할 수 있습니다. 일반적으로 다른 트랜잭션을 완료합니다.
SELECT * FROM Orders (nolock) where UserName = 'momma'
나는 사용하고 싶다
isnull(SomeColThatMayBeNull, '')
위에
coalesce(SomeColThatMayBeNull, '')
통합이 제공하는 다중 인수 지원이 필요하지 않은 경우.
http://blog.falafel.com/2006/04/05/SQLServerArcanaISNULLVsCOALESCE.aspx
시스템 프로시 저는 모두 "sp_"로 시작하고 저장 프로 시저 이름은 "sp_"로 시작하지 않으며 SQL Server는 프로 시저가 호출 될 때 프로 시저를 찾기 위해 더 열심히 검색해야합니다.