SQL パフォーマンスを向上させる 5 つの方法
この記事は、MSDN 記事「SQL パフォーマンスを向上させる 5 つの方法」から抜粋したもので、SQL Server ベースのアプリケーションの動作効率を向上させる方法を提案しています。トラフィックの多い一部のアプリケーション システムでは、SQL 命令をどのように改善および改善するかが非常に重要であり、優れたブレークスルー ポイントとなります。
※この記事には主に以下の内容が含まれています(ご興味がございましたら、以下のURLに直接アクセスして中国語と英語の全文をお読みください):
1. INSERTからIDENTITYを返す
SELECT @@IDENTITY
2、埋め込みビューおよび一時テーブル
一時テーブル – tempdb の一時テーブルにより、クエリで負荷の高い I/O 操作やディスク アクセスが実行される可能性があり、一時テーブルは大量のリソースを消費する可能性があります。
インライン ビュー - 一時テーブルの代わりにインライン ビューを使用します。インライン ビューは、FROM 句で結合できる単なるクエリです。データを他のクエリに結合する必要があるだけの場合は、インライン ビューを使用してリソースを節約してみてください。
3. LEFT JOIN と NULL を避ける
LEFT JOIN には NULL (存在しない) データと一致するデータが含まれるため、非常にリソースを消費します。場合によってはこれは避けられませんが、コストが非常に高くなる可能性があります。 LEFT JOIN は INNER JOIN よりも多くのリソースを消費するため、LEFT JOIN を使用しないようにクエリを書き直すことができれば、非常に良い報酬が得られます。
LEFT JOIN を使用するクエリを高速化する手法の 1 つは、TABLE データ型を作成し、最初のテーブル (LEFT JOIN の左側のテーブル) にすべての行を挿入してから、その値で TABLE データ型を更新することです。 2番目のテーブル。この手法は 2 段階のプロセスですが、標準の LEFT JOIN と比較して時間を大幅に節約できます。アプリケーションにとって最適なパフォーマンスを発揮するクエリが得られるまで、さまざまな手法を試し、それぞれに必要な時間を記録することをお勧めします。
DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
4、デカルト積の柔軟な使用
このテクニックについて詳しく説明し、場合によってはデカルト積の使用を推奨します。何らかの理由で、デカルト積 (CROSS JOIN) は多くの批判を受けており、開発者はそれらをまったく使用しないよう警告されることがよくあります。多くの場合、効率的に使用するには多すぎるリソースが消費されます。ただし、SQL の他のツールと同様、正しく使用すれば価値があります。
コード例の 1 つは、従う価値があります。
-- デカルト積は、すべての月のすべての顧客を返します。デカルト積は基本的に、最初のテーブルと 2 番目のテーブルを乗算し、最初のテーブルの行数と 2 番目のテーブルの行数を乗算した行のセットを生成します。したがって、デカルト積は 12 (すべての月) * 81 (すべての顧客) = 972 行をテーブル @tblFinal に返します。最後の手順では、この日付範囲の各顧客の月次売上合計を使用して @tblFinal テーブルを更新し、最終的な行セットを選択します。
DECLARE @tblMonths TABLE (sMonth VARCHAR(7))
DECLARE @tblCustomers TABLE (CustomerID CHAR(10),
CompanyName VARCHAR(50)、
連絡先名 VARCHAR(50))
DECLARE @tblFinal TABLE (sMonth VARCHAR(7),
顧客ID CHAR(10)、
CompanyName VARCHAR(50)、
連絡先名 VARCHAR(50)、
m売上金)
@dtStartDate DATETIME を宣言します。
@dtEndDate日時、
@dtDate日時、
@i INTEGER
SET @dtEndDate = '5/5/1997'
SET @dtEndDate = DATEADD(DD, -1, CAST(CAST((MONTH(@dtEndDate) + 1) AS
VARCHAR(2)) + '/01/' + CAST(YEAR(@dtEndDate) AS VARCHAR(4)) + ' 23:59:59' AS DATETIME))
SET @dtStartDate = DATEADD(MM, -1 * 12, @dtEndDate)
-- すべての月を最初のテーブルに取得します
SET @i = 0
WHILE (@i < 12)
始める
SET @dtDate = DATEADD(mm, -1 * @i, @dtEndDate)
INSERT INTO @tblMonths SELECT CAST(YEAR(@dtDate) AS VARCHAR(4)) + '-' +
場合
WHEN MONTH(@dtDate) < 10
THEN '0' + CAST(MONTH(@dtDate) AS VARCHAR(2))
ELSE CAST(MONTH(@dtDate) AS VARCHAR(2))
今月終了
SET @i = @i + 1
END
-- その期間中に売上があったすべてのクライアントを「y」テーブルに取得します。
@tblCustomers に挿入
個別の選択
c.顧客ID、
c.会社名、
c.連絡先名
お客様から c
INNER JOIN 注文 o ON c.CustomerID = o.CustomerID
WHERE o.OrderDate BETWEEN @dtStartDate と @dtEndDate
INSERT INTO @tblFinal
m.s月を選択し、
c.顧客ID、
c.会社名、
c.連絡先名、
0
@tblMonths から m クロス結合 @tblCustomers c
@tblFinal SET を更新
mSales = mydata.mSales
FROM @tblFinal f 内部結合
(
SELECT c.顧客ID、
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
MONTH(o.OrderDate) < 10 の場合
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
今月終了、
SUM(od.Quantity * od.UnitPrice) AS mSales
お客様から c
INNER JOIN 注文 o ON c.CustomerID = o.CustomerID
INNER JOIN [注文詳細] od ON o.OrderID = od.OrderID
WHERE o.OrderDate BETWEEN @dtStartDate と @dtEndDate
グループ化
c.顧客ID、
CAST(YEAR(o.OrderDate) AS VARCHAR(4)) + '-' +
MONTH(o.OrderDate) < 10 の場合
THEN '0' + CAST(MONTH(o.OrderDate) AS VARCHAR(2))
ELSE CAST(MONTH(o.OrderDate) AS VARCHAR(2))
終わり
) f.CustomerID の mydata = mydata.CustomerID AND f.sMonth =
mydata.sMonth
f.sMonthを選択し、
f.顧客ID、
f.会社名、
f.連絡先名、
f.mセールス
FROM @tblFinal
注文方法
f.会社名、
f.s月
5. 足りない部分を拾い、足りない部分を補います。
SQL クエリの効率を向上させるのに役立つその他の一般的なテクニックをいくつか紹介します。すべての営業担当者を地域別にグループ化し、その売上を小計したいが、データベース内でアクティブとしてマークされている営業担当者のみが必要だとします。 HAVING 句を使用して営業担当者を地域ごとにグループ化し、アクティブでない営業担当者を除外するか、WHERE 句でこれを行うことができます。これを WHERE 句で実行すると、グループ化する必要がある行の数が減るため、HAVING 句で実行するよりも効率的です。 HAVING 句の行条件に基づいてフィルタリングすると、WHERE 句で削除されるデータをクエリで強制的にグループ化します。
もう 1 つの効率化のヒントは、GROUP BY 句を使用する代わりに、DISTINCT キーワードを使用してデータ行の個別のレポートを検索することです。この場合、DISTINCT キーワードを使用した SQL の方が効率的です。 GROUP BY は、集計関数 (SUM、COUNT、MAX など) を計算する必要がある場合にのみ使用してください。また、クエリが常にそれ自体で一意の行を返す場合は、DISTINCT キーワードを使用しないでください。この場合、DISTINCT キーワードはシステム オーバーヘッドを追加するだけです。
-------------------
中国語の URL:
http://www.microsoft.com/china/MSDN/library/data/sqlserver/FiveWaystoRevupYourSQLPerformanCE.mspx
英語の URL:
http://msdn.microsoft.com/msdnmag/issues/02/07/DataPoints/