SQL 성능을 향상시키는 5가지 방법
이 기사는 MSDN 기사 "SQL 성능을 향상시키는 5가지 방법"에서 발췌되었으며 SQL Server 기반 응용 프로그램의 운영 효율성을 향상시키는 방법을 제안합니다. 트래픽이 많은 일부 응용 시스템의 경우 SQL 지침을 개선하고 개선하는 방법은 매우 중요하며 좋은 돌파구입니다.
*기사에는 주로 다음 내용이 포함되어 있습니다. (관심이 있으신 경우 다음 URL을 직접 방문하여 중국어 및 영어 전체 문서를 읽어보시기 바랍니다.)
1. INSERT에서 IDENTITY 반환
SELECT @@IDENTITY
2, 내장된 뷰 및 임시 테이블
임시 테이블 – tempdb의 임시 테이블은 쿼리로 인해 과도한 I/O 작업 및 디스크 액세스를 수행할 수 있으며 임시 테이블은 많은 리소스를 소비할 수 있습니다.
인라인 뷰 - 임시 테이블 대신 인라인 뷰를 사용합니다. 인라인 뷰는 단순히 FROM 절에 조인할 수 있는 쿼리입니다. 데이터를 다른 쿼리에 조인해야 하는 경우 인라인 보기를 사용하여 리소스를 절약할 수 있습니다.
3. LEFT JOIN과 NULL을 피하세요
LEFT JOIN은 NULL(존재하지 않는) 데이터와 일치하는 데이터를 포함하기 때문에 리소스를 많이 사용합니다. 어떤 경우에는 이것이 불가피하지만 비용이 매우 높을 수 있습니다. LEFT JOIN은 INNER JOIN보다 더 많은 리소스를 소모하므로 LEFT JOIN을 전혀 사용하지 않도록 쿼리를 다시 작성할 수 있다면 매우 좋은 보상을 받을 수 있습니다.
LEFT JOIN을 사용하는 쿼리 속도를 높이는 한 가지 기술은 TABLE 데이터 유형을 생성하고 첫 번째 테이블(LEFT JOIN 왼쪽에 있는 테이블)에 모든 행을 삽입한 다음 TABLE 데이터 유형을 다음 값으로 업데이트하는 것입니다. 두 번째 테이블. 이 기술은 2단계 프로세스이지만 표준 LEFT JOIN에 비해 많은 시간을 절약할 수 있습니다. 좋은 규칙은 다양한 기술을 시도하고 애플리케이션에 가장 적합한 쿼리를 얻을 때까지 각 기술에 필요한 시간을 기록하는 것입니다.
DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
4, 데카르트 곱의 유연한 사용
나는 이 기술에 대해 자세히 설명하고 어떤 경우에는 데카르트 곱의 사용을 옹호할 것입니다. 어떤 이유에서든 데카르트 제품(CROSS JOIN)은 많은 비난을 받고 개발자는 종종 이를 전혀 사용하지 말라고 경고받습니다. 많은 경우 효율적으로 사용하기에는 너무 많은 리소스를 소비합니다. 그러나 SQL의 다른 도구와 마찬가지로 올바르게 사용하면 가치가 있을 수 있습니다.
예제 코드 중 하나는 다음과 같습니다.
-- 데카르트 곱은 모든 달의 모든 고객을 반환합니다. 데카르트 곱은 기본적으로 첫 번째 테이블에 두 번째 테이블을 곱하여 첫 번째 테이블의 행 수와 두 번째 테이블의 행 수를 곱한 행 집합을 생성합니다. 따라서 데카르트 곱은 @tblFinal 테이블에 12(모든 월) * 81(모든 고객) = 972개의 행을 반환합니다. 마지막 단계는 @tblFinal 테이블을 이 날짜 범위에 대한 각 고객의 월간 판매 총액으로 업데이트하고 최종 행 집합을 선택하는 것입니다.
@tblMonths 테이블 선언(sMonth VARCHAR(7))
DECLARE @tblCustomers TABLE(고객 ID CHAR(10),
회사명 VARCHAR(50),
담당자 이름 VARCHAR(50))
DECLARE @tblFinal TABLE(s월 VARCHAR(7),
고객ID CHAR(10),
회사명 VARCHAR(50),
연락처이름 VARCHAR(50),
mSalesMONEY)
@dtStartDate DATETIME을 선언하세요.
@dtEndDate DATETIME,
@dtDate DATETIME,
@i INTEGER
SET @dtEndDate = '1997-5-5'
SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' 23:59:59' AS DATETIME))
SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)
-- 모든 달을 첫 번째 테이블에 가져옵니다.
SET @i = 0
동안(@i < 12)
시작하다
SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
@tblMonths에 삽입 SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +
사례
월(@dtDate) < 10일 때
THEN '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))
ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))
s월로 종료
SET @i = @i + 1
END
-- 해당 기간 동안 매출이 발생한 모든 고객을 "y" 테이블로 가져옵니다.
@tblCustomers에 삽입
구별 선택
c.고객ID,
c.회사명,
c.연락처 이름
고객으로부터 c
INNER JOIN 주문 o ON c.CustomerID = o.CustomerID
@dtStartDate와 @dtEndDate 사이의 o.OrderDate가
@tblFinal에 삽입되는
위치
m.s월을 선택하세요.
c.고객ID,
c.회사명,
c.연락처 이름,
0
@tblMonths m CROSS JOIN @tblCustomers c
업데이트 @tblFinal 세트
에서
mSales = mydata.mSales
FROM @tblFinal f 내부 조인
(
c.고객ID를 선택하세요.
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
MONTH(o.OrderDate) < 10인 경우
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
s월로 종료,
SUM(od.Quantity * od.UnitPrice) AS mSales
고객으로부터 c
INNER JOIN 주문 o ON c.CustomerID = o.CustomerID
INNER JOIN [주문 세부정보] od ON o.OrderID = od.OrderID
@dtStartDate와 @dtEndDate 사이의 o.OrderDate는 어디에 있습니까?
그룹 기준
c.고객ID,
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
MONTH(o.OrderDate) < 10인 경우
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
끝
) f.CustomerID의 mydata = mydata.CustomerID AND f.sMonth =
mydata.s월
f.s월을 선택하세요.
f.고객ID,
f.회사명,
f.연락처 이름,
f.m판매
@tblFinal f에서
주문 방법
f.회사명,
f.s월
5. 부족한 부분을 수거하여 부족한 부분을 보충합니다.
다음은 SQL 쿼리의 효율성을 향상시키는 데 도움이 되는 몇 가지 일반적인 기술입니다. 모든 영업사원을 지역별로 그룹화하고 매출 소계를 원하지만 해당 영업사원만 데이터베이스에서 활성 상태로 표시되기를 원한다고 가정합니다. 영업사원을 지역별로 그룹화하고 HAVING 절을 사용하여 활동하지 않는 영업사원을 제거할 수 있습니다. 또는 WHERE 절에서 이를 수행할 수 있습니다. WHERE 절에서 이 작업을 수행하면 그룹화해야 하는 행 수가 줄어들므로 HAVING 절에서 수행하는 것보다 효율적입니다. HAVING 절의 행 조건을 기반으로 필터링하면 쿼리가 WHERE 절에서 제거될 데이터를 그룹화합니다.
또 다른 효율성 팁은 GROUP BY 절을 사용하는 대신 DISTINCT 키워드를 사용하여 데이터 행에 대한 별도의 보고서를 찾는 것입니다. 이 경우 DISTINCT 키워드를 사용하는 SQL이 더 효율적입니다. 집계 함수(SUM, COUNT, MAX 등)를 계산해야 하는 경우에만 GROUP BY를 사용하세요. 또한 쿼리가 항상 고유한 행을 반환하는 경우 DISTINCT 키워드를 사용하지 마세요. 이 경우 DISTINCT 키워드는 시스템 오버헤드만 추가합니다.
------------------------------
중국어 URL:
http://www.microsoft.com/china/MSDN/library/data/sqlserver/FiveWaystoRevupYourSQLPerformanCE.mspx
영어 URL:
http://msdn.microsoft.com/msdnmag/issues/02/07/DataPoints/