Отправляет email-рассылки с помощью сервиса Sendsay

MS SQL Server

  Все выпуски  

MS SQL Server - дело тонкое...


Информационный Канал Subscribe.Ru


#149<<  #150

СОДЕРЖАНИЕ

1.СОВЕТЫ
1.1.Счётчики производительности SQL Server и Windows
1.2.Эффективный метод постраничной выборки.
2.ССЫЛКИ НА СТАТЬИ
2.1.Статьи на русском языке
2.2.Новые и обновлённые технические статьи Microsoft
2.3.Англоязычные статьи
3.ФОРУМ SQL.RU
3.1.Самые популярные темы недели
3.2.Вопросы остались без ответа
4.ПОЛЕЗНОСТИ
4.1.Как в запросе обрабатывать данные предыдущей строки?

СОВЕТЫ

Счётчики производительности SQL Server и Windows

1. Введение
2. Анализ узких мест
3. Счётчики
4. Типы счётчиков

5. Память

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

[В начало]

5.1. Поиск узких мест использования памяти Windows 2000

Следующие счетчики позволяют обнаружить узкие места в ресурсах памяти Windows 2000:

Объект \ счетчик Рекомендуемое пороговое значение Комментарий Тип
Memory\Available Bytes
(Доступно байт)
Менее 4 Мбайт Объем реальной памяти в байтах, в текущий момент находящейся в списках обнуленной (Zeroed), свободной (Free) или простаивающей (Standby) памяти. Обнуленная и свободная память готова для использования, причем обнуленная память очищена нулями. Простаивающая (Standby) память - это память, изъятая из рабочего множества памяти и предназначенная для перемещения на диск, но она может быть вновь запрошена и использована без необходимости чтения данных с диска. Этот счетчик отражает текущее значение, и не является средним значением по некоторому интервалу времени.При превышении порога (значение меньше 4 Мб), необходимо увеличить объём ОЗУ PERF_COUNTER_RAWCOUNT
Memory\ Pages/sec
(Обмен страниц/сек)
20 Нормальное значение числа страниц, прочитанных с диска или записанных на диск для того, чтобы разрешить обращения к страницам памяти, которые не были загружены в оперативную память в момент обращения. Эта величина является суммой величин Ввод страниц/сек и Вывод страниц/сек, и включает страничный обмен (подкачку) системной кэш-памяти для доступа к файлам данных для приложений. Кроме того, сюда включается страничный обмен (подкачка) для не кэшированных файлов, непосредственно отображаемых в память. Это основной счетчик, за которым следует следить в том случае, если наблюдается большая нагрузка на использование памяти и связанный с этим избыточный страничный обмен.Превышение порога обмена страниц может быть вызвано большим свопингом. Что бы это проверить, проконтролируйте счётчики Memory\Page Faults/sec и Paging File\ % Usage Peak PERF_COUNTER_COUNTER
Paging File\% Usage Peak
(Файл подкачки\% использования (пик))
99% Максимальное использование файла подкачки (страничного файла) в процентах. См. также 'Процесс: Байт файла подкачки (пик)'. Для определения активности обмена страниц рассматривайте это значение вместе со значениями счетчиков Available Bytes и Pages/secПо показаниям этого счётчика можно сделать вывод, вызвана ли большая дисковая активность листанием. PERF_RAW_FRACTION

При мониторинге производительности экземпляра Microsoft SQL Server необходимо выяснить, используется ли им память в допустимых пределах и не испытывает ли SQL Server и другие процессы недостаток памяти или же он потребляет её слишком много.
Низкое нормальное значение листания (и, как следствие, ошибок страниц) возможно, даже если компьютер имеет большой объём доступной памяти. Windows NT Virtual Memory Manager (VMM) захватывает страницы у SQL Server и у других процессов, что урезает размеры их рабочих наборов и порождает ошибки страницы. Определить, является ли SQL Server, а не другие процессы, виновником чрезмерного листания, можно контролируя счётчик Process\Page Faults/sec, который запущен для процесса Вашего экземпляра SQL Server.

[В начало]

5.2. Наборы счётчиков мониторинга памяти

Для контроля производительность физической и виртуальной памяти Windows 2000, используйте следующий набор счётчиков:

