Ben hedefi tüm kullanmaktır SQL Server 2012'de iki sorgu kıyaslıyorum ilgili en iyi sorgu seçerken sorgu en iyi duruma gelen bilgilerle. Her iki sorgu da aynı sonuçları üretir; tüm müşteriler için maksimum sipariş.
Tampon havuzunun temizlenmesi, her sorgu FREEPROCCACHE ve DROPCLEANBUFFERS ile yürütülmeden önce yapıldı
Aşağıda verilen bilgileri kullanarak, hangi sorgu daha iyi bir seçimdir?
-- Query 1 - return the maximum order id for a customer
SELECT orderid, custid
FROM Sales.Orders AS O1
WHERE orderid = (SELECT MAX(O2.orderid)
FROM Sales.Orders AS O2
WHERE O2.custid = O1.custid);
-- Query 2 - return the maximum order id for a customer
SELECT MAX(orderid), custid
FROM Sales.Orders AS O1
group by custid
order by custid
İSTATİSTİK ZAMAN
Sorgu 1 İSTATİSTİK ZAMANI: CPU süresi = 0 ms, geçen süre = 24 ms
Sorgu 2 İSTATİSTİK ZAMANI: CPU süresi = 0 ms, geçen süre = 23 ms
İSTATİSTİK IO
Sorgu 1 İSTATİSTİK IO: Tablo 'Siparişler'. Tarama sayısı 1, mantıksal okumalar 5, fiziksel okumalar 2, ileri okumalar 0, lob mantıksal okumalar 0, lob fiziksel okumalar 0, lob okuma öncesinde okumalar 0.
Sorgu 2 İSTATİSTİK IO: Tablo 'Siparişler'. Tarama sayısı 1, mantıksal okumalar 4, fiziksel okumalar 1, okuma öncesi okumalar 8, lob mantıksal okumalar 0, lob fiziksel okumalar 0, lob okuma öncesinde okumalar 0.
Uygulama Planları
SEÇ özellikler Sorgu 1
SEÇ özellikleri Sorgu 2
Sonuç:
Sorgu 1
- Parti maliyeti 48%
- Mantıksal Okumalar 5
- Fiziksel Okumalar 2
- İleri Okuma: 0
- CPU Süresi: 0 ms
- Geçen Süre 24ms
- Tahmini alt ağaç maliyeti: 0.0050276
- CompileCPU: 2
- Derleme Bellek: 384
- Derleme Zamanı: 2
Sorgu 2
- Parti maliyeti 52%
- Mantıksal Okumalar 4
- Fiziksel Okumalar 1
- İleri Okumalar: 8
- CPU Süresi 0
- Geçen Süre 23ms
- Tahmini alt ağaç maliyeti: 0.0054782
- CompileCPU: 0
- Derleme Bellek: 192
- Derleme Zamanı: 0
Şahsen, Sorgu 2, grafik planına göre daha yüksek bir toplu maliyete sahip olsa da, Sorgu 1'den daha etkili olduğunu düşünüyorum. düşürün. okuma-okuma değerleri sorgu 2 için 8 ve sorgu 1 için 0'dır.
Güncelleme 12:03
Kümelenmiş Dizin tanımı
ALTER TABLE [Sales].[Orders] ADD CONSTRAINT [PK_Orders] PRIMARY KEY CLUSTERED
(
[orderid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, IGNORE_DUP_KEY = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO
Kümelenmemiş Dizin idx_nc_custid
CREATE NONCLUSTERED INDEX [idx_nc_custid] ON [Sales].[Orders]
(
[custid] ASC
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, SORT_IN_TEMPDB = OFF, DROP_EXISTING = OFF, ONLINE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
GO