2

毎秒非常に多くのデータを返し、グリッドに表示される SP があります。現在、帯域幅を削減しようとしており、グリッドに現在表示されている列のみを返すことを考えています。

これはもちろん単純化され最小化されていますが、基本的に私が持っていたのは次の SP でした。

SELECT
[Animals].[AnimalID] AS [AnimalID],
[Animals].[name] AS [AnimalName],
[Foods].[DisplayName] AS [Food],
[Animals].[Age] AS [AnimalAge],
[Animals].[AmountOfFood] AS [AmountOfFood]

私が現在試みているのは、現在グリッドに表示されているフィールド (@fields) の名前の TVP を渡し、必要なフィールドのみを返すことです。

SELECT
[Animals].[AnimalID] AS [AnimalID],
[Animals].[name] AS [AnimalName],
CASE 
    WHEN ('Food' in (select * from @fields)) 
    THEN [Foods].[DisplayName] 
END AS [Food],
CASE 
    WHEN ('AnimalAge' in (select * from @fields)) 
    THEN [Animals].[Age] 
END AS [AnimalAge],
CASE 
    WHEN ('AmountOfFood' in (select * from @fields)) 
    THEN [Animals].[AmountOfFood] 
END AS [AmountOfFood]

私が直面している問題は、(予想どおり)SPが〜200ミリ秒から〜1秒かかることです

これを書き直して、私たちを殺さないようにする方法はありますか?

foreach のための私の王国!!!

4

2 に答える 2

1

SQL Server では、動的 SQL を使用してこれを行うこともできます。何かのようなもの:

declare @sql nvarchar(max);

select @sql = (select ', '+
                      (case when FieldName = 'Food' then 'Foods.DisplayName'
                            when FieldName = 'AnimalAge' then 'Animals.Age'
                         . . .
                       end)
               from @fields
               for xml path ('')
              );

select @sql = 'select [Animals].[AnimalID] AS [AnimalID], [Animals].[name] AS [AnimalName]'+@sql+RESTOFQUERY;

exec(@sql);
于 2013-01-31T14:28:57.390 に答える
1

ストアド プロシージャをテーブル値関数に変換して、グリッドから必要な列のみを選択するようにします。

したがって、関数は引き続き選択します

SELECT
[Animals].[AnimalID] AS [AnimalID],
[Animals].[name] AS [AnimalName],
[Foods].[DisplayName] AS [Food],
[Animals].[Age] AS [AnimalAge],
[Animals].[AmountOfFood] AS [AmountOfFood]

クライアントがたとえば のみを選択した場合select * AnimalID, Age from myfunction(..)、これらの列のみがクライアントに転送されます。

于 2013-01-31T14:19:30.460 に答える