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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

3
invm
1817 / 1227 / 349
Регистрация: 02.06.2013
Сообщений: 3,080
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-го дня
3629 / 2190 / 389
Регистрация: 26.06.2015
Сообщений: 4,647
Записей в блоге: 1
13.11.2016, 14:21  [ТС] #3
Цитата Сообщение от invm Посмотреть сообщение
если для разных значений параметра оптимальный план выполнения разный
О. Не подумала об этом. А такое может быть вполне, там принцип отбора записей довольно специфический (объект может быть привязан либо к сотруднику, либо к отделу, и у того, и у другого может быть, а может не быть назначен начальник, причем начальник отдела не обязательно числится в этом отделе, и мне нужно выбрать все объекты, к которые так или иначе причастен данный сотрудник - т.е. либо объект привязан к нему напрямую, либо работает в отделе, с которым объект связан, либо является начальником сотудника или отдела, к которому привязан объект).

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

Добавлено через 1 минуту
Цитата Сообщение от invm Посмотреть сообщение
С клиента можно и параметризованный запрос отправлять. Либо включить опцию конфигурации Optimize for AdHoc workload.
Можете пожсказать, пожалуйста, где почитать об этом подобнее?
0
invm
1817 / 1227 / 349
Регистрация: 02.06.2013
Сообщений: 3,080
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 лет на фирме
Приветствую.Опять к знатокам... Задача: Выявить сотрудников,отработавших...

Выбрать элементы массива, встречающихся более одного раза
Помогите, нужно срочно:swoon: Дан одномерный массив А(размерностью...

Выбрать элементы, встречающихся в последовательности А более одного раза.
Задана последовательность А = ai (i=1,. . ., n). Выбрать элементы,...


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

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

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