2016-06-21 13 views
1

まず、私はSQLにとってかなり新しいと思うので、これは愚かな質問のように思えるかもしれません。 このコードでは、パラメータとしてDateを受け取り、それに61分を追加し、その間の値をチェックします。 次に、各列の値を合計し、別の表に格納します。 コードはうまく機能していますが、私が知りたいのは、より良い方法とそれを行う方法がある場合です。(多くの行や繰り返しコードを使用しないで)ヘルプが必要SQLクエリの最適化

ありがとうございます。

alter procedure Contagem 
@date datetime 

as 
begin 
    declare 
    @Sala1 float, 
    @Sala2 float, 
    @Sala3 float, 
    ... 
    @Sala26 float, 
    @Sala27 float, 
    @Sala28 float, 
    @dateplus datetime 

    set @Teste = 1 
    set @dateplus = (select DATEADD(MINUTE,61,@date)) 

    set @Sala1 = (select sum(Sala_1_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 
    set @Sala2 = (select sum(Sala_2_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 
    set @Sala3 = (select sum(Sala_3_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 
    ... 
    set @Sala26 = (select sum(Sala_26_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 
    set @Sala27 = (select sum(Sala_27_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 
    set @Sala28 = (select sum(Sala_28_Energia) from Energia_15min where Time_Stamp between @date and @dateplus) 

    Insert into Custos_hora values (@date,@Sala1,@Sala2,@Sala3,@Sala4,@Sala5,@Sala6,@Sala7,@Sala8,@Sala9,@Sala10,@Sala11,@Sala12,@Sala13,@Sala14,@Sala15,@Sala16,@Sala17,@Sala18,@Sala19,@Sala20,@Sala21,@Sala22,@Sala23,@Sala24,@Sala25,@Sala26,@Sala27,@Sala28) 
end 
+3

正規化を読む必要があります。繰り返す列があるため、作業が非常に難しくなります。同じテーブルを何度も何度も繰り返し実行するのではなく、すべての変数を単一のselectステートメントに設定することで、これをよりうまく実行できるようになります。しかし、本当に最良の選択肢は、このテーブルを正規化されたテーブル構造に完全にリファクタリングすることです。 –

+0

@Dumbrica:あなたが今までに得た最高の答えは、私の意見ではSean Langeのコメントです。 –

+0

もう一つの懸念は、あなたがfloat上でSUMを使用していることです。これは、これらの値に対してある種の精度が必要であることを示しています。 floatデータ型はおおよそのデータ型であり、すべての値を保持することはできません。精度が必要な場合は、代わりに10進数または数値に切り替えることを検討する必要があります。 –

答えて

4

あなたは現在行っているように28回ではなく、1回だけそのテーブルをヒットできます。

INSERT INTO Custos_hora 
SELECT 
SUM(Sala_1_Energia) 
,SUM(Sala_2_Energia) 
,SUM(Sala_3_Energia) 
,SUM(Sala_4_Energia) 

FROM Energia_15min 

WHERE Time_Stamp between @date and @dateplus 

このように挿入するフィールドを宣言することをお勧めします。

INSERT INTO Custos_hora (Field1, Field2, Field3, Field4) 
SELECT 
SUM(Sala_1_Energia) 
,SUM(Sala_2_Energia) 
,SUM(Sala_3_Energia) 
,SUM(Sala_4_Energia) 

FROM Energia_15min 

WHERE Time_Stamp between @date and @dateplus 

また、変数@Testeは何ですか?どこでも使用されているようには見えません。そして、あなたは@dateと宣言しているようではありません。

+0

@testeを無視して、以前はいくつかのことをテストしていましたが、削除するのを忘れていました。 – Dumbrica

+0

あなたの助けをありがとう – Dumbrica

+0

ええ、私たちはすべてテストコードを持っていると確信しています:)これらの回答のいずれかが助けてくれたら、それらをアップアップしてください。また、あなたが受け入れられた答えとして1つをマークすることができれば、それは評価されるでしょう。 –

1

は、あなただけの代わりに、次の操作を行うことができます

Alter Procedure Contagem (@Date DateTime) 
As Begin 
    Insert Custos_hora 
    Select @Date, 
      Sum(Sala_1_Energia), 
      Sum(Sala_2_Energia), 
      Sum(Sala_3_Energia), 
      Sum(Sala_4_Energia), 
      Sum(Sala_5_Energia), 
      Sum(Sala_6_Energia), 
      Sum(Sala_7_Energia), 
      Sum(Sala_8_Energia), 
      Sum(Sala_9_Energia), 
      Sum(Sala_10_Energia), 
      Sum(Sala_11_Energia), 
      Sum(Sala_12_Energia), 
      Sum(Sala_13_Energia), 
      Sum(Sala_14_Energia), 
      Sum(Sala_15_Energia), 
      Sum(Sala_16_Energia), 
      Sum(Sala_17_Energia), 
      Sum(Sala_18_Energia), 
      Sum(Sala_19_Energia), 
      Sum(Sala_20_Energia), 
      Sum(Sala_21_Energia), 
      Sum(Sala_22_Energia), 
      Sum(Sala_23_Energia), 
      Sum(Sala_24_Energia), 
      Sum(Sala_25_Energia), 
      Sum(Sala_26_Energia), 
      Sum(Sala_27_Energia), 
      Sum(Sala_28_Energia) 
    From Energia_15min 
    Where Time_Stamp Between @Date And DateAdd(Minute, 61, @Date) 
End 
1

複数のSELECT文では、複数のテーブルスキャンを行い、ディスクIOやメモリの使用率が増加します。それは単一の選択ステートメントで行うことができます。

alter procedure Contagem 
     @date datetime 

     as 
     begin 


     declare 
     @Sala1 float, 
     @Sala2 float, 
     @Sala3 float, 
     @Sala4 float, 
     @Sala5 float, 
     @Sala6 float, 
     @Sala7 float, 
     @Sala8 float, 
     @Sala9 float, 
     @Sala10 float, 
     @Sala11 float, 
     @Sala12 float, 
     @Sala13 float, 
     @Sala14 float, 
     @Sala15 float, 
     @Sala16 float, 
     @Sala17 float, 
     @Sala18 float, 
     @Sala19 float, 
     @Sala20 float, 
     @Sala21 float, 
     @Sala22 float, 
     @Sala23 float, 
     @Sala24 float, 
     @Sala25 float, 
     @Sala26 float, 
     @Sala27 float, 
     @Sala28 float, 
     @dateplus datetime 

    set @Teste = 1 
    set @dateplus =DATEADD(MINUTE,61,@date)) 

    Insert into Custos_hora 
     select sum(Sala_1_Energia), 
     sum(Sala_2_Energia), 
     sum(Sala_3_Energia), 
     sum(Sala_4_Energia), 
     sum(Sala_5_Energia), 
     sum(Sala_6_Energia), 
     sum(Sala_7_Energia), 
     sum(Sala_8_Energia), 
     sum(Sala_9_Energia), 
     sum(Sala_10_Energia), 
     sum(Sala_11_Energia), 
     sum(Sala_12_Energia), 
     sum(Sala_13_Energia), 
     sum(Sala_14_Energia), 
     sum(Sala_15_Energia), 
     sum(Sala_16_Energia), 
     sum(Sala_17_Energia), 
     sum(Sala_18_Energia), 
     sum(Sala_19_Energia), 
     sum(Sala_20_Energia), 
     sum(Sala_21_Energia), 
     sum(Sala_22_Energia), 
     sum(Sala_23_Energia), 
     sum(Sala_24_Energia), 
     sum(Sala_25_Energia), 
     sum(Sala_26_Energia), 
     sum(Sala_27_Energia), 
     sum(Sala_28_Energia) from Energia_15min where Time_Stamp between @date and @dateplus 
     end