Mam wymóg wyszukiwania kilku różnych tabel w mojej bazie danych SQL Server. I muszę posortować wyniki na podstawie, w której tabeli wystąpił mecz.Optymalizacja wyszukiwania pełnotekstowego w wielu tabelach
Podejście, które podjąłem, przedstawiono poniżej. Jednak nie wydaje się to bardzo skuteczne, ponieważ ilość danych rośnie.
Czy ktoś może sugerować jakieś sztuczki, aby to zoptymalizować?
-- Full-text query
DECLARE @FtsQuery nvarchar(100)
SET @FtsQuery = 'FORMSOF(INFLECTIONAL, detail)'
-- Maximum characters in description column
DECLARE @MaxDescription int
SET @MaxDescription = 250
SELECT 1 AS RankGroup, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) AS Description FROM Table1
INNER JOIN CONTAINSTABLE(Table1, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table1.Id
UNION SELECT 2, FTS.Rank, Id, Title, NULL FROM Table2
INNER JOIN CONTAINSTABLE(Table2, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table2.Id
UNION SELECT 3, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table3
INNER JOIN CONTAINSTABLE(Table3, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table3.Id
UNION SELECT 4, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table4
INNER JOIN CONTAINSTABLE(Table4, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table4.Id
UNION SELECT 5, FTS.Rank, Id, Title, LEFT([Description], @MaxDescription) FROM Table5
INNER JOIN CONTAINSTABLE(Table5, *, @FtsQuery) AS FTS ON FTS.[KEY] = Table5.Id
ORDER BY RankGroup, Rank DESC
Jedną z rozważanych przeze mnie idei jest utworzenie widoku indeksowanego, a następnie wykonanie wyszukiwania w widoku. Ale ponieważ widok wymagałby tych UNION
s, trudno jest zobaczyć, jak byłoby to bardziej wydajne.
Jedną z prostych optymalizacji, którą można bezpiecznie wykonać, jest zastąpienie "UNION" słowem "UNION ALL". Aby uzyskać więcej informacji: http://stackoverflow.com/questions/49925/what-is-the-difference-between-union-and-union-all – niaher