2013-06-11 3 views
0

У меня есть две таблицы Table1 и Table2 где мне нужно найти все строки, которая удовлетворяет условию Fuzzy_Qgram (приблизительно оптимизация согласования) между Table1.LastName и Table2.LastNameЕсть ли альтернатива перекрестное соединение в TSQL

Вот мой запрос:

Select * from Table1 
Cross Join 
Table2 
Where Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5 

в этом запросе Каждая строка в Table1 будет умножается с каждой строкой в ​​Table2 в и строки, которые удовлетворяют Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5, будут возвращены.

Исполнение запроса очень медленно, так как у меня есть более чем 300 000 строк в Table1 и 3000 строк в Table2

Есть ли альтернатива Cross Join для таких запросов для более эффективного и быстрого оптимизации?

+0

Ваш fn скалярный, и я ожидал бы проблемы там. Не могли бы вы переместить «нечеткую» логику, например? Крест применяется? – OzrenTkalcecKrznaric

+0

Нет, 'Table2' - это * вид *, а не таблица. Извините, ошибка ввода. – user42995

+0

@Ozren Tkalčec Krznarić: Да, он возвращает скалярное значение, на которое я применяю условие – user42995

ответ

0

Выполняет ли порядок параметров функцию? Я имею в виду, когда вы запускаете следующий запрос, гарантированно ли вы получите те же результаты?

Select Fuzzy_Qgram('Washington','Obama') 
Select Fuzzy_Qgram('Obama','Washington') 

Если это так, то не должно быть никаких причин, чтобы проверить его в обоих направлениях, так что вы можете изменить ваш запрос:

Select * 
from Table1 
     Inner join Table2 
     On Table.LastName <= Table2.LastName 
Where Fuzzy_Qgram(Table1.LastName,Table2.LastName)> =1.5 

Конечно, я понятия не имею, что делает Fuzzy_Qgram, поэтому вы захотите тщательно проверить это. Если это правильно, это, вероятно, сократит время выполнения примерно на 1/2.

0

Чтобы сократить длинный рассказ короткий.

SELECT * 
FROM 
Table1 t1 
JOIN Table2 t2 
    ON 1=1 
CROSS APPLY (
    SELECT 
    fuzzy_qgram = t1.someColumnOf_t1 + t2.someColumnOf_t2 
) ext 
WHERE ext.fuzzy_qgram >= 1.5 

Конечно, вы должны заменить t1.someColumnOf_t1 + t2.someColumnOf_t2 с fuzzy_qgram логикой. Используйте это, и есть шанс, что вы увидите значительное ускорение.

Смежные вопросы