2016-08-16 34 views
0

我有LINQ的簡單的SQL更新查詢需要永遠

生成的SQL查詢
exec sp_executesql N'update [dbo].[VStat] 
set [VStatName] = @0, [VStatEnum] = @1, [VStatDownload] = @2, [VStatUpdateTime] = @3, [VStatShowInReport] = @4, [VStatShowInFleetReport] = @5, [VStatShowInMonitoringReport] = @6, [VStatShowInMobileApp] = @7 
where ([VStatId] = @8) 
',N'@0 nvarchar(50),@1 decimal(18,0),@2 bit,@3 datetime2(7),@4 bit,@5 bit,@6 bit,@7 bit,@8 uniqueidentifier',@0=N'Actif',@1=1,@2=1,@3='2016-08-16 12:39:01.4753654',@4=1,@5=1,@6=1,@7=1,@8='3A124BBA-6ECB-46A8-8932-06D24E55E3B9' 

查詢是非常簡單的,但是當我運行它,它永遠不會結束。所以我不能看執行計劃。桌子也很簡單。基本上所有的列都顯示在查詢中。

該表有三個指標:

  • IX_VStat(羣集) - 爲nvarchar(50)
  • IX_VStat_VStatShowInReport(非唯一,非聚集)
  • PX_VStat(獨特的,非羣集) - uniqueidentifier

我找到了修復查詢的方法,但不知道它是如何工作的,以及它是否正確

我禁用索引IX_VStat(集羣),然後重建它。之後,查詢開始工作得很快。

當我禁用索引IX_VStat(羣集),我得到警告的孔一堆:

警告:對視圖「InsObservView」 引用表「VSTAT」聚簇索引「IX_InsObservId」被停用的禁用 索引'IX_VStat'的結果。

警告:視圖'InsObservView'上的索引'IX_InsId'被禁用,因爲在視圖上禁用聚簇索引的結果爲 。

警告:索引上視圖 「InsObservView」「IX_InsFlId_ShowInReport_InsEndTime_TyId」被停用禁用視圖上的聚集 指數的結果。

警告:索引上視圖 「InsObservView」「IX_InsLocId_ShowInReport_InsEndTime_TyId」被停用禁用視圖上的聚集 指數的結果。

警告:索引上視圖 「InsObservView」「IX_VFlId_ShowInReport_InsEndTime_TyId」被停用禁用視圖上的聚集 指數的結果。

警告:索引上視圖 「InsObservView」「IX_VLocId_ShowInReport_InsEndTime_TyId」被停用禁用視圖上的聚集 指數的結果。

警告:對視圖「TyLifeReport」引用 表「VSTAT」聚簇索引「IX_Index」被停用禁止索引 「IX_VStat」的結果。

警告:視圖聚簇索引「IX_Index」「tc_support_V」引用 表「VSTAT」被停用禁止索引 「IX_VStat」的結果。

警告:視圖'tc_support_V'上的索引'IX_FlId_Stat'被禁用爲在視圖上禁用聚簇索引的 結果。

警告:視圖'tc_support_V'上的索引'IX_LocId_VId'被禁用爲在視圖上禁用聚簇索引的 結果。

警告:視圖聚簇索引「IX_Index」「MinTrDepView」引用 表「VSTAT」被停用禁止索引 「IX_VStat」的結果。

警告:視圖'MinTrDepView'上的索引'IX_InsFlId_InsDate'爲 ,因禁用視圖上的聚集索引而被禁用。

警告:視圖'MinTrDepView'上的索引'IX_InsId_TrDep'被禁用,因爲在視圖上禁用聚簇索引的結果爲 。

......這裏還有一打。

所以這個表有很多關係。其中大部分來自意見。

請諮詢幫助)

+2

請提供EST與觸發器執行計劃和視圖定義重新組織索引 – Devart

回答

0

可能是你應該重新設計你的數據庫,並使用surrogated(INT,bigin或唯一標識符)主鍵,而不是爲nvarchar(50)?所以,所有的外鍵都會引用這個鍵,並且字符串值的索引總是比較慢。您可以在nvarchar(50)字段中添加非聚簇索引。

同時添加維護任務,如果你有很多表,或多或少大的流量排在它