이 쿼리가 실행되는 상자는 데이터 센터에서 실행되는 전용 서버입니다.53 초가 걸리는 250k 행에 대한 쿼리
RAM 윈도우 서버 2008의 x64의 AMD 옵테론 1354 쿼드 코어 2.20GHz 2기가바이트 (네,이 프로젝트가 라이브가되면 내가 8 기가 바이트 업그레이드하는거야, 난 단지 2GB의 RAM을 알고).
그래서 나는 LINQ to SQL이 생성하는 몇 가지 쿼리를 테스트하고 그들이 끔찍한 것이 아니며 그 중 하나가 터무니없는 시간을 보냈다는 것을 확인하기 위해 테이블에 250,000 개의 더미 행을 만들었습니다.
색인을 사용하여 17 초 동안이 쿼리를했는데 처음부터 끝까지이 대답을 위해이 쿼리를 제거했습니다. 인덱스 만 기본 키입니다.
Stories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[UserID] [int] NOT NULL,
[CategoryID] [int] NOT NULL,
[VoteCount] [int] NOT NULL,
[CommentCount] [int] NOT NULL,
[Title] [nvarchar](96) NOT NULL,
[Description] [nvarchar](1024) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[UniqueName] [nvarchar](96) NOT NULL,
[Url] [nvarchar](512) NOT NULL,
[LastActivityAt] [datetime] NOT NULL,
Categories table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[ShortName] [nvarchar](8) NOT NULL,
[Name] [nvarchar](64) NOT NULL,
Users table --
[ID] [int] IDENTITY(1,1) NOT NULL,
[Username] [nvarchar](32) NOT NULL,
[Password] [nvarchar](64) NOT NULL,
[Email] [nvarchar](320) NOT NULL,
[CreatedAt] [datetime] NOT NULL,
[LastActivityAt] [datetime] NOT NULL,
현재 데이터베이스에는 사용자 1 명과 카테고리 25 만개가 있으며이 쿼리를 실행하려고했습니다.
SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
INNER JOIN Users ON Users.ID = Stories.UserID
ORDER BY Stories.LastActivityAt
질의, CPU 사용량 2 ~ 3 %로 가져갈 실행 52초 소요 Membery는 1.1GB, 900메가바이트 무료이지만 디스크의 사용은 통제 불능 보인다. @ 100MB/sec이고 2/3은 tempdb.mdf에 쓰고 나머지는 tempdb.mdf에서 읽습니다. 이러한 쿼리의 흥미로운 부분에 대한 지금
...SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
INNER JOIN Users ON Users.ID = Stories.UserID
SELECT TOP(10) *
FROM Stories
INNER JOIN Users ON Users.ID = Stories.UserID
ORDER BY Stories.LastActivityAt
SELECT TOP(10) *
FROM Stories
INNER JOIN Categories ON Categories.ID = Stories.CategoryID
ORDER BY Stories.LastActivityAt
모든 3 거의 즉시 있습니다.
첫 번째 쿼리의 실행 계획입니다.
http://i43.tinypic.com/xp6gi1.png
다른 3 개의 쿼리에 대한 실행 계획 (순서대로).
http://i43.tinypic.com/33ue7fb.png
어떤 도움 http://i43.tinypic.com/30124bp.png
http://i44.tinypic.com/13yjml1.png
이 많이 주시면 감사하겠습니다.
인덱스 추가 후 실행 계획 (최대 17 초).
http://i39.tinypic.com/2008ytx.png
많은 도움이되는 의견을 보내 주신 모든 분들께 감사 드리며, 새로운 각도로 시도해 보았습니다. 내가 필요한 이야기를 쿼리 한 다음 별도의 쿼리를 통해 범주와 사용자를 얻고 3 가지 쿼리만으로도 250ms 만 소요되었습니다 ... 문제는 이해할 수 없지만 작동한다면 250ms 이하로 당분간은 그걸로 붙어있어. 이것을 테스트 할 때 사용한 코드는 다음과 같습니다.
DBDataContext db = new DBDataContext();
Console.ReadLine();
Stopwatch sw = Stopwatch.StartNew();
var stories = db.Stories.OrderBy(s => s.LastActivityAt).Take(10).ToList();
var storyIDs = stories.Select(c => c.ID);
var categories = db.Categories.Where(c => storyIDs.Contains(c.ID)).ToList();
var users = db.Users.Where(u => storyIDs.Contains(u.ID)).ToList();
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
당신이 실행 계획을 게시 할 것을 제안합니다 ... –
당신의 tempDB는 어디에 있습니까? 그것은 별도의 물리적 스핀들에 있습니까? –
데이터, 로그 파일은 어디에 있습니까? 별도의 물리적 드라이브에 있습니까? –