Объект \ счетчик Комментарий Тип
Memory\Available Bytes
Доступно байт)
Memory\Available KBytes
(Доступно КБ)
Memory\Available Mbytes
(Доступно МБ)
это объем реальной памяти в байтах, килобайтах (1024 байт), мегабайтах (1048576 байт), в текущий момент находящейся в списках обнуленной (Zeroed), свободной (Free) или простаивающей (Standby) памяти. Обнуленная и свободная память готова для использования, причем обнуленная память очищена нулями. Простаивающая (Standby) память - это память, изъятая из рабочего множества памяти и предназначенная для перемещения на диск, но она может быть вновь запрошена и использована без необходимости чтения данных с диска. Этот счетчик отражает текущее значение, и не является средним значением по некоторому интервалу времени. PERF_COUNTER_RAWCOUNT
Memory\Page Faults/sec
(Ошибок страницы/сек)
это среднее значение счетчика ошибок страницы (Page Faults) в секунду для данного процессора. Ошибка станицы возникает, когда процесс ссылается на страницу виртуальной памяти, которая не находится в рабочем множестве (Working Set) оперативной памяти. Ошибка станицы не вызывает загрузку соответствующей страницы с диска, если эта страница находится в списке простаивающих (Standby list), и тем самым уже находится в оперативной памяти, или если эта страница используется другим процессом, имеющим совместный доступ к этой странице. Измерение осуществляется, как количество ошибочных страниц; потому что учитывается только одна ошибка на странице в каждой ошибочной операции, результат может приравниваться к числу ошибок операций со страницами. Этот счетчик включает как жёсткие ошибки (те, которые требуют дискового доступа), так и мягких ошибок (когда ошибочные страницы могут быть найдены в другом месте физической памяти). Большинство процессоров умеет корректно работать с большим числом мягких ошибок, не вызывая заметных последствий. Однако, жесткие ошибки, которые требуют дискового доступа, могут стать причиной задержек. PERF_COUNTER_COUNTER
Memory\Page Reads/sec
(Чтение страниц/сек)
это нормальное значение операций чтения диска при получении страниц виртуальной памяти для разрешения жёстких ошибок страниц. При выполнении одной операции чтения могут быть получены одновременно несколько страниц. Счётчик показывает число операций чтения, без отношения к числу страниц, найденных в каждой операции. Жесткие ошибки страниц происходят, когда процесс имеет ссылку на страницу в виртуальной памяти, которая находится вне его рабочего набора или в другом месте физической памяти, и страница должны быть найдена на диске. Этот счетчик является основным индикатором тех ошибок, которые являются причиной задержек системы. Он затрагивает операции чтения, при разрешении ошибок в кэше файловой системы (обычно используемом прикладными программами) и в не кэшируемых, размещённых в памяти файлах. Чтобы определить среднее число чтений страниц в течение каждой операции чтения, сравните значение Page Reads/sec со значением Pages Input/sec. PERF_COUNTER_COUNTER
Memory\Page Writes/sec
(Вывод страниц/сек)
это нормальное значение количества страниц, записываемых на диск потому, что эти страницы были изменены в оперативной памяти. Эти страницы обычно содержат данные, а не код. Этот счётчик показывает операции записи, безотносительно к числу страниц, записанных в каждой операции. PERF_COUNTER_COUNTER
Memory\Pages Input/sec
(Операций ввода страниц/сек)
показывает норму чтений страниц с диска в секунду, для разрешения жёстких ошибок страниц. Жёсткие ошибки страниц возникают в процессе обращения к странице в виртуальной памяти, которая существует вне рабочего набора или размещена в другом месте физической памяти, и должна быть считана с диска. При обнаружении ошибочных страниц, система попытается считать множество непрерывных страницы в память, чтобы повысить отдачу от операций чтения. Сравните Pages Input/sec и Page Reads/sec, чтобы найти среднее число чтений страниц в память в течение каждой операции чтения. PERF_COUNTER_COUNTER
Memory\Pages Output/sec
(Операций вывода страниц/сек)
это счетчик представляет нормальное значение количества операций записи страниц на диск, вызванных тем, что эти страницы были изменены в оперативной памяти после того, как были прочитаны. Каждая такая операция вывода может записывать на диск несколько страниц. Высокое нормальное значение вывода страниц может указывать на нехватку памяти. Windows 2000 записывает большее количество страниц обратно на диск для освобождения места, когда физической памяти установлено на сервере недостаточно много. Этот счетчик показывает число страниц и может быть сравнён с другим счетом страниц без какого-либо преобразования PERF_COUNTER_COUNTER
Memory\Pool Nonpaged Bytes
(Байт в невыгружаемом страничном пуле)
это объем в байтах специальной системной области памяти, где компоненты операционной системы запрашивают место, необходимое им для функционирования. Страницы невыгружаемого страничного пула не могут быть выгружены в файл подкачки (страничный файл) на диск и остаются в оперативной памяти в течение всего периода их использования. Этот счетчик отражает текущее значение, и не является средним значением по некоторому интервалу времени. Memory\Pool Nonpaged Bytes рассчитывается иначе, чем Process\ Pool Nonpaged Bytes, поэтому значение этого счётчика не эквивалентно Process(_Total )\ Pool Nonpaged Bytes PERF_COUNTER_RAWCOUNT
Process\Page Faults/sec
(Ошибок страницы/сек)
Ошибок страницы/сек - это значение счетчика ошибок страницы (Page Faults), вызванных потоками, выполняющимися в данном процессе. Ошибка станицы возникает, когда поток ссылается на страницу виртуальной памяти, которая не находится в рабочем множестве (Working Set) оперативной памяти. Ошибка станицы не вызывает загрузку соответствующей страницы с диска, если эта страница находится в списке простаивающих (Standby list), и тем самым уже находится в оперативной памяти, или если эта страница используется другим процессом, имеющим совместный доступ к этой странице. PERF_COUNTER_COUNTER
Process\Page File Bytes
(Байт файла подкачки)
Байт файла подкачки - это объем в байтах файла подкачки (страничного файла), который использует данный процесс в настоящий момент. Файлы подкачки хранят страницы памяти, используемые данным процессом, но не хранящиеся в каких либо других файлах. Файлы подкачки совместно используются всеми процессами, и захват памяти в файлах подкачки может привести к неспособности других процессов выделить нужную память. PERF_COUNTER_RAWCOUNT
Process\Private Bytes
(Байт исключительного пользования)
Байт исключительного пользования (Private Bytes) - это объем в байтах выделенной данному процессу памяти, которая не может использоваться совместно с другими процессами. PERF_COUNTER_RAWCOUNT
Process\Working Set
(Рабочее множество)
Текущий объем в байтах рабочего множества страниц для данного процесса. Рабочее множество - это множество страниц памяти, затронутых в последнее время потоками, выполняющимися в данном процессе. Если объем свободной памяти компьютера превышает пороговое значение, страницы остаются в рабочем множестве даже если они не используются. Когда объем свободной памяти оказывается ниже порогового значения, страницы изымаются из рабочих множеств. Если они продолжают использоваться, то они вновь будут включены в рабочее множество при разрешении возникшей ошибки страницы до того, как окажутся фактически выгружены из оперативной памяти. PERF_COUNTER_RAWCOUNT

