2012-01-12 2 views
6

기본적으로 데이터베이스 (Microsoft SQL Server 2008)에서 데이터를 추출하는 것과 관련된 비즈니스에 대한 할당이 있습니다. 이 과정에서 사용자는 선택할 열을 선택하고 선택할보기를 선택하고 WHERE 절을 작성할 수 있습니다. 사용자가 선택한 것을 기반으로 SQL 쿼리가 그에 따라 생성됩니다. 요구 사항은 사용자가 ANY 뷰에서 ANY C 럼을 선택하고 WHERE 절의 ANY C 럼으로 필터링 할 수 있다는 것입니다. 회사는 솔루션에 데이터웨어 하우스/OLAP 사용을 원하지 않으며 제 3 자 소프트웨어를 제한하려고합니다. 따라서 기본적으로 GUI 기반의 SQL 쿼리를 동적으로 생성하고 데이터베이스에 연결하는 .NET Windows Forms 애플리케이션이 필요합니다.동적 쿼리 최적화

내 관심사는 쿼리를 최적화하는 방법입니다. 나는 아직 SQL 쿼리를 최적화하는 데 아무런 의미가 없지만 첫 번째 생각은 사용자가 인덱스가없는 열 (WHERE 절)을 기준으로 필터링을 선택하면 어떻게 될까요? 사용자에게 많은 유연성을 제공함으로써 실행에 오랜 시간이 걸리는 비효율적 인 쿼리를 잠재적으로 만들 수 있습니다.

인덱스가없는 열을 필터링하면 성능이 좋지 않을 수 있지만 성능을 향상시키기 위해 할 수있는 일이 있습니까? 확실히 모든 열에 인덱스를 추가 할 수는 없습니다.

내가 쿼리 최적화를 반드시 찾고있는 것은 아니지만 캐싱과 같은 서버 조정이 있다면 생각하고 있습니까? 기본적으로 나는 모든 귀이고 성능 향상에 도움이되는 조언을 찾고 있습니다.

제안 사항?

미리 감사드립니다.

+1

이것은 열 저장소 색인이 도움이되는 시나리오 중 하나입니다 (다음 버전까지는 사용할 수 없음). DW를 사용하지 않음으로써 어떤 의미인지 확신 할 수 없습니다. 이것은 또한 동시 데이터 수정의 대상이되는 OLTP 데이터베이스를 쿼리하는 것이므로 인덱스를 추가하는 것을 꺼리는가? –

+0

예, 데이터베이스는 다른 많은 것들에 사용되는 OLTP 데이터베이스보다 더 자주 사용됩니다. 따라서 많은 인덱스를 추가하면 삽입/업데이트 속도가 느려집니다. – Andy0708

+1

명백한 하드웨어 업그레이드를 제외하고는 해당 사양을 기반으로 할 수있는 일이 많습니다. 아마 성능이 빨라질 것입니다. 왜 그들은 이것을 위해 OLAP/DW를 할인 했습니까? –

답변

4

사용자가 수행 할 가능성이있는 것을 제외하고는 실제로 많은 것을 할 수 없습니다. SQL Server 최적화 프로그램이 귀사를 위해 최선을 다할 수있는 좋은 위치에 있습니다 (키 - 값 저장소에이를 구축한다고 상상해보십시오!).

필터링하거나 정렬 할 가능성이 가장 높은 열에 인덱스를 만들 것입니다. 이러한 인덱스를 null이 아닌 값으로 필터링하면 스토리지 비용이 절감됩니다 (사용자가 null 값을 필터링하지 않는다고 가정).

인덱스 된 뷰를 사용하여 일반적인 조인과 집계를 미리 계산할 수도 있습니다. 이 문제에서 미친 양의 RAM을 기꺼이 쓰고 기꺼이 쓰기를 원한다면이 데이터베이스에서 색인을 생성하고 구체화 할 수 있습니다.

마지막으로 읽기 전용 로그 전달 대상 등에서 사용자 쿼리를 오프로드 할 수 있습니다. 이것은 그들의 끔찍한 쿼리를 샌드 박스에 넣을 것입니다.

쿼리의 경우 매개 변수를 매개 변수화해야하지만 모든 경우에 캐싱 할 필요는 없습니다. 쿼리에 큰 비용이 드는 경향이 있으므로 (컴파일 시간은 중요하지 않음) SQL Server가 모든 매개 변수의 정확한 런타임 값에 적응할 수 있도록 OPTION RECOMPILE을 사용하여 쿼리를 실행해야합니다.

또한 모든 쿼리를 모니터링하고 패턴을 검토하여 검토해야합니다. 사용자는 항상 매우 유사한 쿼리를 실행합니다. 그들에 대한 색인.

정기적으로 sp_updatestats를 실행하십시오.

마지막으로 SQL Server가 모든 사람에게 이익을 가져다 줄 수 있도록 구현한다면 매우 효과적인 솔루션이라고 할 수 있습니다.

1

첫째, 질의/문

  • 을 최적화 캐시 및 컴파일 SQL 서버의 능력을 향상시킬 수 있는지 UI IN을 지원하고 확인 BETWEEN시키는 사용자가 WHERE 절 자신을 구축하면서.
  • AND 또는 OR 조건을 정렬하면 인덱싱 된 열이 먼저오고 다른 열은 알파벳순으로 정렬됩니다.
    • 당신이 당신의 WHERE 절에 중첩 된 AND 연산과 논리합이
  • 사용 * 매개 변수화 된 쿼리 더 어려울 수 있습니다 "
WHERE C1 = 'foo' AND C3 = 'bar' AND C2 = 42 
-- if C3 is an indexed column then 
WHERE C3 = @parm1 AND C1 = @parm2 AND C2 = @parm3 

제를 허용하는 경우, 사용자에게 권한을 부여하기 위해

  • 사용자가 선택할 수있는 열을 나열 할 때 인덱싱 된 열을 먼저 나열하거나 사용할 권장 열로 만드십시오.
  • 사용자가 선택하는 열과 쿼리가 완료되는 데 걸리는 시간을 기록합니다. 이 정보가 있으면 나중에 데이터베이스를 조정하고 사용자 환경을 개선하는 데 도움이 될 수 있습니다.

편집 또는 -> AND 나 OR 마틴 스미스의 코멘트와 관련하여,이 단락이라고합니다.

는 논리를 고려

A = True OR B = True OR C = True 

A가 참으로 인 더가 거짓 인 경우이 경우

A = True AND B = True AND C = True 

사실로 상태에 대한 B 또는 C를 평가 할 필요가없는 경우 조건이 거짓이라면 B 또는 C를 회피해야합니다.

+0

인덱싱 된 열이 먼저 정렬되도록 조건을 정렬하면 –

+0

@Martin Smith - SQL Server가 부울 식을 단락시킬 것이라는 인상하에있었습니다. 귀하의 의견은 일종의 glib입니다, 그래서 만약 당신이 정교 할 수 있다면 도움이 될 것입니다. 순서 지정 및 매개 변수화의 또 다른 요점은 다른 매개 변수가있는 동일한 열을 사용하는 쿼리가 다시 사용할 수 있도록 캐싱된다는 것입니다. –

+1

@LastCoder - [SQL Server가 단락되지 않음] (http://stackoverflow.com/questions/381224/sql-server-query-short-circuiting) –