Microsoft SQL Server
クエリのヒント
サーチ…
JOINのヒント
2つのテーブルを結合すると、SQL Serverクエリオプティマイザ(QO)はクエリで使用されるさまざまな種類の結合を選択できます。
- ハッシュ結合
- ループ結合
- MERGE結合
QOは計画を探索し、テーブルを結合するための最適な演算子を選択します。ただし、最適な結合演算子がわかっている場合は、どのようなJOINを使用するかを指定できます。インナーループ結合により、QOは2つのテーブルを結合する際にネストループ結合を選択します。
select top 100 *
from Sales.Orders o
inner loop join Sales.OrderLines ol
on o.OrderID = ol.OrderID
内部マージ結合はMERGE結合演算子を強制します:
select top 100 *
from Sales.Orders o
inner merge join Sales.OrderLines ol
on o.OrderID = ol.OrderID
内側のハッシュジョインは強制的にハッシュジョイン演算子になります:
select top 100 *
from Sales.Orders o
inner hash join Sales.OrderLines ol
on o.OrderID = ol.OrderID
ヒント集
GROUP BY句を使用すると、SQL Serverクエリオプティマイザ(QO)は異なるタイプのグループ化演算子を選択できます。
- HASHエントリをグループ化するためのハッシュマップを作成する集計
- あらかじめ入力された入力とうまく連携するストリーム集約
最適となるものが分かっている場合は、QOが1つまたは別の集約演算子を選択するよう明示的に要求できます。 OPTION(ORDER GROUP)を使用すると、QOは常にStream集約を選択し、入力がソートされていない場合はStream集約の前にSort演算子を追加します。
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (ORDER GROUP)
OPTION(ハッシュグループ)では、QOは常にハッシュ集約を選択します:
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (HASH GROUP)
FAST行のヒント
最初のnumber_rowsの高速取得のためにクエリが最適化されることを指定します。これは非負の整数です。最初のnumber_rowsが返された後、クエリは実行を継続し、完全な結果セットを生成します。
select OrderID, AVG(Quantity)
from Sales.OrderLines
group by OrderID
OPTION (FAST 20)
UNIONヒント
2つのクエリ結果でUNION演算子を使用すると、クエリオプティマイザ(QO)は次の演算子を使用して2つの結果セットの和集合を作成できます。
- マージ(連合)
- コンカット(連合)
- ハッシュマッチ(ユニオン)
OPTION()ヒントを使用して、どの演算子を使用するかを明示的に指定できます。
select OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Sales.Orders
where OrderDate > DATEADD(day, -1, getdate())
UNION
select PurchaseOrderID as OrderID, OrderDate, ExpectedDeliveryDate, Comments
from Purchasing.PurchaseOrders
where OrderDate > DATEADD(day, -1, getdate())
OPTION(HASH UNION)
-- or OPTION(CONCAT UNION)
-- or OPTION(MERGE UNION)
MAXDOPオプション
このオプションを指定するクエリの最大並列度を指定します。
SELECT OrderID,
AVG(Quantity)
FROM Sales.OrderLines
GROUP BY OrderID
OPTION (MAXDOP 2);
このオプションは、sp_configureおよびResource GovernorのMAXDOP構成オプションよりも優先されます。 MAXDOPがゼロに設定されている場合、サーバーは最大並列度を選択します。
INDEXヒント
インデックスヒントは、SQL Serverのクエリオプティマイザが最適なインデックスと見なすものを選択するのではなく、クエリで特定のインデックスを使用するように強制します。場合によっては、クエリで使用するインデックスを指定することでメリットが得られます。通常、SQL Serverのクエリオプティマイザはクエリに適した最適なインデックスを選択しますが、失われた統計情報や特定のニーズがあるため、強制的に実行することができます。
SELECT *
FROM mytable WITH (INDEX (ix_date))
WHERE field1 > 0
AND CreationDate > '20170101'