Для контроля производительность кэша Windows 2000, используйте следующий набор счетчиков:

Объект \ счетчик Комментарий Тип
Cache\Copy Read Hits %
(Попадания при чтении с копированием)
Процент операций чтения с копированием, которые 'попадают в кэш', т.е. не требуют выполнения чтения данных с диска для обеспечения доступа к данной странице в кэш-памяти. Чтение с копированием - это операция чтения файла, которая может быть разрешена с помощью копирования данных со страницы кэш-памяти в буфер приложения. Редиректор (перенаправитель) LAN использует этот метод для получения данных из кэш-памяти, а при малых объемах передачи его использует Сервер LAN. Этим же методом пользуются и дисковые файловые системы. PERF_SAMPLE_FRACTION
Cache\Copy Reads/sec
(Чтений с копированием/сек)
Частота операций чтения данных со страниц кэш-памяти, которые вызывают копирование данных из кэш-памяти в буфер приложения. PERF_COUNTER_COUNTER
Cache\Data Flushes/sec
(Сбросов данных на диск/сек)
Частота, с которой данные из кэш-памяти сбрасываются на диск в результате выполнения запросов сквозной записи в файл (write-through file write request). При каждой операции сброса данных на диск может быть передано более одной страницы данных. PERF_COUNTER_COUNTER
Cache\Lazy Write Flushes/sec
(Сбросов 'ленивой' записи/сек)
Частота активизации потока 'ленивой' (отложенной) записи из кэш-памяти (Lazy Write) при выполнении записи данных на диск. 'Ленивая' запись - это процесс обновления данных на диске после того, как страница данных была изменена в памяти, так что при этом приложение, выполняющее изменение файла, не обязано ждать завершения записи данных на диск, прежде чем продолжить работу. Таким образом, при каждой операции записи на диск может быть передано более одной страницы данных. PERF_COUNTER_COUNTER
Cache\Lazy Write Pages/sec
(Станиц 'ленивой' записи/сек)
Частота, с которой поток 'ленивой' записи из кэш-памяти (Lazy Write) выполняет запись страниц данных на диск. PERF_COUNTER_COUNTER
Cache\Read Aheads/sec
(Упреждающих чтений/сек)
Частота операций чтения, при выполнении которых обнаруживается последовательный доступ к файлу. Упреждающее чтение позволяет передавать данные более крупными блоками, чем блоки, запрашиваемые приложением, что уменьшает затраты времени на доступ к данным. PERF_COUNTER_COUNTER
Memory\Cache Bytes
(Байт кэш-памяти)
Является суммой счетчиков System Cache Resident Bytes, System Driver Resident Bytes, System Code Resident Bytes и Pool Paged Resident Bytes. Этот счетчик отражает текущее значение, и не является средним значением по некоторому интервалу времени. PERF_COUNTER_RAWCOUNT
Memory\Cache Faults/sec
(Ошибки кэш-памяти/сек)
Ошибки кэш-памяти происходят в том случае, если диспетчер кэш-памяти не находит страницу файла в непосредственной кэш-памяти и должен запросить у диспетчера памяти местонахождение страницы в другом месте оперативной памяти или на диске для того, чтобы можно было загрузить эту страницу в непосредственную кэш-память. PERF_COUNTER_COUNTER
Memory\Page Faults/sec
(Ошибок страницы/сек)
Среднее значение счетчика ошибок страницы (Page Faults) в секунду для данного процессора. Ошибка станицы возникает, когда процесс ссылается на страницу виртуальной памяти, которая не находится в рабочем множестве (Working Set) оперативной памяти. Ошибка станицы не вызывает загрузку соответствующей страницы с диска, если эта страница находится в списке простаивающих (Standby list), и тем самым уже находится в оперативной памяти, или если эта страница используется другим процессом, имеющим совместный доступ к этой странице. Измерение осуществляется, как количество ошибочных страниц; потому что учитывается только одна ошибка на странице в каждой ошибочной операции, результат может приравниваться к числу ошибок операций со страницами. Этот счетчик включает как жёсткие ошибки (те, которые требуют дискового доступа), так и мягких ошибок (когда ошибочные страницы могут быть найдены в другом месте физической памяти). Большинство процессоров умеет корректно работать с большим числом мягких ошибок, не вызывая заметных последствий. Однако, жесткие ошибки, которые требуют дискового доступа, могут стать причиной задержек. PERF_COUNTER_COUNTER
Memory\Pages Input/sec
(Операций ввода страниц/сек)
Показывает норму чтений страниц с диска в секунду, для разрешения жёстких ошибок страниц. Жёсткие ошибки страниц возникают в процессе обращения к странице в виртуальной памяти, которая существует вне рабочего набора или размещена в другом месте физической памяти, и должна быть считана с диска. При обнаружении ошибочных страниц, система попытается считать множество непрерывных страницы в память, чтобы повысить отдачу от операций чтения. Сравните Pages Input/sec и Page Reads/sec, чтобы найти среднее число чтений страниц в память в течение каждой операции чтения. PERF_COUNTER_COUNTER
Memory\Pages Output/sec
(Операций вывода страниц/сек)
Счётчик представляет нормальное значение количества операций записи страниц на диск, вызванных тем, что эти страницы были изменены в оперативной памяти после того, как были прочитаны. Каждая такая операция вывода может записывать на диск несколько страниц. Высокое нормальное значение вывода страниц может указывать на нехватку памяти. Windows 2000 записывает большее количество страниц обратно на диск для освобождения места, когда физической памяти установлено на сервере недостаточно много. Этот счетчик показывает число страниц и может быть сравнён с другим счетом страниц без какого-либо преобразования PERF_COUNTER_COUNTER
PhysicalDisk\Disk Reads/sec
(Обращений чтения с диска/сек)
Частота выполнения операций чтения с этого диска PERF_COUNTER_COUNTER
PhysicalDisk\Disk Writes/sec
(Обращений записи на диск/сек)
Частота выполнения операций записи на этот диск. PERF_COUNTER_COUNTER

Для контроля производительность использования памяти SQL Server, используйте следующий набор счетчиков:

Объект \ счетчик Рекомендуемое пороговое значение Комментарий Тип
Process\Working Set
(Рабочее множество)
Если значение этого счётчика ниже объема выделенной SQL Server памяти, и SQL Server ограничен в использовании памяти установленными параметрами min и max server memory, значит SQL серверу выделено больше памяти чем ему необходимо. Текущий объем в байтах рабочего множества страниц для данного процесса. Рабочее множество - это множество страниц памяти, затронутых в последнее время потоками, выполняющимися в данном процессе. Если объем свободной памяти компьютера превышает пороговое значение, страницы остаются в рабочем множестве даже если они не используются. Когда объем свободной памяти оказывается ниже порогового значения, страницы изымаются из рабочих множеств. Если они продолжают использоваться, то они вновь будут включены в рабочее множество при разрешении возникшей ошибки страницы до того, как окажутся фактически выгружены из оперативной памяти. PERF_COUNTER_RAWCOUNT
SQL Server\Buffer Manager\Buffer Cache Hit Ratio >= 90%

Вы должны стремится, чтобы это значение было предельно высоким. Увеличить значение Buffer Cache Hit Ratio можно простым увеличением объема памяти, доступной SQL Server
Процент от страниц, найденных в буферном кэше и которые не понадобилось читать с диска. Общее количество попаданий в кэш, разделенное на общее количество поисков в кэше, с момента запуска экземпляра SQL Server. Показывает, насколько полно SQL Server может разместить данные в буфере кэша. В течении длительного периода времени, значение этого счётчика изменяется очень медленно. PERF_SAMPLE_FRACTION
SQL Server\Memory Manager\Total Server Memory (KB) Если значение этого счётчика постоянно больше объёма выделенной SQL Server памяти, значит необходимо увеличить доступную SQL Server память, а если выделен максимально возможный объём, увеличить память у компьютера. Общая сумма динамической памяти (в килобайтах) которую сервер использует в настоящее время. PERF_COUNTER_COUN
SQL Server\Cache Manager Object\ Cache Hit Ratio >= 85%

Если Вы наблюдаете снижение среднего значения этого счётчика, рассмотрите возможность добавление ОЗУ или оптимизации ваших запросов.
Отношение между попаданием в кэш и поиском для хранимых процедур, специальных и подготовленных инструкций Transact-SQL и триггеров. Показывает, может ли SQL Server размещать полностью планы исполнения запросов в кэше процедур.Боле тонко регулировать кэширование можно используя флаг трассировки 1081, добиваясь, что бы страницы индексов оставались в кэше данных дольше, чем страницы данных. PERF_SAMPLE_FRACTION

