2011-12-09 4 views
0

검색은 우리 웹 사이트에서 가장 많이 사용되는 기능이며 검색 쿼리는 db에서 실행되는 CPU 사용량이 많고 복잡하며 빈번한 쿼리이므로 db 서버에서 과도한 CPU 사용이 발생합니다. db의 부하를 줄이기 위해 다양한 캐싱 전략을 검토했습니다. 지금은 ASP.NET 캐시를 사용하려고합니다.asp.net에서 Linq를 사용하여 캐시 쿼리

아이디어는 캐시에서 가장 자주/최근에 생성되거나 액세스 된 객체의 메모리 내장 DB를 가지고 linq을 사용하여 메모리 내 db를 검색하여 검색 결과를 얻는 것입니다. 내 생각은 사용자의 목록을 캐시 한 다음 linq을 사용하여이 목록을 쿼리하거나 수정하는 것이 었습니다. 그러나 List를 수정하거나 액세스하려고 시도하는 여러 스레드의 복잡성 때문에 다른 옵션이 필요했습니다.

목록을 캐싱하는 대신 개별 사용자 개체를 해당 ID를 키로 캐시하고 캐시를 시도하고 쿼리 한 것으로 생각됩니다. http://msdn.microsoft.com/en-us/library/system.web.caching.cache.aspx에서 캐시 확장 메서드 AsQueryable을 볼 수 있지만이게 무슨 뜻인지 모르겠습니다. 캐시는 키 값 쌍이므로 AsQueryable을 사용하여 키를 쿼리하고 사용자 개체 집합을 가져 오거나 사용자 개체를 쿼리하고 원하는 결과를 얻을 수 있습니까?

답변

0

아니요, 아니요, 사용자 개체를 쿼리하고 내가 원하는 결과를 얻기 위해 AsQueryable을 사용할 수 없습니다. 이제는 정적 목록을 사용하여 당분간은 나중에 알기보다는 빨리 변경해야한다는 것을 알고 있습니다.

1

시작하기 전에 주변에 약간의 측정 가능성이 있어야합니다. 판단을 내릴 좋은 견고한 데이터가 없어도 변경 사항이 도움이되거나 상처를받지 않으면 알아낼 수있는 방법이 없습니다. 성능, 특히 규모의 성능은 생각하거나 추측 할 수있는 것이 아닙니다. 당신은 그것을 통해 자신의 길을 알아야합니다.

해결책에 관해서는 문제를 악화 시키거나 최소한 다른 문제를 만들 수 있다고 생각합니다. 데이터베이스 서버는 이론적으로 방대한 정보 집합에서 임의의 사용자 쿼리를 효율적으로 처리하도록 설계되었습니다. Linq는 정말 멋지지만 애드혹 검색 엔진은 아닙니다. 검색 엔진에서 실제로 기대할 수있는 색인 기능은 없습니다. IQueryable로 노출 될 수 있다고해서 그것이 그런 식으로 다루어야한다는 것을 의미하지는 않습니다. 캐시를 효율적으로 검색 할 수있는 방법이 있어도 과거에 얻을 또 다른 문제가 있습니다. 가장 자주 사용되는 것을 어떻게 식별합니까? 그리고 메모리가 부족 해지면 ASP.NET 캐시가 물건을 꺼내기 시작하지 않도록 어떻게 관리합니까?

당신은 아마 더 나은에 의해 여기에 제공 될 것입니다 :

  • 이 좋은 구식 데이터베이스 튜닝을 시작으로 - 왜 쿼리가 너무 느리고 비싸다? 어딘가에서 색인이 누락 되었습니까?
  • 결과 페이지 출력을 캐싱 할 때 특히 검색 URL을 가져올 수있어 관리하기가 쉽습니다. 사이트가 녹아있는 경우 이는 매우 좋은 단기 솔루션입니다.
  • 검색 비트를 올바르게 작성하십시오. LIKE %를 사용하여 적절한 검색이 아닌 %을 (를) 사용합니다. 데이터베이스의 전체 텍스트 인덱스는 좋은 시작입니다. lucene.net과 같은 것이 더 좋습니다.
+0

텍스트 검색이 아닙니다. 실제로 검색은 기본적으로 여러 개의 조인과 일부 사용자 정의 함수를 사용하여 쿼리를 느리게 만드는 쿼리입니다. 나는 Linq 접근 방식이 적어도 지금은 올바른 접근 방식이라고 생각합니다. 어쨌든 제안 해 주셔서 감사합니다. – shashi

관련 문제