È una selezione semplice da una tabella temporanea, a cui si aggiunge una tabella esistente sulla sua chiave primaria, con due sotto-selezioni che utilizzano la prima 1 che fa riferimento alla tabella unita.
Nel codice:
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)
Questa è una replica esatta della mia domanda.
Se rimuovo i due sottoselezioni, funziona perfettamente e rapidamente. Con i due sub-selezioni, ottengo circa 100 record al secondo, il che è estremamente lento per questa query perché dovrebbe restituire quasi un milione di record.
Ho controllato per vedere se ogni tabella ha una chiave primaria, lo fanno tutti. Tutti hanno indici e statistiche per le loro colonne importanti, come quelli nelle clausole WHERE e quelli nella clausola JOIN. L'unica tabella senza chiave primaria definita né indice è la tabella temporanea, ma non è nemmeno il problema perché non è quella relativa alle selezioni secondarie lente e, come ho già detto, senza le selezioni secondarie funziona alla perfezione.
Senza quelli TOP 1
restituisce più di un risultato e genera un errore.
Aiuto qualcuno?
MODIFICA :
Quindi il piano di esecuzione mi ha detto che mi mancava un indice. L'ho creato e ricreato alcuni degli altri indici. Dopo un po ', il piano di esecuzione li utilizzava e la query ora viene eseguita rapidamente. L'unico problema è che non riesco a farlo di nuovo su un altro server, per la stessa query. Quindi la mia soluzione sarà quella di SUGGERIMENTO quale indice verrà utilizzato da SQL Server.