По умолчанию, SQL Server захватывает необходимую ему память динамически, при наличии доступных системных ресурсов. Если SQL Server нуждается в увеличении используемого объёма памяти, он делает запрос к операционной системе, чтобы определить, является ли свободная физическая память доступной и если это так, он её использует. Если SQL Server больше не нуждается в памяти, которая была ему распределена, он отдаёт её операционной системе. Однако, опция динамического использования памяти может быть отменена через параметры конфигурации min server memory, max server memory и set working set size.
Указание параметра запуска SQL Server "-x" приводит к тому, что становится невозможным собирать статистику по счётчикам процессора и Cache Hit Ratio. Использование этого параметра позволяет повысить производительность сервера, за счёт отключения сбора указанной статистики.

[В начало]

5.3. Системная таблица sysperfinfo

Кроме System Monitor, для получения значений счётчиков производительности, можно использовать системную таблицу базы данных master - sysperfinfo. Нужно только помнить, что значения, которые хранятся в колонке cntr_value, не являются теми значениями, которые Вы можете наблюдать на графики монитора производительности. Эти значения нужно подставить в формулу для данного типа счётчика, масштабировать соответствующим образом и тогда получатся привычные цифры. Необходимые формулы были приведены при описании типов счётчиков.
Вот несколько примеров преобразований значений из этой таблицы для получения их в удобном для анализа формате:

SQL Server\Buffer Manager\Buffer Cache Hit Ratio вычисляется по следующей формуле из значений sysperfinfo:

SQL Server\Buffer Manager\Buffer Cache Hit Ratio = (Buffer Cache Hit Ratio / Buffer cache hit ratio base)*100 Значение Buffer Cache Hit Ratio относится к типу с кодом 537003008, а значение Buffer cache hit ratio base относится к типу с кодом 1073939459

Далее, по аналогии, напишем формулу для расчёта удобного для анализа формата значения счётчика SQL Server\Cache Manager Object\Cache Hit Ratio:

SQL Server\Cache Manager Object\Cache Hit Ratio = (Cache Hit Ratio с типом 537003008 / Cache Hit Ratio с типом 1073939459)*100

Как Вы видите, поскольку типы обоих счётчиков совпадают и это тип: PERF_RAW_FRACTION с кодом 537003008, вычисления выполняются по одинаковой формуле: (N0 / D0). Для масштабирования также подходит одинаковый коэффициент 100, который позволяет увидеть процентное соотношение текущего и базового показателя.

Из оставшихся двух, рекомендуемых для поиска узких мест счётчиков, значение Process\Working Set в таблице sysperfinfo отсутствует, т.к. эта таблица содержит только счётчики, относящиеся к SQL Server. Значение счётчика SQL Server\Memory Manager\Total Server Memory (KB) - может быть использовано без изменений, т.к. хранит текущий размер занимаемой памяти в килобайтах.

[В начало]

5.4. Диагностика всплесков отложенной записи

Объект \ счетчик Наблюдаемое поведение Комментарий Тип
SQL Server\Buffer Manager\Lazy Writes/sec Краткосрочные пики Число буферов, записанных в секунду процессом отложенной записи менеджера буфера. Отложенная запись - системный процесс, которые сбрасывает из блоков грязных, старых буферов (содержащие изменения, которые должны быть записаны назад на диск прежде, чем буфер сможет снова использоваться для других страниц) и делать их доступными пользовательским процессам. Отложенная запись устраняет потребность часто исполнять контрольную точку, чтобы организовать доступные буферы. PERF_COUNTER_COUNTER
Memory\Pool Nonpaged Bytes (Байт в невыгружаемом страничном пуле) Краткосрочные пики это объем в байтах специальной системной области памяти, где компоненты операционной системы запрашивают место, необходимое им для функционирования. Страницы невыгружаемого страничного пула не могут быть выгружены в файл подкачки (страничный файл) на диск и остаются в оперативной памяти в течение всего периода их использования. Этот счетчик отражает текущее значение, и не является средним значением по некоторому интервалу времени. Memory\Pool Nonpaged Bytes рассчитывается иначе, чем Process\ Pool Nonpaged Bytes, поэтому значение этого счётчика не эквивалентно Process(_Total )\ Pool Nonpaged Bytes PERF_COUNTER_RAWCOUNT
SQL Server\Buffer Manager\Page Writes/sec Краткосрочные пики Число записанных физических страниц базы данных в секунду. PERF_COUNTER_COUNTER

