2013-10-04 25 views
-2

嗨,我正在使用SQL Server 2008.在我的數據庫中有一個表,名爲MemberBusiness。我想從該表中獲取數據。在更短的時間內從表中獲取數據

這是我的存儲過程

SELECT BrokerId , 
      RankId , 
      MemberId , 
      InstallmentId , 
      PlanId , 
      IntroducerId , 
      Date , 
      SelfAmount , 
      UnitAmount , 
      SpotAmount , 
      ORBPercentageSelf , 
      ORBPercentageUnit , 
      ORBAmountSelf , 
      ORBAmountUnit , 
      IsSelfBusiness , 
      Mode , 
      InstallmentNo , 
      PlanType , 
      PlanName , 
      CompanyId , 
      CscId , 
      Year , 
      CreateDate , 
      ModifideDate 
FROM  dbo.MemberBusiness AS mb 
WHERE  (@CscId = 0 
      OR mb.CscId = @CscId 
     ) 
      AND (@CompanyId = 0 
       OR CompanyId = @CompanyId 
      ) 
      AND BrokerId IN (SELECT bt.BrokerId 
          FROM  #brokerTable AS bt) 
      AND mb.Date >= @StartDate 
      AND mb.Date <= @EndDate 
      AND mb.RankId >= @FromRankId 
      AND mb.RankId <= @ToRankId 

MemberBusiness桌子上有大約16560352個記錄。 SP以上給我1300條記錄,大約需要30秒來執行,這對我來說是不可接受的。我已經使用了索引,但仍需要很長時間才能執行。怎麼能這樣做更快?謝謝。

+0

這是您的SP中唯一的查詢? –

+0

'@CompanyId = 0或者CompanyId = @ CompanyId'等會阻止正確的索引使用,除非你使用'OPTION(RECOMPILE)'。嘗試添加,如果仍然在執行計劃和表定義包括索引後發佈問題。 –

+0

將'in'改爲連接將是一件事情。但首先要做的是在解釋前面加上查詢,它會告訴你它在做什麼。你可以將這個輸出添加到問題中,也許我們可以提出一個或兩個想法。 –

回答

0

一對夫婦建議:

  • 擺脫內心的選擇,而不是使之內連接是這樣的:

    SELECT BrokerId,... FROM dbo.MemberBusiness AS MB JOIN #brokerTable如BT ON bt.BrokerID = mb.BrokerID WHERE [email protected] ...

  • 超過或陳述可能會很慢......可你擺脫他們還是做了工會與各色一nt查詢?

  • 請確保您有一個涵蓋所有你比較喜歡這個列的大單指數:

    CREATE INDEX ON mySearchIndex MemberBusiness(CscId ASC,ASC CompanyID,BrokerId ASC,ASC日期,RankId ASC )

+0

我說你已經創建了INDEX ..但是加入#brokerTable需要更多的時間然後我的查詢。 – Prashant16

-1

可能這些都可以在正確的方向

  1. 幫助使視圖爲您選擇查詢邏輯
  2. 對於您的sp使查詢動態與@searchstring持有您的搜索字符串的動態參數
  3. 嘗試使您的索引像@JerSchneid建議。
+0

@downvoter:這些只是建議思考正確的方向,如果有幫助;爲什麼在這裏downvote? – nrsharma

-2

這是關於調整和可擴展性。

第一條: 用查詢分析器檢查你的陳述並創建索引和統計。不要忘記刪除未使用的索引。嘗試重新排列where子句,以實現數據的最佳訪問。您還可以使用質量檢查爲您創建索引和統計信息。

想想partitioning the table

如果它仍然是緩慢的,請考慮硬件。 找到瓶頸,使用更多的RAM,更大的CPU或CPU,獲得一些SSD,更快的網絡。 嘗試共享羣集中的負載。

+0

thx,爲反對票 - 但提供信息什麼是錯的/你不喜歡!指出用QA等工具找出瓶頸,聽起來不錯。 –

0

你有很多方法來改善您的查詢:

所有的
  • 首先,內部聯接子句鏈接你的#brokerTable,
  • 你需要避免或條款。由於我不是動態SQL的忠實粉絲,因此可以使用下面的showxn這樣的IF語句,
  • 最後,您需要設計CLUSTERED和NONCLUSTEREd的索引,並使用查詢計劃測試影響。

SQL:

IF @CscId = 0 AND @CompanyId = 0 
BEGIN 

    SELECT mb.BrokerId, 
      mb.RankId, 
      mb.MemberId, 
      mb.InstallmentId , 
      mb.PlanId , 
      mb.IntroducerId , 
      mb.Date , 
      mb.SelfAmount , 
      mb.UnitAmount , 
      mb.SpotAmount , 
      mb.ORBPercentageSelf , 
      mb.ORBPercentageUnit , 
      mb.ORBAmountSelf , 
      mb.ORBAmountUnit , 
      mb.IsSelfBusiness , 
      mb.Mode , 
      mb.InstallmentNo , 
      mb.PlanType , 
      mb.PlanName , 
      mb.CompanyId , 
      mb.CscId , 
      mb.Year , 
      mb.CreateDate , 
      mb.ModifideDate 
    FROM dbo.MemberBusiness AS mb 
       INNER JOIN #brokerTable AS bt ON mb.BrokerId = bt.BrokerId 
    WHERE mb.Date >= @StartDate 
      AND mb.Date <= @EndDate 
      AND mb.RankId >= @FromRankId 
      AND mb.RankId <= @ToRankId 

END 
ELSE IF @CscId = 0 AND @CompanyId <> 0 
BEGIN 

    SELECT mb.BrokerId, 
      mb.RankId, 
      mb.MemberId, 
      mb.InstallmentId , 
      mb.PlanId , 
      mb.IntroducerId , 
      mb.Date , 
      mb.SelfAmount , 
      mb.UnitAmount , 
      mb.SpotAmount , 
      mb.ORBPercentageSelf , 
      mb.ORBPercentageUnit , 
      mb.ORBAmountSelf , 
      mb.ORBAmountUnit , 
      mb.IsSelfBusiness , 
      mb.Mode , 
      mb.InstallmentNo , 
      mb.PlanType , 
      mb.PlanName , 
      mb.CompanyId , 
      mb.CscId , 
      mb.Year , 
      mb.CreateDate , 
      mb.ModifideDate 
    FROM dbo.MemberBusiness AS mb 
       INNER JOIN #brokerTable AS bt ON mb.BrokerId = bt.BrokerId 
    WHERE CompanyId = @CompanyId 
      AND mb.Date >= @StartDate 
      AND mb.Date <= @EndDate 
      AND mb.RankId >= @FromRankId 
      AND mb.RankId <= @ToRankId 

END 
ELSE IF @CscId <> 0 AND @CompanyId = 0 
BEGIN 

    ... 

END 
ELSE 
BEGIN 

    ... 

END 

那麼大的一部分,該指標。你至少需要兩個指標: - 一個聚集

CREATE CLUSTERED INDEX [IX_MemberBusiness] 
ON [dbo].[MemberBusiness] 
(
    RankId, 
    Date, 
    CompanyId, 
    CscId, 
    [The real ID of your table] 
) 
  • 一個非聚集

    創建非聚集索引[IX_MemberBusiness_nc] ON [DBO] [MemberBusiness] ( RankId, 日期。 , 公司ID, CscId, [您的表的真實ID] ) INCLUDE ( [中選擇所有字段,除了那些在指數] )

聚集索引必須包括你做範圍查詢的字段(即。日期和RankId)。 非集羣必須包含「峯值」數據字段(即。BrokerId,CompanyId,CscId)。像IDS一樣。

通過在SMSS中使用查詢計劃,通過測試哪些字段在羣集和非羣集中相關,您在索引設計上有一些工作要做。

這TECHNIC幫助我通過3

的因素徹底改善我的項目的表現讓我知道它是否適合你。

相關問題