Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Выборка из view - ошибка 8622  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
Добрый день,
Следующая проблема, имеется view где для соединения таблиц прописан хинт HASH (без него никак не удается добится нормальной скорости).
Обычная выборка без условий работает без проблем, если же добавить определённую колонку, то тут же ругается -
Lookup Error - SQL Server Database Error: Query processor could not produce a query plan because of the hints defined in this query. Resubmit the query without specifying any hints and without using SET FORCEPLAN.

То есть - select * from view1 - нормально, select * from view1 where col1 = 1 - ошибка. При том если в where другие условия поставить - будет работать. Т.е. именно вот одна колонка не нравится и всё тут

Что можно сделать и почему такое поведение?


Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)
Apr 2 2010 15:48:46
Copyright (c) Microsoft Corporation
Enterprise Edition (64-bit) on Windows NT 6.1 <X64> (Build 7601: Service Pack 1)
20 мар 13, 16:18    [14072970]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
автор
Microsoft SQL Server 2008 R2 (RTM) - 10.50.1600.1 (X64)


Для начала довести сервер до последнего SP хотя бы.
20 мар 13, 16:20    [14072986]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
Гость333
Member

Откуда:
Сообщений: 3683
xxxxnnnn
Что можно сделать

Создать аналогичное представление view2, где не будет хинта HASH. Использовать это представление в запросе "select * from view2 where col1 = 1".


xxxxnnnn
и почему такое поведение?

Причина написана в тексте ошибки. Не всегда можно построить план запроса с использованием HASH, например в запросе "select * from t1 join t2 on t2.id > t1.id" это не удастся.

Покажите текст представления, что ли.
20 мар 13, 16:23    [14073006]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
Гость333,

в самом простом варианте -
create view test_view as 
SELECT DISTINCT 
                      daily.CompanyId, daily.ServerId, t1.RefId, t1.AccountId
FROM         dbo.__Periods AS daily inner hash JOIN
                      Accountant.dbo.RefAssignedAccounts AS t1 ON daily.CompanyId = t1.CompanyID AND daily.ServerId = t1.ServerId 



При
select * from test_view where CompanyId = 1 and ServerId = 1
ошибка, при только одном условии - работает
20 мар 13, 16:33    [14073085]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
как-нибудь так обмануть:
select * from test_view where CompanyId = 1 and ServerId in (1, -1)

ну, предполагая, что -1 в ServerId заведомо быть не может.
или уж для гарантии:
select * from test_view where CompanyId = 1 and (ServerId = 1 or abs(ServerId) < 0)


будет ли только после этого толк в смысле "добитЬся нормальной скорости".
20 мар 13, 17:11    [14073384]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Или в представлении заменить "daily.CompanyId = t1.CompanyID" на "daily.CompanyId+0 = t1.CompanyID+0". Опять же, про скорость такого решения ничего не скажу.
20 мар 13, 17:16    [14073414]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
Гость333
Member

Откуда:
Сообщений: 3683
Ах да, причина ошибки, как я понял — это то, что оптимизатор хочет сделать index seek по условию "CompanyId = 1 and ServerId = 1" одной таблице, index seek с такими же условиями по другой таблице, а полученные результаты объединить через cross join, т.е. без каких-либо дополнительных условий. Понятно, что для cross join'а возможна только стратегия соединения loop, но не hash или merge (понятно ведь, да? :-). Таким образом, для обмана оптимизатора нужно сделать так, чтобы он не смог воспользоваться cross join'ом.
20 мар 13, 17:33    [14073517]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
а, кстати, можно не заменить, а добавить:

ON daily.CompanyId = t1.CompanyID AND daily.ServerId = t1.ServerId and daily.ServerId + 0 = t1.ServerId + 0


тогда, вроде, и поиск по обоим столбцам сохраняется.
20 мар 13, 17:53    [14073623]     Ответить | Цитировать Сообщить модератору
 Re: Выборка из view - ошибка 8622  [new]
xxxxnnnn
Member

Откуда: Минск
Сообщений: 76
Гость333, daw
Большое спасибо вам, господа! Оба решения работают и по скорости всё нормально тоже.
20 мар 13, 17:59    [14073659]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить