Saya menggunakan MS SQL, dan saya harus menjalankan beberapa pertanyaan pada tabel yang sama dengan kriteria yang berbeda. Pada awalnya saya menjalankan setiap permintaan pada tabel asli meskipun mereka semua berbagi beberapa pemfilteran (yaitu Tanggal, status). Ini memakan banyak waktu (sekitar 2 menit).
Ada duplikat dalam baris data, dan semua indeks TIDAK BERKELAS. Saya hanya tertarik pada 4 kolom untuk kriteria saya dan hasilnya akan menampilkan hitungan saja, untuk semua pertanyaan.
kolom yang diperlukan: TABLE
, FIELD
, AFTER
, DATE
, dan ada indeks pada masing-masing DATE
dan TABLE
.
Setelah membuat tabel temp dengan hanya bidang yang saya butuhkan, turun menjadi 1:40 menit, yang masih sangat buruk.
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'
Jalankan ini -> (216598 baris terpengaruh)
Karena tidak semua kueri mengandalkan rentang tanggal, saya tidak memasukkannya dalam kueri. Masalahnya adalah hanya butuh di atas 1 menit untuk memasukkan saja . Sisipan di atas memakan waktu 1:19 menit
Saya ingin menjalankan sesuatu seperti ini untuk beberapa pertanyaan:
SELECT COUNT(*) AS COUNT
FROM #TEMP
WHERE AFTER = 'R' AND
DATE >= '2014-01-01' AND
DATE <= '2015-01-01'
Ini masalah dengan penyisipan lebih dari seleksi, tetapi temp memiliki baris jauh lebih sedikit daripada tabel asli yang bisa lebih baik daripada melalui tabel beberapa kali.
Bagaimana saya bisa mengoptimalkan ini?
EDIT
Saya telah menghapus ID pengurutan, saya pikir masalahnya terutama dengan memilih dan tidak memasukkan. Itu hanya dugaan.
Saya tidak dapat membuat unik pada indeks apa pun karena tidak ada bidang atau baris yang unik.
Saya menggunakan SQL Server 2012.
Info Tabel : Ini tumpukan dan memiliki penggunaan ruang berikut:
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'
, mengapa Anda tidak mencoba mengoptimalkan masing-masing (kueri) secara terpisah? Apakah Anda tidak diizinkan menambahkan indeks ke tabel?
TABLE
dan FIELD
dari #temp
tabel (semua baris memiliki TABLE = 'OTB' AND FIELD = 'STATUS'
untuk tabel temp spesifik setelah semua.)
CREATE TABLE
pernyataan). Pemungutan suara turun karena pertanyaannya tidak jelas.