흥미로운 구분이 있습니다. 몇 가지 전체 테이블 스캔과 값 비싼 조인을 수행하고 일부 지형 공간 데이터를 계산하는 스칼라 UDF를 호출하는 매우 비싼 쿼리가 있습니다.SQLServer에서 캐시 테이블을 사용하면 나도 미친가요?
최종 결과는 사용자에게 표시되는 데이터가 들어있는 결과 집합입니다. 그러나 원래의 결과 집합을 페이지로 세분하고 지정된 페이지를 반환하기 때문에 사용자에게 표시 할 모든 것을 반환 할 수는 없으며 원래의 전체 데이터 집합을 가져 와서 그룹 별 및 조인을 적용해야하기 때문에 관련 집계 데이터를 계산할 수 있습니다.
요약하면 UI에 필요한 모든 데이터를 바인딩하기 위해이 비싼 쿼리는 약 5-6 번 호출해야합니다.
이렇게 비싼 쿼리를 한 번 계산할 수있는 방법에 대해 생각해보기 시작했습니다. 이후의 각 호출은 어떻게 든 캐시 된 결과 집합을 가져올 수 있습니다.
CacheID (Guid)를 Nullable 매개 변수로 사용하는 저장 프로 시저로 쿼리를 추상화하려는 생각이 들기 시작했습니다.
이 sproc은 cacheID를 사용하여이 특정 결과 집합을 고유하게 식별하는 캐시 테이블에 결과 집합을 삽입합니다.
이 결과 집합에서 작동해야하는 sprocs는 이전 쿼리의 cacheID를 전달할 수 있으며 cacheID에 단일 WHERE 절을 사용하여 데이터를 검색하는 간단한 SELECT 문입니다.
그런 다음 정기적 인 SQL 작업을 사용하여 캐시 테이블을 비 웁니다.
위의 코드는 훌륭하게 작동하며 제로로드 테스트에서 속도가 향상됩니다. 그러나이 기술을 사용하면 대량의 읽기 및 쓰기 캐시 테이블로드 문제가 발생할 수 있습니다.
짧은 이야기가 짧다. 나는 미친가요? 또는 이것은 좋은 생각입니다.
분명히 나는 lock contention과 index fragmentation에 대해 걱정할 필요가있다.
그런 다음 수천 개의 결과를 다시 앱으로 파이프해야합니까? – FlySwat
이 데이터에 대해 많은 SQL 연산을 수행하고 결과를 앱으로 전송합니다. 따라서 앱에 캐싱하는 것은 비생산적입니다. – FlySwat
@FlySwat, 나는 이것을 위해 중개자를 소개하는 것이 가치가 있다고 생각합니다. 중간에 서비스를 제공하면 사람들이 장시간 실행되는 보고서를 실행할 때마다 DB를 적합하게 보내지 않으려 고합니다. 스로틀 및 DB에 부담을 덜어 db –