Ho provato una possibile soluzione. Prima di questa soluzione, anche la query non restituiva risultati e causava errori di timeout della connessione.
La mia query stava avendo il filtro della data e altri criteri.Tutti gli altri criteri erano come la ricerca. Una parola chiave di colonna stava cercando come '% abc%' sulla colonna ntext e stava facendo una scansione completa della tabella.
Soluzione:
interrogazione Divide in 2 parti. 1) Prima parte in CTE (Common Table Express) 2) Applicare tutti i criteri di ricerca su CTE.
WITH SearchData(Column1,Column2,Column3,Column4,........)
AS
(
SELECT Column1,Column2,Column3,Column4,...........
FROM myTable1 WITH(NOLOCK)
INNER JOIN MyTable2 WITH(NOLOCK)
ON MyTable1.id = MyTable2.Id
WHERE (MyTable1.CreationTime >= '2014-04-27' AND MyTable1.CreationTime <= '2014-05-01')
)
SELECT DISTINCT top 250 Column1,Column2,Column3,Column4
FROM SearchData
WHERE (ISNULL(Column1,'') LIKE @Column1 +'%' OR @Column1 IS NULL)
and (Column2 LIKE @Column2+ '%' OR @Column2 IS NULL)
...
...
...
...
AND (Column10 like '%'[email protected]+'%' or @Column10 IS NULL)
AND @[email protected][email protected][email protected] <> ''
ORDER BY [CreationTime] DESC
Ha funzionato per me.
è possibile usa un indice, con un po 'di lavoro, quando fai LIKE'% '+ string, vedi il link nel mio altro commento. –
@KM: trucco interessante, una colonna invertita. Anche una buona analogia con la rubrica telefonica rende chiaramente chiaro il caso. –
bel trucco, per obad non c'è nulla di simile per il problema del tipo '% text%'. – HLGEM