Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
Здравствуйте, уважаемые коллеги!

Ситуация: Имею сложный запрос, сам по себе он работает быстро. Результат запроса небольшой по количеству записей. Одна из таблиц (записей порядка миллиона) присоединяется через таблицу вхождений по датам. Когда накладываю условие на эту таблицу, срабатывает оптимизатор, пытающийся для сначала отфильтровать эту таблицу, а потом уже пропустить ее через таблицу вхождений. В результате запрос виснет.

Пробовал накладывать условие на результат, т.е. на подзапрос
Select * From (QueryText) SubQuery WhereClause
, все равно виснет.

Вопрос: как отключить оптимизатор для подобного условия, точнее, как заставить Where срабатывать после получения результирующего набора?

С уважением, VS
22 сен 09, 12:54    [7691930]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Виктор Светлов


Вопрос: как отключить оптимизатор для подобного условия, точнее, как заставить Where срабатывать после получения результирующего набора?

Не надо отключать оптимизатор. Нужно включить мозг и разобрать план выполнения, который выбрал оптимизатор. И понять, почему план именно такой и как его улучшить
22 сен 09, 12:56    [7691948]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
хинтами можно заставить запрос выполняться как вы считаете правильно,но все же Glory прав,нужно понять почему отптимизатор выбрал не оптимальній по вашему усмотрению план
-------------------------------------
Jedem Das Seine
22 сен 09, 12:59    [7691970]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
Уважаемые коллеги, давайте не будем сомневаться в квалификации друг друга.
Вопрос абсолютно конкретно сформулирован в сабже.

to Maxx:
Будь добр, поподробнее про хинты. Я умею использовать только принудительное использование конкретного индекса. В справке про хинты Where я ничего не нашел. Просвети пожалуйста, очень буду благодарен.
22 сен 09, 13:15    [7692073]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Виктор Светлов
Уважаемые коллеги, давайте не будем сомневаться в квалификации друг друга.
Вопрос абсолютно конкретно сформулирован в сабже.

Ага корректно, вы еще спросите, как отключить лог файл
Так вот - оптимизатор отключить невозможно. Порядок вычисления условий в where он определяет сам. И вам эту возможность не предоставляет
22 сен 09, 13:20    [7692114]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
Виктор Светлов
Уважаемые коллеги, давайте не будем сомневаться в квалификации друг друга.
Вопрос абсолютно конкретно сформулирован в сабже.


Давайте, только чтобы не сомневаться, приведите реальные:

1. Структуру таблиц с индексами.
2. Запрос.
3. План его выполнения в текстовом виде.
22 сен 09, 13:20    [7692115]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
http://msdn.microsoft.com/ru-ru/library/ms181714.aspx
22 сен 09, 13:22    [7692126]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Maxx
Member [скрыт]

Откуда:
Сообщений: 24290
Виктор Светлов,
tpg -ответил
22 сен 09, 13:54    [7692397]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
aleks2
Guest
Виктор Светлов
Здравствуйте, уважаемые коллеги!

Ситуация: Имею сложный запрос, сам по себе он работает быстро. Результат запроса небольшой по количеству записей. Одна из таблиц (записей порядка миллиона) присоединяется через таблицу вхождений по датам. Когда накладываю условие на эту таблицу, срабатывает оптимизатор, пытающийся для сначала отфильтровать эту таблицу, а потом уже пропустить ее через таблицу вхождений. В результате запрос виснет.

Пробовал накладывать условие на результат, т.е. на подзапрос
Select * From (QueryText) SubQuery WhereClause
, все равно виснет.

Вопрос: как отключить оптимизатор для подобного условия, точнее, как заставить Where срабатывать после получения результирующего набора?

С уважением, VS


Использовать временную таблицу, не?
22 сен 09, 13:58    [7692430]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
GreenSunrise
Member

Откуда:
Сообщений: 12310
Среди профессионалов, в чьей квалификации не будем сомневаться, план выполнения смотреть не принято? Ну и заодно выложить его на форум в текстовом виде вместе с текстом запроса?
22 сен 09, 14:02    [7692459]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6723
Виктор Светлов
Уважаемые коллеги, давайте не будем сомневаться в квалификации друг друга.
После этого:
Виктор Светлов
Пробовал накладывать условие на результат, т.е. на подзапрос
Select * From (QueryText) SubQuery WhereClause
, все равно виснет.
Как раз все и засомневались.
22 сен 09, 16:26    [7693792]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
Ну что ж, предлагаю остановиться на следующем, только прежде напомню сабж:
Как заставить Where срабатывать после получения результирующего набора?

to Glory - спасибо за ссылку, жаль примеров по теме нет, но поищу.
[url=]http://msdn.microsoft.com/ru-ru/library/ms181714.aspx[/url]

to aleks2 - Да, сразу так подумал. Если за ближайшие полчаса не найду быстрый выход, так и сделаю.
автор
Использовать временную таблицу, не?

to pkarklin
Давайте, только чтобы не сомневаться, приведите реальные:
1. Структуру таблиц с индексами. 2. Запрос. 3. План его выполнения в текстовом виде.
Запрос на пол-страницы, содержит джойны около 20 таблиц. Если я все это приведу, боюсь, это будет флудом. Второе - доказывать Вам свою квалификацию не намерен. Заметьте, помощи в оптимизации запроса я не просил.

to GreenSunrise
автор
Среди профессионалов, в чьей квалификации не будем сомневаться, план выполнения смотреть не принято? Ну и заодно выложить его на форум в текстовом виде вместе с текстом запроса?
Я не просил помощи в оптимизации запроса.

