SQL最適化講義(2)-正しい重複排除方法を使用する

SQL列

SQLの基本の要約

SQLの高度な知識の概要

SQLの最適化にはあまり興味のない学生が多いので、今後は次の投稿で投稿しますので、興味のある方は引き続きご注目ください。

前回の講義では、DISTINCTを使用して重複行を削除し、クエリの効率を向上させました。これは、友人が通常耳にする最適化の提案とは反対です。DISTINCTの使用はできるだけ少なくしてください。DISTINCTを使用すべきかどうかを見てみましょう。プロセスを見たくない場合は、赤い結論の部分にスキップできます。

1.DISTINCTを使用して重複データを削除します

前の講義の例を繰り返しましょう。


SELECT DISTINCT UnitPrice
FROM [Sales].[SalesOrderDetail]
WHERE UnitPrice>1000;

実行後の結果は次のとおりです。

SQL最適化講義(2)-正しい重複排除方法を使用する

次に、このテーブルのデータを194万に増やしてから、上記の実験を繰り返します。

--将表SalesOrderDetail插入到一张物理表中

SELECT * INTO Sales.Temp_SalesOrder
FROM [Sales].[SalesOrderDetail] ;

--通过新增的物理表进行自循环插入3次,将数据增加到1941072行

DECLARE @i INT;
SET @i=0
WHILE @i<4
BEGIN
--这里没有将SalesOrderDetailID这个自增长的放在列中,是为了让系统自动填充不同的数字进去,保证唯一性。
INSERT INTO Sales.Temp_SalesOrder
(SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,rowguid,ModifiedDate)

SELECT
SalesOrderID,CarrierTrackingNumber,OrderQty,ProductID,SpecialOfferID,
UnitPrice,UnitPriceDiscount,LineTotal,NEWID(),ModifiedDate
FROM Sales.Temp_SalesOrder
SET @i=@i+1;
END;

SELECT COUNT(1) FROM Sales.Temp_SalesOrder;

(ヒント:コードを左右にスライドできます)

SalesOrderDetailIDの自己成長属性をキャンセルした後、独自のデータを1000個挿入します。これにより、1942072レコードと比較して非常に小さい1000個の重複するSalesOrderDetailIDを取得できます。

次の図に示すように、「はい」を「いいえ」に置き換えた後、自己成長フラグを挿入できます。

SQL最適化講義(2)-正しい重複排除方法を使用する


INSERT INTO sales.Temp_Salesorder
SELECT TOP 1000 * FROM sales.Temp_Salesorder;

データを挿入したら、前の講義の内容を繰り返して、データがどのように機能するかを見てみましょう。

A.インデックスがない場合は、UnitPrice列のみをクエリします


SELECT UnitPrice FROM Sales.Temp_SalesOrder ;

実装を見てみましょう:

SQL最適化講義(2)-正しい重複排除方法を使用する

次は奇跡を検証する時です。DISTINCTを追加して、UnitPriceの前に試してみましょう。


SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;

SQL最適化講義(2)-正しい重複排除方法を使用する

以前の実験結果と一致して、分析時間は実行時間に大きな違いがなく、指数関数的に短縮されます。

B. SalesOrderDetailIDが自己成長属性をキャンセルすると、通常の列と同じになります。

上記の手順を繰り返しましょう。


SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder

実行後の結果は次のとおりです。

SQL最適化講義(2)-正しい重複排除方法を使用する

基本的には上記のUnitPriceと同じですが、DISTINCTはありません。

SalesOrderDetailIDにDISTINCTを追加するとどうなりますか?

SELECT DISTINCT  SalesOrderDetailID
FROM sales.Temp_Salesorder

次の実装を見ることができます。

SQL最適化講義(2)-正しい重複排除方法を使用する

上の図からわかるように、DISTINCTは1000レコードを除外していますが、DISTINCTがない場合よりも実行に時間がかかります。

上記の2つの実験を通じて、次のような結論を導き出すことができます。繰り返しの量が比較的多いテーブルでは、DISTINCTを使用するとクエリの効率が効果的に向上し、繰り返しの量が比較的少ないテーブルでは、DISTINCTを使用すると大幅に減少します。クエリの効率。したがって、すべてのDISTINCTが効率を低下させるわけではありません。もちろん、事前にデータ重複の量を判断する必要があります。

2.重複データを削除するためのGROUPBYとDISTINCTの比較

GROUP BYはDISTINCTに似ており、2つのうちどちらがより効率的であるかについてしばしば論争があります。今日は、異なる量の繰り返しデータで2つの効率を比較します。

A.大量の繰り返しデータの場合は、UnitPriceの重複を排除してください

SELECT  DISTINCT  UnitPrice FROM sales.Temp_Salesorder;
SELECT  UnitPrice FROM sales.Temp_Salesorder GROUP BY UnitPrice;

上記の2つのステートメントを一緒に実行すると、結果は次のようになります。

SQL最適化講義(2)-正しい重複排除方法を使用する

2つのステートメントGROUPBYの実行時間は、DISTINCTよりも少し効率的であることがわかります。

B.少量の繰り返しデータの場合は、SalesOrderDetailIDの重複を排除します


SELECT  DISTINCT SalesOrderDetailID FROM sales.Temp_Salesorder
SELECT   SalesOrderDetailID FROM sales.Temp_Salesorder
GROUP BY SalesOrderDetailID

上記の2つのステートメントも同時に実行され、結果は次のようになります。

SQL最適化講義(2)-正しい重複排除方法を使用する
作成者は、上記のステートメントを同時に複数回実行します。繰り返しが多いUnitPriceの場合、GROUP BYの合計処理効率はDISTINCTよりも少し高くなりますが、繰り返しが少ないSalesOrderDetailIDの場合、DISTINCTはGROUPBYよりも高速です。全体をフォローすると、データ量が増えるにつれて、その影響はますます明白になります。

今日のレッスンはここで終わり、友達が試してみることができます。わからない場合は、下にコメントを残して話し合うことができます。

おすすめ

転載: blog.51cto.com/15057820/2656460