-1

C#アプリケーションからSQLServer2008でストアドプロシージャを実行しようとしています。時間がかかり、アプリケーションが「応答しません」。私のストアドプロシージャ:

ALTER PROCEDURE [dbo].[PROC066]
@date_1 date,
@date_2 date
AS
SELECT
RTRIM(tt1.[Org]) as 'Org', 
RTRIM(tt1.[CustomerHQ]) as 'Customer',
RTRIM(tt1.[Customer]) as 'ShipTo', 
RTRIM(tt1.[Date]) as 'Date', 
RTRIM(tt2.Clean) as 'Clean', 
RTRIM(tt1.[PO number]) as 'PONumber',
RTRIM(tt1.[GCAS]) as 'GCAS',
'Description' = (SELECT DISTINCT [Description] FROM tDeploymentDB WHERE tDeploymentDB.[Item Code] = tt1.[GCAS]),
RTRIM(tt1.NQTY) as 'NQTY',
RTRIM(tt1.[Dummy]) as 'Dummy', 
RTRIM(tt1.[MOQ]) as 'MOQ', 
RTRIM(tt1.[Inactive]) as 'Inactive', 
RTRIM(tt1.[Allocation]) as 'Allocation', 
RTRIM(tt1.[MultiSector]) as 'MultiSector',
RTRIM(tt2.Pallet_Checked) as 'FullPallets',
RTRIM(tt2.FullTruck_Checked) as 'Full_Truck',
FROM tCleanOrderTracking_prod as tt1, tCleanOrderTracking_HDR_prod as tt2
WHERE 
SUBSTRING(RTRIM(tt1.[PO number]), 6, LEN(RTRIM(tt1.[PO number])) - 5) = 
RTRIM(tt2.CustomerOrderNumber) AND 
tt1.[Date] = @date_1 AND tt1.[Date] <= @date_2
ORDER BY Org, [PO Number]

SQL Server Management Studioでこの手順を実行しようとすると、5〜7秒かかります。しかし、C#ではこのクエリを実行できません。クエリでこの行を削除しようとしました

tt1.[Date] = @date_1 AND tt1.[Date] <= @date_2

その後、正常に動作します。アプリケーションの実行には5秒かかります。また、私はこの行を書き直そうとしていました

tt1.[Date] BETWEEN @date_1 AND @date_2

検索結果はありません!クエリtCleanOrderTracking_prodのメインテーブルには、約40500レコードがあります。他に何を試すことができますか?私が間違っているのは何ですか?

4

3 に答える 3

3

SQL Serverの実行プランの読み方をご覧ください。独自のSQLクエリを分析し、速度と実行パフォーマンスを向上させる方法が示されます。

クエリに対してこれを実行し、インデックスの追加や結合の変更などができるように、クエリがどのように実行されているかを確認します。

このTrim関数は計算コストの高い関数でもあり、行からの選択だけでなく、処理コマンドでもあります。40,000で実行すると、かなりの打撃を受ける可能性があります。必要な列でのみ実行することを検討し、時間を選択せず​​にI​​NSERT時間中に実行してください(その後、100万回ではなく1回実行します;))。

于 2012-07-24T10:20:57.267 に答える
3

選択クエリからトリム関数を削除することを検討する必要があります。これを行うには、SQLServer側で多くの労力が必要です。代わりに、値を挿入する前に値をトリミングする必要があります。

于 2012-07-24T10:22:13.073 に答える
1

実行中は最初にすべての行に関数を適用し、次にwhere条件を実行した後、パフォーマンスに影響を与えるため、where条件からトリム関数を削除します。

于 2012-07-24T10:26:57.410 に答える