2014-10-31 125 views
2

我有這樣的sql,但它會在sqlserver中運行17秒。
100位用戶登錄我的網站以在剛纔(80%cpu使用率)的同一時間執行此sql,並且沒關係,但它明天將超過1000位用戶。 那麼,我的問題是:
1:如何優化這個sql?
2:100個用戶80%的CPU使用率,如果1000個用戶會發生什麼?緩慢運行的sql查詢

SET TRANSACTION ISOLATION LEVEL REPEATABLE READ; 
BEGIN TRANSACTION; 
WITH tempQuestion AS 
(
    SELECT 
    DISTINCT(CASE 
     WHEN qut.IsComplex=1 THEN qf.Id 
     WHEN qut.IsComplex=0 THEN qs.Id END) AS QuestionId, 
    (CASE 
     WHEN qut.IsComplex=1 THEN qf.Content 
     WHEN qut.IsComplex=0 THEN qs.Content END) AS QuestionContent, 
    (CASE 
     WHEN qut.IsComplex=1 THEN qf.Content 
     WHEN qut.IsComplex=0 THEN qs.Content END) AS QuetionContentOri, 
    qut.IsComplex AS IsComplex, 
    qut.Id AS QuestionTemplateId, 
    qut.Name AS QuestionTemplateName, 
    qp.KnowDotCode AS KnowDotCode, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qp.Analysis 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN '' END) AS Analyze, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qp.SuitNumber 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN '' END) AS SuitNumber, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qp.Difficult 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN '' END) AS Difficult, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qp.Levels 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN '' END) AS Levels, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qp.Exposure 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN '' END) AS Exposure, 
--qp.Analysis AS Analyze,--浼氬鑷村鍚堥閲嶅 
    qs.Tag, 
    qc.Name AS QuestionCategoryName, 
    qu.Name AS UnitName, 
    qu.Name AS QuestionUnitName, 
    qu.Id AS UnitId, 
    qp.Fettle, 
    (CASE 
     WHEN qut.IsComplex=1 THEN '' 
     WHEN qut.IsComplex=0 THEN qp.CreatedDateTime END) AS CreatedDateTime, 
    (CASE 
     WHEN qut.IsComplex=1 THEN '' 
     WHEN qut.IsComplex=0 THEN qp.LastUseDateTime END) AS LastUseDateTime, 
    (CASE 
     WHEN qut.IsComplex=1 THEN '' 
     WHEN qut.IsComplex=0 THEN u.Name END) AS CreateName, 
    pqs.Id, 
    pqs.OrderInPaper, 
    pqs.Score as Point, 
    pqs.PaperStrategyId, 
    pqs.QuestionCategoryId, 
    pqs.QuestionUnitId, 
    pqs.KnowDotIds, 
    (CASE 
     WHEN qs.QuestionFaceCode IS NULL THEN qs.Answer 
     WHEN qs.QuestionFaceCode IS NOT NULL THEN('') END) AS CorrectAnswer 
    FROM EL_QuestionBank.QS_QuestionStem AS qs 
    LEFT JOIN EL_QuestionBank.QS_QuestionFace AS qf 
     ON qs.QuestionFaceCode=qf.Id 
    INNER JOIN EL_QuestionBank.QS_QuestionProperty AS qp 
     ON qp.QuestionStemCode=qs.Id 
    LEFT JOIN EL_Organization.[User] AS u 
     ON qp.CreatorCode=u.Id 
    INNER JOIN EL_QuestionBank.QuestionCategory AS qc 
     ON qc.Id = qp.SubjectCode 
    INNER JOIN EL_QuestionBank.QS_QuestionUnit AS qu 
     ON qu.Id = qp.QuestionUnitCode 
    INNER JOIN EL_QuestionBank.QS_QuestionUnitTemplate AS qut 
     ON qut.Id = qu.QuestionUnitTemplateCode 
    INNER JOIN EL_Paper.PaperQuestionStrategy AS pqs 
     ON ((qut.IsComplex=0 AND pqs.QuestionId=qs.Id) OR (qut.IsComplex=1 AND pqs.QuestionId=qf.Id)) 
    WHERE pqs.PaperStrategyId='576222efa335483680e4e2e6e1c3d254' 
) 
SELECT * FROM tempQuestion 
COMMIT TRANSACTION; 
+1

有這麼多列後真的需要不同。 – 2014-10-31 02:18:13

+0

@Pradeep,是的,這確實是需要的。 – 2014-10-31 02:23:24

+0

爲什麼你需要在這裏?查詢執行計劃顯示什麼? – radar 2014-10-31 02:26:50

回答

6

你可以嘗試用

CROSS APPLY (SELECT * FROM EL_Paper.PaperQuestionStrategy pqs1 
      WHERE (qut.IsComplex=0 AND pqs1.QuestionId=qs.Id) 
      UNION ALL 
      SELECT * FROM EL_Paper.PaperQuestionStrategy pqs2 
      (qut.IsComplex=1 AND pqs2.QuestionId=qf.Id) 
      ) AS pqs 

這並不能保證加快步伐更換

INNER JOIN EL_Paper.PaperQuestionStrategy AS pqs 
    ON ((qut.IsComplex=0 AND pqs.QuestionId=qs.Id) OR (qut.IsComplex=1 AND pqs.QuestionId=qf.Id)) 

,但我遇到了,我已經看到在過去的情況下,通過使用UNION ALL替換OR條件,改進了非平凡查詢的性能。如果這可能適合作爲評論,我寧願這樣建議,因爲它不是一個明確的答案。如果你嘗試了,請添加一條評論,告訴它是否幫助,傷害或沒有任何區別。此外,這是我的頭頂,所以一定要測試結果是相同的。

對於將此技術應用於類似情況的人們,請注意,您可能需要使用UNION而不是UNION ALL才能得到與要替換的代碼完全相同的結果。在這種情況下,兩個聯合選擇是互斥的,因爲一個只能包含IsComplex=0的行,而另一個只能包含IsComplex=1的行,所以UNION ALL工作正常。 UNION ALL通常會比UNION更快,但您無法單獨根據性能標準進行選擇。你必須選擇能夠產生你期望結果的那個。

+0

好吧,讓我試試看,@hatchet – 2014-10-31 02:52:17

+0

超級好,它只需要1秒。 @hatchet – 2014-10-31 03:01:12

+0

@MINJILU - 太棒了!很高興這有幫助。 – hatchet 2014-10-31 03:02:18