Спасибо за корректные ответы.
22 сен 09, 16:35    [7693870]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
Извините, конечно же за ссылку спасибо tpg!
22 сен 09, 16:37    [7693885]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Виктор Светлов
Ну что ж, предлагаю остановиться на следующем, только прежде напомню сабж:
Как заставить Where срабатывать после получения результирующего набора?

Никак.
Разбивайте свой запрос на несколько с сохранением результатов в промежуточных таблицах, если вам так принципиален порядок действий
22 сен 09, 16:38    [7693899]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
проходящий.
Guest
Виктор Светлов
Я не просил помощи в оптимизации запроса.
1. То есть борьба с "висючестью" запроса уже не является оптимизацией этого запроса?
2. На чем основана такая непробиваемая уверенность в правильности выбранного способа борьбы с зависанием запроса?
22 сен 09, 16:40    [7693919]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Виктор Светлов
Заметьте, помощи в оптимизации запроса я не просил.

Просили. Иначе как расценивать сентенцию "при изменении текста запрос выполняется слишком долго, как с этим боротся"?
Вы, правда, также предложили один из вариантов решения (заставить оптимизатор выбрать другой план запроса)- это таки да.
22 сен 09, 16:40    [7693922]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74927
автор
Запрос на пол-страницы, содержит джойны около 20 таблиц. Если я все это приведу, боюсь, это будет флудом.


Напрасно боитесь. Тут и не такие запросы выкладывали.

автор
Второе - доказывать Вам свою квалификацию не намерен. Заметьте, помощи в оптимизации запроса я не просил.


Вас никто не просил ничего доказывать. О "квалификации друг друга" первым заикнулись Вы.

автор
Заметьте, помощи в оптимизации запроса я не просил.


Это:

автор
как заставить Where срабатывать после получения результирующего набора


и есть "оптимизация" запроса, которая, в конечном итоге, может привести как к его переписыванию, так и к введению дополнительных объектов бд.
22 сен 09, 16:40    [7693928]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
to Mnior
Select * From (QueryText) SubQuery WhereClause
А что, логика не понятна? Таким образом я пытался показать, что при использовании подзапроса я ожидал иметь его как уже сформированный набор данных.
QueryText = My query Text
SubQuery = [As] MySubQueryName
WhereClause = My Where Clause

Не буду я текст запроса приводить и все тут. Не в этом сабж заключался. Предлагаю в безрезультатные споры не вступать.
22 сен 09, 16:45    [7693964]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Виктор Светлов
А что, логика не понятна? Таким образом я пытался показать, что при использовании подзапроса я ожидал иметь его как уже сформированный набор данных.

Мы все многого ожидаем. Но у оптимизатора есть своё мнение на этот счет.

Виктор Светлов
Не буду я текст запроса приводить и все тут.

Жаль. Телепаты как раз уволились.

Виктор Светлов
Предлагаю в безрезультатные споры не вступать.

Закрывать топик?
22 сен 09, 16:49    [7693992]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
Поясняю:
фраза "Как заставить Where срабатывать после получения результирующего набора"
означает "Как заставить Where работать с предварительно подготовленным и готовым к употреблению набором результирующих данных" Разве не так? Никакого другого вопроса я не задавал.

Хотите помочь - читайте сабж. Хотите пофлудить на тему оптимизации, которая мне не нужна (а это мне решать) - пожалуюсь модератору.
22 сен 09, 16:55    [7694044]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Glory
Member

Откуда:
Сообщений: 104760
Виктор Светлов
помочь - читайте сабж. Хотите пофлудить на тему оптимизации, которая мне не нужна (а это мне решать) - пожалуюсь модератору.

Извините, а ваше желание "заставить Where работать с предварительно подготовленным и готовым к употреблению набором результирующих данных" оно чисто академическое ? И не преследует целью увеличить производительность запроса?
22 сен 09, 16:59    [7694069]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Дедушка
Member

Откуда: Город трёх революций
Сообщений: 5111
Виктор Светлов
Не буду я текст запроса приводить и все тут. Не в этом сабж заключался. Предлагаю в безрезультатные споры не вступать.

вот выше вам ссылку привели - вы её смотрели?
хотя вам скорее сюда
22 сен 09, 17:00    [7694085]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
Виктор Светлов
как заставить Where срабатывать после получения результирующего набора?
автор, я не уверен, что правильно понял, но может, Вам нужно это?
declare @t table(id int, name varchar(10))
insert into @t(id, name)
select 1, 'item1' union all
select 2, 'item2' union all
select 3, 'item3'

set statistics profile on

select id, name
  from (select id, name
          from @t
         where id > 1) as t
 where id < 3

select id, name
  from (select top 2147483647
               id, name
          from @t
         where id > 1) as t
 where id < 3

set statistics profile off
22 сен 09, 17:02    [7694094]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Виктор Светлов
Member

Откуда: Нижневартовск, ХМАО-Югра, Сибирь
Сообщений: 88
to Glory:
автор
ваше желание "заставить Where работать с предварительно подготовленным и готовым к употреблению набором результирующих данных" оно чисто академическое ? И не преследует целью увеличить производительность запроса?

Именно так. И Вы прекрасно на этот вопрос ответили. Я так и сам умею, но думал, может кто еще знает способы.

to Дедушка: читал, понравилось. Вторая ссылка доступна из исходной страницы. Исходная покрывает больше задач. Чисто академических, как выразился Glory:)
22 сен 09, 17:05    [7694114]     Ответить | Цитировать Сообщить модератору
 Re: Как сделать where, отключив оптимизатор?  [new]
Downthedrain
Member [заблокирован]

Откуда:
Сообщений: 517
я бы агрегировал а потом сделал хэвин
22 сен 09, 17:06    [7694124]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить