C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

SQLServer での処理方法について

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■95330 / inTopicNo.1)  SQLServer での処理方法について
  
□投稿者/ ファイター (15回)-(2020/07/16(Thu) 16:25:18)

分類:[.NET 全般] 

以下のようにテストプログラムを作ってみたのですが、
本番ではデータ数が多く時間がすごくかかりました。
時間のかからない方法ってありますか?

DECLARE @TBL1 TABLE (
 MDATE DATETIME,
 MNAME VARCHAR(10)
)

INSERT INTO @TBL1
SELECT '2020-07-02 00:00:00.000', 'N-1'
UNION SELECT '2020-07-03 00:00:00.000', 'N-2'

DECLARE @TBL2 TABLE (
 MNAME VARCHAR(10),
 RNUM INT
)

INSERT INTO @TBL2
SELECT 'N-1', 6
UNION SELECT 'N-2', 7

DECLARE @TBL3 TABLE (
 MDATE DATETIME
)

--土日祝を除く日付(カレンダー)
INSERT INTO @TBL3
SELECT '2020-07-01'
UNION SELECT '2020-07-02'
UNION SELECT '2020-07-05'
UNION SELECT '2020-07-06'
UNION SELECT '2020-07-07'
UNION SELECT '2020-07-08'
UNION SELECT '2020-07-09'
UNION SELECT '2020-07-10'
UNION SELECT '2020-07-13'

SELECT *
FROM (
 SELECT  TBL1.MDATE, TBL1.MNAME, TBL2.RNUM, TBL3.MDATE AS GETDAT, ROW_NUMBER() OVER(PARTITION BY TBL1.MNAME ORDER BY TBL3.MDATE) AS RNO
 FROM  @TBL1 AS TBL1
 LEFT  OUTER JOIN (
     SELECT *
     FROM @TBL2
     ) AS TBL2
     ON TBL2.MNAME = TBL1.MNAME
 LEFT  OUTER JOIN (
 SELECT *
 FROM @TBL3
 ) AS TBL3
 ON TBL3.MDATE > TBL1.MDATE
 ) AS TBL
WHERE RNUM = TBL.RNO



引用返信 編集キー/
■95346 / inTopicNo.2)  Re[1]: SQLServer での処理方法について
□投稿者/ 大谷刑部 (90回)-(2020/07/17(Fri) 11:00:07)
No95330 (ファイター さん) に返信
> 以下のようにテストプログラムを作ってみたのですが、
> 本番ではデータ数が多く時間がすごくかかりました。
> 時間のかからない方法ってありますか?
>
> DECLARE @TBL1 TABLE (
>  MDATE DATETIME,
>  MNAME VARCHAR(10)
> )
>
> INSERT INTO @TBL1
> SELECT '2020-07-02 00:00:00.000', 'N-1'
> UNION SELECT '2020-07-03 00:00:00.000', 'N-2'
>
> DECLARE @TBL2 TABLE (
>  MNAME VARCHAR(10),
>  RNUM INT
> )
>
> INSERT INTO @TBL2
> SELECT 'N-1', 6
> UNION SELECT 'N-2', 7
>
> DECLARE @TBL3 TABLE (
>  MDATE DATETIME
> )
>
> --土日祝を除く日付(カレンダー)
> INSERT INTO @TBL3
> SELECT '2020-07-01'
> UNION SELECT '2020-07-02'
> UNION SELECT '2020-07-05'
> UNION SELECT '2020-07-06'
> UNION SELECT '2020-07-07'
> UNION SELECT '2020-07-08'
> UNION SELECT '2020-07-09'
> UNION SELECT '2020-07-10'
> UNION SELECT '2020-07-13'
>
> SELECT *
> FROM (
>  SELECT  TBL1.MDATE, TBL1.MNAME, TBL2.RNUM, TBL3.MDATE AS GETDAT, ROW_NUMBER() OVER(PARTITION BY TBL1.MNAME ORDER BY TBL3.MDATE) AS RNO
>  FROM  @TBL1 AS TBL1
>  LEFT  OUTER JOIN (
>      SELECT *
>      FROM @TBL2
>      ) AS TBL2
>      ON TBL2.MNAME = TBL1.MNAME
>  LEFT  OUTER JOIN (
>  SELECT *
>  FROM @TBL3
>  ) AS TBL3
>  ON TBL3.MDATE > TBL1.MDATE
>  ) AS TBL
> WHERE RNUM = TBL.RNO


どこがボトルネックか各SQL毎の計測をした上で対応はした方が良いですが、
とりあえず、重複が考えづらいなら、UNIONをUNION ALLにしてみてはどうですか?

引用返信 編集キー/
■95347 / inTopicNo.3)  Re[1]: SQLServer での処理方法について
□投稿者/ 魔界の仮面弁士 (2783回)-(2020/07/17(Fri) 11:30:20)
No95330 (ファイター さん) に返信
> 本番ではデータ数が多く時間がすごくかかりました。
> 時間のかからない方法ってありますか?

INSERT 時間の問題なのか、その後のクエリーの問題なのか分かりませんが、
データ件数が多くて前者に時間がかかるなら、BULK INSERT を試してみるとか。
https://qiita.com/tkani/items/48624a52da526b18bb4f
引用返信 編集キー/
■95351 / inTopicNo.4)  Re[2]: SQLServer での処理方法について
□投稿者/ くまくま (23回)-(2020/07/17(Fri) 14:55:25)
No95347 (魔界の仮面弁士 さん) に返信
> ■No95330 (ファイター さん) に返信
>>本番ではデータ数が多く時間がすごくかかりました。
>>時間のかからない方法ってありますか?
>
> INSERT 時間の問題なのか、その後のクエリーの問題なのか分かりませんが、
> データ件数が多くて前者に時間がかかるなら、BULK INSERT を試してみるとか。
> https://qiita.com/tkani/items/48624a52da526b18bb4f

ライブ クエリ統計
https://docs.microsoft.com/ja-jp/sql/relational-databases/performance/live-query-statistics?view=sql-server-ver15
こちらでクエリがどのように実行されているか確認できますよ。
あと「SELECT *」はできるだけやめた方が今後の為にも良いかと
引用返信 編集キー/

このトピックをツリーで一括表示


トピック内ページ移動 / << 0 >>

このトピックに書きこむ