Ini adalah pemilihan sederhana dari tabel sementara, kiri bergabung dengan tabel yang ada pada kunci utama, dengan dua sub memilih menggunakan top 1 merujuk tabel bergabung.
Dalam kode:
SELECT
TempTable.Col1,
TempTable.Col2,
TempTable.Col3,
JoinedTable.Col1,
JoinedTable.Col2,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeColumn = JoinedTable.SomeColumn
) as ThirdTableColumn1,
(
SELECT TOP 1
ThirdTable.Col1 -- Which is also ThirdTable's Primary Key
FROM
ThirdTable
WHERE
ThirdTable.SomeOtherColumn = JoinedTable.SomeColumn
) as ThirdTableColumn2,
FROM
#TempTable as TempTable
LEFT JOIN
JoinedTable
ON (TempTable.PKColumn1 = JoinedTable.PKColumn1 AND
TempTable.PKColumn2 = JoinedTable.PKColumn2)
WHERE
JoinedTable.WhereColumn IN (1, 3)
Ini adalah replika persis dari kueri saya.
Jika saya menghapus dua sub seleksi, itu berjalan dengan baik dan cepat. Dengan dua sub pilihan, saya mendapatkan sekitar 100 catatan per detik, yang sangat lambat untuk kueri ini karena harus mengembalikan hampir satu juta catatan.
Saya telah memeriksa untuk melihat apakah setiap tabel memiliki Kunci Utama, semuanya memiliki. Mereka semua memiliki Indeks DAN statistik untuk kolom penting mereka, seperti yang ada di klausa WHERE itu, dan yang ada di klausa GABUNG. Satu-satunya tabel tanpa kunci primer yang ditentukan atau indeks adalah tabel sementara, tetapi itu bukan masalah juga karena itu bukan yang terkait dengan subseleksi yang lambat, dan seperti yang saya sebutkan, tanpa sub seleksi itu berjalan dengan baik.
Tanpa yang TOP 1
mengembalikan lebih dari satu hasil, dan menimbulkan kesalahan.
Tolong, tolong siapa?
EDIT :
Jadi rencana eksekusi memberitahuku bahwa aku kehilangan Indeks. Saya telah membuatnya, dan menciptakan kembali beberapa indeks lainnya. Setelah beberapa saat, rencana eksekusi menggunakannya, dan permintaan sekarang berjalan cepat. Satu-satunya masalah adalah saya tidak berhasil melakukan ini lagi di server lain, untuk permintaan yang sama. Jadi solusi saya akan ke PETUNJUK indeks SQL Server yang akan digunakan.