Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
texnik-san
шапоклякистка 8-го дня
3630 / 2191 / 389
Регистрация: 26.06.2015
Сообщений: 4,648
Записей в блоге: 1
1

Выбрать более правильную стратегию

13.11.2016, 10:49. Просмотров 789. Ответов 3
Метки нет (Все метки)

В БД будет часто востребованной выборка из 7 таблиц, отбирающая записи по довольно замысловатому условию с 1 параметром. По моим прикидкам, в среднем запрос должен отбирать 20-30 строк, в отдельных случаях (при буквально 1-2 значениях параметра из ок. 30 возможных) строк может оказаться 70-110, врядли больше.

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

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

А вот как правильнее поступить в тех случаях, когда выборка нужна сама по себе - не могу решить. Варианты:

1) Выполнять из клиента запрос Select * from ИмяФункции(ЗначенияПараметра).
Чем смущает: такой запрос в процедурном кэше (Просмотр содержимого процедурного кэша SQL Server 2005/2008) числится как AdHoc, т.е. при выполнении с разными параметрами как раз возникает ситуация, описанная в последнем абзаце по ссылке.
2) Создать хранимую процедуру, полностью дублирующую функцию по тексту, и из клиента обращаться к процедуре.
Чем смущает: если в какой-то момент руководство решит, что выборка должна делаться по другим правилам (а такое более чем вероятно, и наверняка произойдет не один раз, прежде чем остановиться на каком-то окончательном варианте), будет недостаточно внести правки ровно в одном месте и быть уверенным, что правки одинаково повлияли на все места, где нужна такая выборка.
3) Создать хранимку, выполняющую Select * from ИмяФункции(ЗначенияПараметра) ?

4) Какой-то еще вариант - какой?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
13.11.2016, 10:49
Ответы с готовыми решениями:

Выбрать записи , встречающиеся в таблице более 1 раза
SELECT Name FROM Varieties where Name like'%a%' GROUP BY Name HAVING...

Выбрать тех клиентов, которые не обращались более 2-х лет
Здравствуйте! Есть таблица в которой указаны даты обращений клиентов, нужны...

Подскажите стратегию развития
Доброго времени суток, господа! Изучил в рамках программы ВУЗа дисциплину...

Получить правильную разность двух многозначных чисел (более 15 знаков)
Вычитание. Получить правильную разность двух многозначных чисел (более 15...

Выбрать правильную конструкцию Try - Catch из предложенных
Какая из этих конструкция правильная?

3
invm
1903 / 1288 / 387
Регистрация: 02.06.2013
Сообщений: 3,273
13.11.2016, 12:57 2
Лучший ответ Сообщение было отмечено texnik-san как решение

Решение

Цитата Сообщение от texnik-san Посмотреть сообщение
проверила по плану выполнения, так ничуть не хуже, чем если включить в запрос не вызов функции, а непосредственно ее текст
Инлайновые функции потому и называются инлайновыми, что не компилируются отдельно, а, как и представления, встраиваются в текст запроса.
Цитата Сообщение от texnik-san Посмотреть сообщение
1) Выполнять из клиента запрос Select * from ИмяФункции(ЗначенияПараметра).
Чем смущает: такой запрос в процедурном кэше (Просмотр содержимого процедурного кэша SQL Server 2005/2008) числится как AdHoc, т.е. при выполнении с разными параметрами как раз возникает ситуация, описанная в последнем абзаце по ссылке.
С клиента можно и параметризованный запрос отправлять. Либо включить опцию конфигурации Optimize for AdHoc workload.
Цитата Сообщение от texnik-san Посмотреть сообщение
3) Создать хранимку, выполняющую Select * from ИмяФункции(ЗначенияПараметра
Наиболее гибкий вариант. Но возможны проблемы из-за эффекта parameters sniffing, если для разных значений параметра оптимальный план выполнения разный.
0
texnik-san
шапоклякистка 8-го дня
3630 / 2191 / 389
Регистрация: 26.06.2015
Сообщений: 4,648
Записей в блоге: 1
13.11.2016, 14:21  [ТС] 3
Цитата Сообщение от invm Посмотреть сообщение
если для разных значений параметра оптимальный план выполнения разный
О. Не подумала об этом. А такое может быть вполне, там принцип отбора записей довольно специфический (объект может быть привязан либо к сотруднику, либо к отделу, и у того, и у другого может быть, а может не быть назначен начальник, причем начальник отдела не обязательно числится в этом отделе, и мне нужно выбрать все объекты, к которые так или иначе причастен данный сотрудник - т.е. либо объект привязан к нему напрямую, либо работает в отделе, с которым объект связан, либо является начальником сотудника или отдела, к которому привязан объект).

А как проверить это? Выполнить функцию с такими параметрами, при которых план теоретически может отличаться и сравнить фактический план выполения?

Добавлено через 1 минуту
Цитата Сообщение от invm Посмотреть сообщение
С клиента можно и параметризованный запрос отправлять. Либо включить опцию конфигурации Optimize for AdHoc workload.
Можете пожсказать, пожалуйста, где почитать об этом подобнее?
0
invm
1903 / 1288 / 387
Регистрация: 02.06.2013
Сообщений: 3,273
13.11.2016, 14:40 4
Лучший ответ Сообщение было отмечено texnik-san как решение

Решение

Цитата Сообщение от texnik-san Посмотреть сообщение
А как проверить это? Выполнить функцию с такими параметрами, при которых план теоретически может отличаться и сравнить фактический план выполения?
Да. Добавив к запросу option(recompile).
Цитата Сообщение от texnik-san Посмотреть сообщение
Можете пожсказать, пожалуйста, где почитать об этом подобнее?
https://msdn.microsoft.com/en-us/library/cc645587.aspx

Добавлено через 1 минуту
Кстати, в варианте 1 при параметризации запроса, так же будет эффект parameters sniffing.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.11.2016, 14:40

Тренажер радиосвязи: выбрать правильную концепцию проекта
Здравствуйте! В учебном заведении надо создать тренажер обучения радиосвязи....

Как выбрать "правильную" видеокарту?
Ребята, куда смотреть и что проверять, чтобы не лопухнуться при покупке...

Выбрать сотрудников, отработавших более 19 лет на фирме
Приветствую.Опять к знатокам... Задача: Выявить сотрудников,отработавших...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru