#sql #tsql #sql-server-2008
#sql #tsql #sql-server-2008
Вопрос:
Как я могу настроить максимальную память, которую может использовать запрос (select query) в sql server 2008?
Я знаю, что есть способ установить минимальное значение, но как насчет максимального значения? Я хотел бы использовать это, потому что у меня много процессов параллельно. Я знаю о опции MAXDOP, но это для процессоров.
Обновить:
Что я на самом деле пытаюсь сделать, так это непрерывно загружать некоторые данные. Эти данные загружаются в форме ETL (извлечение, преобразование и загрузка). Во время загрузки данных я хочу выполнить несколько запросов (выбрать). Все они являются дорогостоящими запросами (содержащими group by ). Наиболее важным процессом для меня является загрузка данных. Я получил среднюю скорость 10000 строк / сек, и когда я выполняю запросы параллельно, она падает до 4000 строк / сек и даже ниже. Я знаю, что следует предоставить немного больше деталей, но это более сложный продукт, над которым я работаю, и я не могу детализировать его подробнее. Еще одна вещь, которую я могу гарантировать, это то, что моя скорость загрузки не падает из-за проблем с блокировкой, потому что я отслеживал и удалял их.
Комментарии:
1. В какой версии SQL Server 2008 вы используете?
2. Короткий ответ: вы, вероятно, не должны (и если вы пытаетесь, то вы, вероятно, делаете что-то в корне неправильное). Если вы создали запрос, от которого вам требуются результаты, для этого потребуется все, что потребуется.
3. Возможно, вам следует описать реальную проблему, с которой вы столкнулись…
4. Вы говорите о выделении памяти для сортировки, хэш-операций и т. Д.? Если да, то почему? Вы получаете ожидания семафора?
5. Я обновил свой вопрос. Пожалуйста, ознакомьтесь с обновлением.
Ответ №1:
Я не могу придумать никакого способа установить максимальную память на уровне каждого запроса.
Если вы используете Enterprise Edition, вы можете использовать регулятор ресурсов, чтобы установить максимальный объем памяти, который может использовать определенная группа рабочей нагрузки, что может помочь.
Комментарии:
1. @MitchWheat — Да, я добавил первую строку, потому что я не знаю ни одного способа сделать именно то, что запрашивает OP.
Ответ №2:
В SQL 2008 вы можете использовать регулятор ресурсов для достижения этой цели. Там вы можете установить request_max_memory_grant_percent для установки памяти (это процент относительно размера пула, указанного значением max_memory_percent пула). Этот параметр не зависит от запроса, он зависит от сеанса.
Комментарии:
1. не уверен, как это сильно добавляет к (5-минутному) более старому ответу Мартина?
2. Извините, но когда я открыл окно и не коснулся его через несколько минут — после сохранения я увидел ответ
Ответ №3:
В дополнение к ответу Мартина
Если все ваши запросы одинаковы или похожи, работают с одними и теми же данными, то они все равно будут использовать общую память.
Пример:
Загруженный веб-сайт со 100 одновременными подключениями, выполняющими 6 различных параметризованных запросов между ними по одному и тому же диапазону данных.
- 6 планов выполнения
- 100 пользовательских контекстов
- один пул буферов с различными флагами и счетчиками для отображения использования каждой страницы данных
Если у вас есть 100 разных запросов или они не параметризованы, исправьте код.
Память на запрос — это то, о чем я никогда не думал и не заботился с прошлого тысячелетия
Комментарии:
1. Я предположил, что OP говорил о предоставлении памяти для таких операторов, как сортировки и хэш-соединения. Было бы неплохо получить некоторую ясность относительно мотивации вопроса.