Вы можете наблюдать задержки физического дискового чтения и записи при запросах на I/O разделяемого между процессами дискового контроллера. Вызвано это может быть действиями клиентов, которые провоцируют повторное заполнение страницами буферного кэша, записываемые после этого на диск. Также, к подобным эффектам может привести массовое и продолжительное размещение страниц, которые должны быть записаны из буферного кэша на диск. Ещё одной причиной может быть то, что системный процесс отложенной записи совпадает или близок по времени с контрольной точкой базы данных, или если контрольная точка исполняется на базе данных, которая содержит подлежащие записи на диск страницы. В отличии от предыдущих версий, SQL Server 2000 имеет более высокую склонность к активности отложенной записи. Именно по этому, в SP3 был введён новый флаг трассировки T809, который как раз и призван решить эту проблему. Более подробно об этом флаге написано в статье FIX: SQL Server 2000 May Be More Aggressive with Lazy Writes Than SQL Server 7.0

ПРОДОЛЖЕНИЕ СЛЕДУЕТ

[В начало]

Эффективный метод постраничной выборки.

Предлагаемый метод не претендует на звание самого лучшего. Он, может быть, и не лучше, но уж точно не хуже других. Поиск решения основывался на следующих пожеланиях:

1. Обращение к новой странице выборки не должно приводить к перезапросу всей выборки.
2. Запрос страницы должен возвращать обычный привычный рекордсет.
3. Инициация не должна быть чрезмерно долгой, чтобы запрос к таблице в 1000000 строк не утомил ожиданием.
4. В любой момент должно быть разрешено выбрать любую страницу из выборки, в том числе и ранее выбранную.
5. Страница должна содержать любое задаваемое кол-во строк.
6. Страница должна начинаться с любой задаваемой строки по номеру.

Решение, удовлетворяющее всем этим пожеланиям стразу, было найдено. Вот оно:

1. Имеем запрос, который мы хотим выбирать постранично

select * from BigTable

мы его не запускаем, а переходим к шагу 2.

2. Инициализируем таким образом:

declare @handle int,@rows int
exec sp_cursoropen @handle OUT, 'select * from BigTable',1, 1, @rows OUT
select @handle, @rows

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

3. Получаем нужную страницу из выборки:

exec sp_cursorfetch @handle,16,@rowid,@rowcount

Где в @handle подставляем сохраненное значение хендла, в @rowid подставляется номер строки, с которой начинается интересующая нас страница, а в @rowcount подставляется кол-во строк на данной странице.

Шаг 3 повторяем столько сколько нужно раз.

4. Освобождаем ресурсы после того, как страницы уже больше не понадобятся

exec sp_cursorclose @handle

Глеб Уфимцев
Москва, 20 июня 2003

[В начало]

ССЫЛКИ НА СТАТЬИ

Статьи на русском языке

Мобильный OLAP
Принято считать, что OLAP — это аналитическая технология для продвинутых исследователей данных. В действительности же, OLAP-системы — это генератор отчетов, а OLAP-интерфейс — сам отчет...
Планирование и консолидация данных многомерной базы
Совершенствование управления любой организацией связано с автоматизацией бизнес процессов планирования и отчетности, внедрением бюджетирования. На опыте работ с МПС и разработки системы планирования показателей деятельности Куйбышевской железной дороги получено программное решение, позволяющее оптимизировать и ускорить бизнес процессы планирования и отчетности. Это достигается за счет возможности коллективной и одновременной работы над планами и отчетами разной степени агрегации. Новизна предлагаемого в данной статье подхода состоит в использовании сводного отчета для динамической модификации данных и навигации для построения формул>...
Человеческий фактор в управлении ИТ-проектом
ИТ-менеджеры часто забывают о влиянии человеческого фактора на решение технических задач. Не оставляйте без внимания членов проектной группы и возлагайте на них обоснованные надежды....
Учимся работать с Rational
Разработчики — далеко не самые преданные клиенты учебных центров, предпочитающие заниматься самообразованием, довольствуясь имеющимися открытыми источниками и собственной смекалкой. Однако инструментальные средства Rational Software не только отличаются сложностью, с которой трудно справиться на пути самообразования, но и предназначены для работы в команде. Индивидуальным освоением продуктов Rational не обойтись...
Построение информационно-аналитической системы
Комплексное развитие информационной инфраструктуры компании на основе современных информационно-аналитических технологий и хранилищ данных позволяет улучшить эффективность работы компании. Использование специализированных продуктов значительно упрощает управление информационно-аналитической системой, а в большинстве случаев является единственным способом поддержания ее работоспособности...
Интеграция данных предприятия
Системы управления документами возникли в начале 90-х годов в ответ на растущую потребность совместного использования, хранения и поддержки электронных документов различных форматов, доля которых в общем объеме документооборота предприятий год от года увеличивалась. К этому времени предприятия уже испытывали большие трудности с обработкой информации: содержимое разнородных хранилищ использовалось крайне неэффективно, а поиск критичных для бизнеса сведений требовал слишком большого времени...
Виртуальная консолидация данных
Наиболее критичные проблемы, с которыми сталкивается сегодня ИТ-сообщество — обеспечение надежного, бесперебойного, постоянного и полнофункционального доступа к актуальным данным. Единственным разумным на сегодняшний день способом справиться с нарастающим информационным потоком является организация сетевого способа обработки и хранения данных...
Особенности построения информационных хранилищ
При реализации проектов построения хранилищ данных возникает ряд общих задач, независящих от предметной области: проектирование структуры, актуализация агрегатных значений. В статье рассмотрены возможные пути решения этих задач и способы реализации иерархических измерений...
Методы организации хранения данных в СУБД
Среди самых важных характеристик любой базы данных следует назвать производительность, надежность и простоту администрирования. Знание того, как большинство СУБД физически хранят данные во внешней памяти, представление о параметрах этого хранения и соответствующих методах доступа может очень помочь при проектировании баз данных, обладающих заданной производительностью...
Что в Windows 2003 от .NET
Три года прошло с момента выхода семейства операционных систем Windows 2000, и вот сейчас мы встречаем следующее поколение серверных версий — Windows 2003 (или NT версии 6.0). Все семейство новых операционных систем Microsoft объединено маркой Windows Server System, что по аналогии с переименованием семейства Office следует признать вполне логичным. Новое имя указывает на давно уже ставшую фактом сложность информационных систем компаний. Только интегрированные между собой и открытые для взаимодействия компоненты способны помочь в снижении затрат на развертывание и обслуживание современных ИТ-систем. Кроме того, новый бренд серверной платформы заставляет взглянуть на Windows Server как на основу построения интегрированной серверной инфраструктуры, основанной на продуктах Microsoft...

