ストアドプロシージャが遅いので、私はいくつかのストアドプロシージャをvb.net linq(SQLからlinq ....に手動)にしています。linqはスレッドをブロックしますか?
私は同時スレッドでlinqクエリを使用しています。
パフォーマンス分析を実行した後、私はlinqがクエリ時にソースコレクション(cache.IPMS_TBL_EL_PRICE_COMPONENTのようなコード期間)をロックするように見えます。
本当ですか? linqの(not_lock/lock)オプションはありますか? 私は本当にコレクションをロックしたくありません。マルチスレッドクエリが遅くなります。
ありがとうございました。
コード期間:
がhttp://imgur.com/Z9vsRで参照するか、あなたは、クエリが熱心に(そこに、次に)を評価する原因となるToList
を呼び出している
insert0 = (From PPC In cache.IPMS_TBL_EL_PRODUCT_PRICE_COMPONENT_MAPPING
From PC In cache.IPMS_TBL_EL_PRICE_COMPONENT
Join LK In cache.IPMS_TBL_LOOKUP
On PC.Component_Type_Id Equals LK.Lookup_Id
Where (PC.Component_Id = PPC.Component_Id OrElse PC.Component_Type_Id = CC3_ID) _
AndAlso LK.Commodity_Id = ELE_COMMODITY_ID _
AndAlso LK.Lookup_Type.ToLower = PRICE_COMPONENT_TYPE.ToLower _
AndAlso PPC.Product_Id = IN_PRODUCT_ID _
AndAlso PPC.Price_Type_Id = IN_PRICE_TYPE_ID _
AndAlso PC.Is_Deleted = 0 _
AndAlso LK.Lookup_Id > MINUS_HUNDRED _
AndAlso PC.Component_Id > MINUS_HUNDRED _
AndAlso lookupValues.Contains(LK.Lookup_Value.ToLower) _
AndAlso (Not PC.ISO_Id.HasValue OrElse Not deletedISO.Contains(PC.ISO_Id.Value))
Select New PriceComponents() With {.ComponentID = PC.Component_Id,
.ComponentName = PC.Component_Name,
.ComponentTypeID = PC.Component_Type_Id,
.ComponentTypeName = LK.Lookup_Value,
.Sequence = PC.Sequence,
.OrderSequence = orderSequeceDict(LK.Lookup_Value.ToLower),
.IsMTM = PC.Is_MTM,
.UcapUsageFactorUnitPrice = PC.UCAP_Usage_Factor_UnitPrice,
.Percentage = PERCENTAGE}
).OrderBy(Function(e As PriceComponents) e.OrderSequence).ThenBy(Function(e As PriceComponents) e.Sequence) _
.Distinct(New PriceComponentsComparer_PK_9_Fields).ToList
'cache'がLINQ to SQLデータコンテキストの場合、スレッド間で共有されるべきではありません。 –
ここでちょっとバックアップしましょう...なぜストアドプロシージャが遅いのか分かりましたか?それはL2Sに変換する珍しい理由です。 LINQクエリがストアドプロシージャを実行しますか? –
問合せ中にブロック(非遅延、同期実行)またはロックされたもの(マルチスレッド使用の防止)に関する質問はありますか?これらは非常に異なるものです。 –