Как оптимизировать декартово произведение - PullRequest
0 голосов
/ 25 февраля 2012

Мне нужно сделать декартово произведение одной таблицы, но без одинаковых строк.Теперь у меня есть:

select * 
From T_Car C1
Join T_Car C2 On C1.CarID <> C2.CarID

Но для таблицы T_Car с 1300 строками это занимает почти 2 минуты.Я попытался использовать OPTION (HASH JOIN) и OPTION (MERGE JOIN), но это привело к ошибке:

Обработчик запросов не смог создать план запроса из-за подсказок, определенных в этом запросе.Повторите запрос, не указывая никаких подсказок и не используя SET FORCEPLAN.

Есть ли возможность оптимизировать этот запрос?

Ответы [ 3 ]

1 голос
/ 25 февраля 2012

Не могли бы вы уточнить, почему?Упомянутый вами запрос не является распространенным (по моему опыту), и он приведет к дорогостоящему плану запросов.Если мы получим лучшее понимание контекста запроса, мы можем использовать другой подход, который приведет к повышению производительности, возможно, запросит хранимую процедуру, которая выполняет несколько шагов для извлечения соответствующих данных, но делает это эффективным способом для каждогоstage.

Хорошим примером для этого (используя ваш сценарий) было бы создание процедуры, которая изолирует соответствующие идентификаторы во временной таблице и затем присоединяет ее (используя «=» вместо «<>») кполучить результаты.

0 голосов
/ 25 февраля 2012

Сколько нужно времени для производства всего декартова произведения с 1 690 000 строк в нем?

Если это разумный промежуток времени, рассмотрите возможность использования оператора MINUS для удаления строк, в которых совпадает первичный ключ. Нечто подобное.

select *  From T_Car C1, T_Car C2 
MINUS
select *  From T_Car C1 Join T_Car C2 On C1.CarID = C2.CarID 

Вполне вероятно, что весь картезианский продукт займет слишком много времени для производства. В любом случае, зачем вам такой результат? Возможно, есть лучший способ смоделировать ваши данные.

0 голосов
/ 25 февраля 2012

Если вы не хотите присоединяться к каждой строке, вы можете использовать INNER JOIN или LEFT JOIN.Внутреннее JOIN возвращает только совпадающую строку, а Left Join возвращает также пустые строки левой таблицы.Правое объединение возвращает также пустые строки правой таблицы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...