[В начало]

Новые и обновлённые технические статьи Microsoft

BUG: DBO User Does Not Display in Enterprise Manager
BUG: Snapshot Failures Occur When You Use an Alternate Snapshot Folder or FTP and the First Article is Dropped from the Publication
BUG: SQL 6.5 Logins Upgraded to SQL 7.0 and Subsequently Moved to SQL 2000 Through CDW Cannot Log In
BUG: Transfer Login Task Is Slow with a Large Number of Logins
BUG: Using the Auto_Fix Option with sp_change_users_login Can Leave Security Vulnerabilities
FIX: A DML Operation on a Large Table Can Cause Performance Problems
FIX: A Lazy Aggregation Might Fail After an Incremental Update of a Changing Dimension
FIX: Analysis Services Service Quits During Processing and Does Not Restart
FIX: Cannot Create an Offline Cube That Contains a Parent-Child Dimension
FIX: HTTP Connections to Analysis Services Server Computers Running Windows Server 2003 Are Slow
FIX: Incremental Update Process May Fail On Cubes or Partitions That Use the HOLAP Storage Mode
FIX: Osql.exe May Not Run Batches As Fast As Other ODBC-Based Applications
FIX: Pending Writeback May Cause Results that Are Not Accurate
FIX: Query Results Are Not Correct After You Perform an Incremental Update of a Changing Dimension and a Virtual Dimension
FIX: Remote Partitions Are Marked as "Unprocessed" After You Perform an Incremental Update of a Virtual Dimension
FIX: SQLTables() Function Returns No Data for SQL Server Database Names That Contain Underscore
FIX: sysindexes.statblob Column May Be Corrupted After You Run a DBCC DBREINDEX Statement
FIX: The Processing of a Cube That Contains a Virtual Dimension Fails with Error Message: "Object does not exist"
FIX: UPDATE CUBE Statement Returns an Error When You Try Update a Measure in a Virtual Cube
How to Obtain the Latest SQL Server 2000 Notification Server Service Pack
HOW TO: Configure ASP.NET for Persistent SQL Server Session State Management
HOW TO: Move Databases Between Computers That Are Running SQL Server
HOW TO: Read and Write a File to and from a BLOB Column by Using Chunking in ADO.NET and Visual C++ .NET
HOW TO: Remove a SQL Server Service Pack
HOW TO: Resolve Permission Issues When You Move a Database Between Servers That Are Running SQL Server
INF: Disaster Recovery Articles for Microsoft SQL Server
INF: Enhancements to SQL Server 2000 Notification Services Service Packs
INF: Frequently Asked Questions - SQL Server 7.0 - Log Shipping
INF: Moving SQL Server Databases to a New Location with Detach/Attach
INF: SQL Server 2000 Notification Services Service Pack 1 Readme.htm Additions
INF: Understanding and Troubleshooting the Copy Database Wizard in SQL Server 2000
INF: UPDATE Statements May be Replicated as DELETE/INSERT Pairs
Post a Question to the Microsoft SQL Server Newsgroups
PRB: "SQLDMO Has Not Been Registered" Error Message If You Remove SQL Server Desktop Engine
PRB: Windows Server 2003 Support for SQL Server 2000
Support WebCast: Microsoft SQL Server 2000 Desktop Engine (MSDE) Installation, Deployment, and Patching
Updated Documentation for NSDiagnosticFailedNotifications with SP1

[В начало]

Англоязычные статьи

