2013-11-26 5 views
1

Я занимаюсь поисковой системой, которая получает список поставщиков и идентификаторов бренда. Они входят в строки и преобразуются в таблицу с UDF. Каждый бренд имеет идентификатор поставщика.Более эффективный способ избежать ошибок

Поэтому, чтобы ограничить поиск маркой и поставщиками, выбранными пользователем, мне нужно заполнить временные таблицы этими значениями, а затем ПРИСОЕДИНИТЬ их к моим результатам поиска. Теперь пользователь может выбрать целого поставщика для поиска, а затем выбрать бренды у другого поставщика differnet. Это должен быть сценарий заказа, поэтому в дополнение к заполнению списка поставщиков iwth идентификаторы поставщика, переданные в параметр, я также должен получить идентификатор поставщика от марки, в которую они входят, и загрузить их также.

Существует также код авторизационного кода, который я удалил, но это в основном то, что я делаю.

INSERT INTO #TempBrandList (Brand_ID, Brand_Owner) 
SELECT gID, brands.brandowner FROM dbo.f_ConvertGuidList_to_Table(@brandList) JOIN brands ON TempBrandList.Brand_ID=brands.brandid 

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT gID FROM dbo.f_ConvertGuidList_to_Table(@supplierList) 

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT DISTINCT Brand_Owner FROM #TempBrandList WHERE Brand_OWNER NOT IN (SELECT Supplier_ID FROM #TempSupplierList) 

Я обеспокоен тем, что NOT IN не вызовет проблем и не очень эффективен. Было бы лучше иметь 2 таблицы #temp, просто вставить в нее прямую вставку, а затем сделать вторую вставку DISTINCT ко второй, присоединив вторую к основному поисковому коду, чтобы ограничить результаты?

+1

Я бы не стал беспокоиться о проблеме с производительностью, пока у вас ее не будет. WHERE NOT IN довольно эффективно. – Paparazzi

ответ

3

Для последнего заявления я бы использовать NOT EXISTS вместо NOT IN таким образом:

INSERT INTO #TempSupplierList (Supplier_ID) 
SELECT DISTINCT x.Brand_Owner 
FROM #TempBrandList x 
WHERE NOT EXISTS 
(
    SELECT * FROM #TempSupplierList y 
    WHERE x.Brand_OWNER = y.Supplier_ID 
) 

Почему?

1) NOT IN может дать неожиданные результаты:

SELECT 1 WHERE 2 NOT IN(SELECT 3 UNION ALL SELECT NULL)

против

SELECT 1 WHERE NOT EXISTS(SELECT * FROM (SELECT 3 UNION ALL SELECT NULL) x(y) WHERE x.y = 2)

Результаты:

2) По соображениям производительности. Пожалуйста, прочтите это article.

Примечание: вы должны выполнить некоторые тесты, чтобы убедиться, что это лучший вариант для вас.

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