2009-07-07 1 views
8

흥미로운 구분이 있습니다. 몇 가지 전체 테이블 스캔과 값 비싼 조인을 수행하고 일부 지형 공간 데이터를 계산하는 스칼라 UDF를 호출하는 매우 비싼 쿼리가 있습니다.SQLServer에서 캐시 테이블을 사용하면 나도 미친가요?

최종 결과는 사용자에게 표시되는 데이터가 들어있는 결과 집합입니다. 그러나 원래의 결과 집합을 페이지로 세분하고 지정된 페이지를 반환하기 때문에 사용자에게 표시 할 모든 것을 반환 할 수는 없으며 원래의 전체 데이터 집합을 가져 와서 그룹 별 및 조인을 적용해야하기 때문에 관련 집계 데이터를 계산할 수 있습니다.

요약하면 UI에 필요한 모든 데이터를 바인딩하기 위해이 비싼 쿼리는 약 5-6 번 호출해야합니다.

이렇게 비싼 쿼리를 한 번 계산할 수있는 방법에 대해 생각해보기 시작했습니다. 이후의 각 호출은 어떻게 든 캐시 된 결과 집합을 가져올 수 있습니다.

CacheID (Guid)를 Nullable 매개 변수로 사용하는 저장 프로 시저로 쿼리를 추상화하려는 생각이 들기 시작했습니다.

이 sproc은 cacheID를 사용하여이 특정 결과 집합을 고유하게 식별하는 캐시 테이블에 결과 집합을 삽입합니다.

이 결과 집합에서 작동해야하는 sprocs는 이전 쿼리의 cacheID를 전달할 수 있으며 cacheID에 단일 WHERE 절을 사용하여 데이터를 검색하는 간단한 SELECT 문입니다.

그런 다음 정기적 인 SQL 작업을 사용하여 캐시 테이블을 비 웁니다.

위의 코드는 훌륭하게 작동하며 제로로드 테스트에서 속도가 향상됩니다. 그러나이 기술을 사용하면 대량의 읽기 및 쓰기 캐시 테이블로드 문제가 발생할 수 있습니다.

짧은 이야기가 짧다. 나는 미친가요? 또는 이것은 좋은 생각입니다.

분명히 나는 ​​lock contention과 index fragmentation에 대해 걱정할 필요가있다.

답변

3

이전에 해 보았습니다. 특히 응용 프로그램을 편집 할 수있는 여유가 없었을 때 특히 그러했습니다. 나는 그것의 유효한 접근법을 때때로 생각하지만, 일반적으로 애플리케이션에 캐시/분산 캐시를 갖는 것이 선호된다. 왜냐하면 DB에 대한 부하를 줄이고 더 나은 확장을하기 때문이다.

순진한 "그냥 응용 프로그램에서 수행"솔루션의 까다로운 문제는 응용 프로그램 메시징 버스가없는 경우 바인드 할 수있는 여러 응용 프로그램이 DB와 ​​상호 작용할 때입니다. memcached), 응용 프로그램 당 하나의 캐시를 갖는 것이 비쌀 수 있습니다.

분명히, 이상적인 솔루션은 페이징을 더 저렴한 방법으로 수행 할 수 있고 페이지 N을 얻기 위해 모든 데이터를 변환 할 필요가 없다는 것입니다.하지만 때로는 불가능합니다. db에서 스트리밍 데이터를 스트리밍하는 것보다는 db에서 다시 스트리밍하는 것보다 저렴할 수 있습니다. 이러한 긴 쿼리를 실행하는 책임이있는 새로운 서비스를 소개하고 메인 애플리케이션이 서비스를 통해 db와 대화하게 할 수 있습니다.

+0

그런 다음 수천 개의 결과를 다시 앱으로 파이프해야합니까? – FlySwat

+0

이 데이터에 대해 많은 SQL 연산을 수행하고 결과를 앱으로 전송합니다. 따라서 앱에 캐싱하는 것은 비생산적입니다. – FlySwat

+0

@FlySwat, 나는 이것을 위해 중개자를 소개하는 것이 가치가 있다고 생각합니다. 중간에 서비스를 제공하면 사람들이 장시간 실행되는 보고서를 실행할 때마다 DB를 적합하게 보내지 않으려 고합니다. 스로틀 및 DB에 부담을 덜어 db –

1

tempdb는로드시 미친 듯이 튀어 나와서 볼 수 있습니다. 비싼 조인을 뷰에 넣고 뷰를 인덱싱하는 것이 모든 사용자에 대해 테이블을 캐싱하는 것보다 쉽습니다.

+0

결과는 매우 임의적이며 많은 입력 매개 변수를 기반으로하므로보기가 엄청납니다. 이것은 나의 첫 번째 생각 이었지만, 그것을하기 위해서는 뷰가 수백만 줄을 필요로한다는 것을 깨달았다. – FlySwat

+1

@FlySway, 백만 개의 행이 반드시 그렇게 나쁘지는 않습니다. 특히 하루가 끝날 때 DB에 부하를 분산시키고 전반적인 부하를 줄이는 것이 더 나은 경우입니다. –

관련 문제