Who Are You? (as a DBA)
Steve Jones
Are you a 229 or a 228? Which is it? Are you more of a 229 kind DBA or a 228? You might look a little confused by now. Probably shaking your head wondering if Steve has lost it after too many years with SQL Server. While that may be true, there is a little method to my madness
UDF as Computed Column
Dinesh Priyankara
As all of you know, User-Defined Functions greatly helps us in development. In this Article I will show you that how to add a function as a computed column. Adding a scalar function to a table makes other developers life easier and sometimes it enhance performance greatly if it is made as part of an index. But remember, you can make an index on UDF, if it is deterministic. See BOL for more information about determinism. Now let’s see that how to add a function to the table
Understanding the difference between IS NULL and = NULL
James Travis
When a variable is created in SQL with the declare statement it is created with no data and stored in the variable table (vtable) inside SQLs memory space. The vtable contains the name and memory address of the variable. However, when the variable is created no memory address is allocated to the variable and thus the variable is not defined in terms of memory
In the Real World - Lost Data Chains
Steve Jones
It was late one Thursday when I got a call about a SQL Server being pegged. Sure enough when I logged in and checked the Task Manager from Terminal Services, the CPU was in the 95-98% range constantly for the SQL Server Process.

[В начало]

ФОРУМ SQL.RU

Самые популярные темы недели

Междумордие
Кто на чем пишет клиентов под SQL Server?
Защита и взлом SQL
identity и репликация
вопрос о необходимости денормализации - частный случай
Пацаны! вопрос на засыпку чиста! :)
Резкая деградация производительности. Ваши комментарии мне очень нужны!!
Быстрый UPDATE на основании выборки.
Деление на ноль
Как в Delphi поставить SQLDMO и как его юзать?
Как использовать файлы запросов в Transact-SQL
циклические последовательности
Сиквелом сохранить содержимое blob поля в файл на сервере
Список пользователей в домене через SQL?
Помогите новичку !!!
Как вычисляются функции в запросах
Identity или RAND() ? ;)
Совет по Тригеру
BULK INSERT работает с перебоями
Тест для мозгов и компьютеров
Backup или нет? Help!
Как получить событие изменения структуры БД?
IDENTITY мешает insert ! Как побороть?
Хранимые процедуры и VB6
SQL запрос в письме ...
Хочется посмотреть структуру базы у Navision или ещё чего крутого.
XSL в SQL Server 2000 - почему не работает?
Долгий-долгий запрос, можно ли ускорить?
Навеяло...
А можно ли создавать таблицыи поля с рускими именами?
Счётчик...
Проблема с переносом БД SQL7.0 с одного сервера на другой используя Backup/Resto
запрос на засыпку
Джентльмены, как исключить из таблицы повторяющиеся строки?
Не выполняется запрос с большим количеством аргументов в операторе IN
OFF: Как проверить правильно ли настроен RAID?
ограничение доступа юзера к записи после 72 часов
OpenRowset, connection string & MS Indexing Service
хелп новичку, пишу первый в жизни тригер
Bulk Insert, права и временная таблица.
И опять безопасность....
Логирование ошибок в UDF
Бага
транзакции на сервере и RAISERROR
Помогите с запросом...плиз....
Эксклюзивный коннект
Использование в качестве ключа VarChar - хорошо ли это
удаление данных, которых нет вдругой таблице
MSSQL2000 Personal Edition & Client
Не могу понять: оперативки хоть .... ешь, а SQL грузит проц.
Как определить свободное место на сервере ?
Как хранить разницу между двумя датами
Часто используемая таблица, кеширование?
Настройка Profiler для отлавливания deadlock'ов
properties sql server agent -> general
Log заполнил весь диск
печально все это... (SELECT... FOR XML)
OPENROWSET и права на его использование
Как сделать identity поле?
Динамический запрос
Scope_identity не работает!
Подскажите пожалуйста , люди добрые, можно ли в socket 478 втыкать socket 423?
Вот прикол! Делаю запрос и ... ничего
Можно ли в качестве одного из параметров SP брать по очереди данные из колонки?
Хитро сменить коннект
не работает простой запрос с isnull
Оптимизация системы, поиск пути

[В начало]

Вопросы остались без ответа

печально все это... (SELECT... FOR XML)
OPENROWSET и права на его использование
Как сделать identity поле?
Динамический запрос
Scope_identity не работает!
Подскажите пожалуйста , люди добрые, можно ли в socket 478 втыкать socket 423?
Вот прикол! Делаю запрос и ... ничего
Можно ли в качестве одного из параметров SP брать по очереди данные из колонки?
Хитро сменить коннект
не работает простой запрос с isnull
Оптимизация системы, поиск пути

[В начало]

ПОЛЕЗНОСТИ

Рассылка:  Вопросы и ответы по Microsoft SQL Server

Автор рассылки: Сергей Кошкин

Выпуск No. 18 от 2003-06-20
Вопрос : Как в запросе обрабатывать данные предыдущей строки?
Ответ

[В начало]


Вопросы, предложения, коментарии, замечания, критику и т.п. присылайте Александру Гладченко на адрес: mssqlhelp@pisem.net

sql.ru Описание рассылки

МИНИФОРМА
ПОДПИСКИ




http://subscribe.ru/
E-mail: ask@subscribe.ru
Отписаться
Убрать рекламу

В избранное