MS SQL kullanıyorum ve farklı ölçütlerde aynı tabloda birkaç sorgu çalıştırmak zorunda. İlk başta, tüm filtreleri (yani Tarih, durum) paylaşmasına rağmen orijinal tablodaki her bir sorguyu çalıştırdım. Bu çok zaman aldı (yaklaşık 2 dakika).
Veri satırlarında kopyalar var ve tüm dizinler CLUSTERED değil. Ölçütlerim için yalnızca 4 sütunla ilgileniyorum ve sonuç tüm sayılar için yalnızca sayım çıktısı almalıdır.
sütunlar gerekli: TABLE
, FIELD
, AFTER
, DATE
, ve her biri üzerinde bir indeks var DATE
ve TABLE
.
Sadece ihtiyacım olan alanları içeren bir geçici tablo oluşturduktan sonra, 1:40 dakikaya indi, bu hala çok kötü.
CREATE TABLE #TEMP
(
TABLE VARCHAR(30) NULL,
FIELD VARCHAR(30) NULL,
AFTER VARCHAR(1000) NULL,
DATE DATETIME,
SORT_ID INT IDENTITY(1,1)
)
CREATE CLUSTERED INDEX IX_ADT ON #TEMP(SORT_ID)
INSERT INTO #TEMP (TABLE, FIELD, AFTER, DATE)
SELECT TABLE, FIELD, AFTER, DATE
FROM mytbl WITH (NOLOCK)
WHERE TABLE = 'OTB' AND
FIELD = 'STATUS'
Bunu çalıştır -> (etkilenen 216598 satır)
Tüm sorgular tarih aralığına bağlı olmadığından, sorguya dahil etmedim. Sorun, yalnızca yerleştirmenin 1 dakikadan fazla sürmesi . Yukarıdaki insert 1:19 dakika sürdü
Birkaç sorgu için böyle bir şey çalıştırmak istiyorum:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Seçimden daha fazla ekleme ile ilgili bir sorun var, ancak temp, orijinal tablodan daha az satır içeriyor ve bu da tablodan birkaç kez daha iyi olabilir.
Bunu nasıl optimize edebilirim?
DÜZENLE
Sıralama kimliğini kaldırdım, sorunun esas olarak seçim ve ekleme ile olmadığını düşündüm. Bir tahmindi.
Benzersiz bir alan veya satır olmadığından herhangi bir dizin üzerinde benzersiz oluşturamıyorum.
SQL Server 2012 kullanıyorum.
Tablo Bilgisi : Bu bir yığın ve aşağıdaki alan kullanımına sahiptir:
name rows reserved data index_size unused
mytbl 24869658 9204568 KB 3017952 KB 5816232 KB 370384 KB
SELECT COUNT(*) AS COUNT FROM original_table WHERE AFTER = 'R' AND DATE >= '2014-01-01' AND DATE < '2015-01-01'
, neden her bir (sorguyu) ayrı ayrı optimize etmeye çalışmıyorsunuz? Tabloya dizin eklemenize izin verilmiyor mu?
TABLE
ve FIELD
sütunlarını #temp
tablodan kaldırabilirsiniz (sonuçta tüm satırlar TABLE = 'OTB' AND FIELD = 'STATUS'
belirli geçici tablo için geçerlidir.)
CREATE TABLE
ifade). Aşağı oy, sorunun net olmamasıydı.