SQL Server DBA blog
Alexander Lozhechkin [MSFT]
Саша, рад что ты снова начал поддерживать свой блог ;) А фишка optimize for несомненно хороша, в работе вполне может пригодиться.
Thanx for the info
pwdencrypt and pwdcompare functions does not appear in BOL or In MS SQL Server 2000 SP4, any reason for that?
Very helpful...Thank you very much!
I am very Happy to see password encryption methodolgy. Fentastic
Купил книжку на www.oz.by. Доволен. Правда статей маловато. (Да, я знаю остальное можно, как всегда найти в инете, но хочеться иметь бумажную версию под рукой ;-) )
Great!!! Very helpfull
excellent. you have effectively shown that these hash values from SQL Server 2000 are acceptable to SQL Server 2005.
Коллеги, не знаю как давно это случилось, но на MSDN2 появилась русская документация по SQL Server 2005.
I believe it's supposed to be 'QueryState', not a 'QueryStatus'
2 BugsBunny
Очень даже может быть... не ковырялись...
Alexander:
How difficult is guessing a password hashed with pwdencrypt?
некоторые репорты не выполняются из-за ошибок...
2 Javier
It will strongly raise CPU utilization... (IMHO)
An excellent entry, I did reference to your blog, at one entry related to pwdencrypt and pwdcompare.
Regards.
Видел книгу на Олимпийском за 450 руб.
В последнее время, наиболее полезными и интересными ресурсами интернета, которые посвящены всему спектру
re: マイクロソフト SQL Server 各チーム、関係者が書き綴るブログは 40 以上
I'm amazed to see the numerous list of Blog roll for SQL Server that comprises whole lot of professionals
В дополнение к посту <A href="msmvps.com/.../2007
Ян Либерман написал небольшой VB-скрипт, который показывает все относящиеся к SQL Server ключи: blogs.gotdotnet.ru/.../PermaLink.aspx
После того, как BOL стал обновляться через Microsoft Update , этот вопрос, наверняка, будет волновать
In my first message, I had forgotten to thank you for the information. I have been doing tests. Very interesting.
Этот запрос возвращает список индексов, которые никогда не использовались в планах исполнения запросов, и показывает число изменений на страницах каждого такого индекса. Вы можете найти не только индексы, которые лежат в базе данных мёртвым грузом, но
Практика показывает, что использование гаджетов (мини-приложений для боковой панели Windows Vista) для задач мониторинга производительности и работоспособности SQL Server оказывается очень удобным инструментом. Вся прелесть подобных мини-приложений в
Portqry.exe - это запускаемая из командной строки или посредством графического пользовательского интерфейса программа, которую можно использовать при устранении неполадок с подключениями к SQL Server по протоколу TCP/IP. Средство Portqry.exe работает
По сути это тот же ФреймВорк, только в командной строке, ужас, вдруг админ себя программером почувствует! =)))
Ещё один способ, который не требует запуска служб:
Описание: Determines ssnetlib.dll version of SQL Server without the need to log into the server. Uses techniques from SQLPing.NET 1.3 beta but does not actually use the UDP 1434 packet for enumeration. This tool simply connects to the specified TCP port and gets to work! C# Source included. Requires .NET framework.
Размер скачиваемого файла: 4 K
Дата: 03/01/2005
Автор: Chip Andrews
Скачать: www.sqlsecurity.com/.../Default.aspx
Вы, наверное, уже заметили, какую полезную информацию об индексах и о статистике использования существующих
How to manually remove a Microsoft SQL Server 2000 Desktop Engine (MSDE 2000) instance
support.microsoft.com/.../320873
Useful Tricks for Finding Missing and Bad Indexes in SQL Server 2005
glennberrysqlperformance.spaces.live.com/.../cns!45041418ECCAA960!770.entry
Ещё одно, комплексное решение, учитывающее наличие LOB-полей: "SQL Server 2005 - Backup, Integrity Check and Index Optimization" ( blog.ola.hallengren.com/.../3440068.html )
Для работы dm_db_index_physical_stats уровень совместимости базы данных должен быть не ниже 90.
Александр, а есть ли толк в дефрагментации не кластеризованных индексов? ИМХО нет, можно оставить только кластеризованные.
И ещё, для работы в режиме совместимости 80, вместо DB_ID() достаточно задать её через переменную, например
DECLARE @DB_ID int;
SET @DB_ID = (SELECT DB_ID());
И дальше вместо DB_ID() использовать @DB_ID.
Дефрагментировать стоит любую материализуемую структуру :) Однако, если дефрагментируется кластеризованный индекс, это приводит к автоматическому пересозданию остальных индексов таблицы. Представленный тут сценарий это учитывает, и не затрагивает некластеризованные индексы, если дефрагментируется кластерный индекс.
Александр, я конечно могу ошибаться...
>Дефрагментировать стоит любую материализуемую структуру :-)
Но, при перестроении индекса в куче (таблица, не имеющая кластеризованного индекса)фрагментация остаёться практически такой-же.
Здесь единственное (по крайней мере пока для меня единственное извесное) это создать в куче кластерный индекс и потом сразу его удалить, при создании он упорядочит данные и фрагментация уменьшиться.
Если база большая ( > несколько сотен Гб), операции с индексами займут продолжительное время, во время перестройки индексов огромные очереди на дисках, работа базы сильно замедляеться, а если система 24/7 это не есть гуд, ИМХО лучше не тратить драгоценное время на перестроение некластерных индексов.
Дефрагментируя не кластерезованный индекс кучи, вы, тем самым, дефрагментируете страницы индекса. Данные затронуты не будут. Если индекс покрывающий, или селективность выборки высока, эффект от дефрагментации будет ощутим.
Размещение файлов и объектов среди файловых групп для больших баз данных нужно планировать так, чтобы нагрузка обслуживания индексов не оказывала чрезмерного воздействия на работу пользователей. Разумеется, для систем с поддержкой 365x24x7 необходимо учитывать требования высокой доступности, и использовать соответствующие решения. Реально, для этого нужен SQL Server 2005 Enterprise Edition, а новая версия SQL Server 2008 привнесёт ещё больше свободы.
Кстати, для больших таблиц как раз выгоднее наличие короткого кластеризованного индекса, он поможет сгруппировать данные так, как выгодно с точки зрения производительной выборки… хотя бы заменит поиск – поиском по диапазону ключа ;)
Команда выпуска сервисных пакетов внесла небольшие изменения в модель выпуска, теперь, больший упор будет сделан на Incremental Servicing Model. Подробности можно почитать в блоге команды выпуска: blogs.msdn.com/.../a-changed-approach-to-service-packs.aspx
И ещё одна полезная ссылка:
blogs.msdn.com/.../sql-server-2005-sp3-and-self-service-hotfixes.aspx
качественная статья для чайников которые всетях нечего не понимают!
Кстати шрифт по больше бы то не разглядят :))
Если не трудно, подскажите как быть для версии SQL 2005... я не совсем понимаю что именно происходит в сценарии, поэтому не могу самостоятельно перевести.
Спасибо.
> Однако, если дефрагментируется кластеризованный индекс, это приводит к автоматическому пересозданию остальных индексов таблицы
небольшая поправочка: не приводит
www.sqlskills.com/.../SearchEngineQA19MisconceptionsAroundIndexRebuildsAllocationBULKLOGGEDModeLocking.aspx
Требования маленькие, но объем большой, скачал, дома буду изучать)))
Great list! Keep up the good work. I'll be going through this in the coming days and adding those that are active and have interesting content to the SQLblog Roller:
sqlblog.com/.../roller.aspx
Huge blogroll list, some links aren't working though.
Для 32х битного 2005 ,находится там же.
Спасибо
Все то, о чем написал Александр, конечно же нужно делать ДО ТОГО как. Ну а для тех, кто как я, забывает сделать это вовремя, может оказаться полезной инструкция как исправить геометрию дискового массива ПОСЛЕ ТОГО как на нем был установлен и пропатчен SQL Server.
Итак имеем:
4-х узловый кластер Win2003 с 3-мя SQL Server 2005 инстансами; необходимо исправить геометрию RAID массива каждого инстанса.
1. Каждый SQL Server инстанс должен находиться на отдельном узле.
2. На первом узле перевести все ресурсы в режим offline, за исключением дискового ресурса на котором был установлен SQL Server, скажем диска R.
3. Запустить Disk Management и посмотреть какой физический диск соответствует логическому диску R; допустим это диск 1.
4. В командной строке набрать:
diskpar –i 1
где 1 это номер физического диска.
Эта команда покажет Drive Partition Information, которая будет выглядеть примерно так:
StatringOffset = 32256 – это значение некорректно и должно быть изменено
PartitionLength = 2017118283264
HiddenSectors = 63 – это значение некорректно и должно быть изменено
PartitionNumber = 1
PartitionType = 7
5. Скопировать ВСЮ информацию с диска R на локальный диск C используя команду xcopy с параметрами копирования файлов и каталогов включая ownership и ACL.
xcopy R:\*.* C:\DiskR /E /K /O /X
6. Перевести диск R в режим offline.
7. Проверить существующие зависимости ресурса диск R от других ресурсов (должна быть только одна зависимость от службы SQL Server) и удалить ее.
8. Удалить ресурс диск R из кластерной группы.
9. Запустить Disk Management и удалить логический раздел R на физическом диске 1.
10. В командной строке запустить утилиту DISKPART и выполнить следующие команды:
DISKPART> select disk 1
Disk 1 is now the selected disk.
DISKPART> create partition primary align=64
DiskPart succeeded in creating the specified partition.
DISKPART> exit
11. Проверить геометрию дискового массива 1 после исправления
Теперь Drive Partition Information должна выглядеть примерно так:
StatringOffset = 65536 – новое корректное значение
PartitionLength = 2017118249984
HiddenSectors = 128 – новое корректное значение
PartitionType = 6
12. Запустить Disk Management и пересканировать диски. Присвоить букву R физическому диску 1. Отформатировать диск R с 64 KB allocation unit size.
13. Создать ресурс диск R в кластерной группе.
14. Установить зависимость диска R от службы SQL Server.
15. Перевести диск R в режим online.
16. Скопировать информацию с локального диска C обратно на диск R.
xcopy C:\DiskR\*.* R:\ /E /K /O /X
17. Перевести все оставшиеся ресурсы кластерной группе в режим online.
18. Перезагрузить сервер на узле 1 (последнее может быть не обязательно, но так, на всякий случай).
19. Повторить 1 – 18 для оставшихся кластерных групп.
Сергей, спасибо!
Один только вопрос, а почему у тебя смещение 128Кб? ...такой размер блока был выбран на RAID-массиве?
SELECT [Объект индексации]= OBJECT_NAME(mid.object_id), [Рекомендуемый индекс]= '-- CREATE INDEX [IX_' + OBJECT_NAME(mid.object_id) + '_' + CAST(mid.index_handle AS nvarchar) + '] ON ' + mid.statement + ' (' + case when mid.equality_columns IS NOT NULL and mid.inequality_columns IS NOT NULL then mid.equality_columns +’,’+ mid.inequality_columns when mid.equality_columns IS NULL and mid.inequality_columns IS NOT NULL then mid.inequality_columns when mid.equality_columns IS NOT NULL and mid.inequality_columns IS NULL then mid.equality_columns end + ') '+ case when mid.included_columns IS NOT NULL then 'INCLUDE (' + mid.included_columns+');' else '' end, [Число компиляций] = migs.unique_compiles, [Число операций поиска] = migs.user_seeks, [Число операций просмотра] = migs.user_scans, [Средняя стоимость ] = CAST(migs.avg_total_user_cost AS int), [Средний процент выигрыша] = CAST(migs.avg_user_impact AS int) FROM sys.dm_db_missing_index_groups migJOIN sys.dm_db_missing_index_group_stats migs ON migs.group_handle = mig.index_group_handleJOIN sys.dm_db_missing_index_details mid ON mig.index_handle = mid.index_handleAND mid.database_id = DB_ID()ORDER BY mid.object_id
Ещё один тест на сравнение производительности с выравниванием и без: forums.microsoft.com/.../ShowPost.aspx
SET NOCOUNT ONSET DEADLOCK_PRIORITY LOWDECLARE @SQL nvarchar(2048), @db int, @@SQL2 nvarchar(max), @ErrorID intSET @@SQL2 = 'DECLARE @SQL nvarchar(2048);'DECLARE usersdatabases CURSOR GLOBAL FAST_FORWARD READ_ONLY FORSELECT database_id FROM sys.databasesWHERE (CAST(case when name in ('master','model','msdb','tempdb') then 1 else is_distributor end AS bit)=0 AND CAST(isnull(source_database_id, 0) AS bit)=0)ORDER BY [name]
OPEN GLOBAL usersdatabasesWHILE 1 = 1BEGIN FETCH usersdatabases INTO @db IF @@fetch_status <> 0 BREAK SET @@SQL2 = @@SQL2 + ' USE ' + DB_NAME(@db) + '; DECLARE reindex' + CAST(@db AS nvarchar) + ' CURSOR GLOBAL FAST_FORWARD READ_ONLY FOR SELECT ''ALTER INDEX ALL ON ['' + DB_NAME(' + CAST(@db AS nvarchar) + ')+ '']..['' + OBJECT_NAME(afp.[OBJECT_ID]) + ''] REBUILD WITH (SORT_IN_TEMPDB = ON);'' AS [Инструкция T-SQL] FROM ' + DB_NAME(@db) + '.sys.dm_db_index_physical_stats (' + CAST(@db AS nvarchar) + ', NULL, NULL, NULL, ''SAMPLED'') AS afp WHERE afp.database_id = ' + CAST(@db AS nvarchar) + ' AND afp.index_type_desc IN (''CLUSTERED INDEX'') AND (afp.avg_fragmentation_in_percent >= 15 OR afp.avg_page_space_used_in_percent <= 60) AND afp.page_count > 12 UNION ALL SELECT [Инструкция T-SQL] = CASE WHEN afp.avg_fragmentation_in_percent >= 15 OR afp.avg_page_space_used_in_percent <= 60 THEN ''ALTER INDEX ['' + i.name + ''] ON ['' + DB_NAME(' + CAST(@db AS nvarchar) + ') + '']..['' + OBJECT_NAME(afp.[OBJECT_ID]) + ''] REBUILD WITH (SORT_IN_TEMPDB = ON);'' WHEN (afp.avg_fragmentation_in_percent < 15 AND afp.avg_fragmentation_in_percent >= 10) OR (afp.avg_page_space_used_in_percent > 60 AND afp.avg_page_space_used_in_percent < 75) THEN ''ALTER INDEX ['' + i.name + ''] ON ['' + DB_NAME(' + CAST(@db AS nvarchar) + ') + '']..['' + OBJECT_NAME(afp.[OBJECT_ID]) + ''] REORGANIZE;'' END FROM ' + DB_NAME(@db) + '.sys.dm_db_index_physical_stats (' + CAST(@db AS nvarchar) + ', NULL, NULL, NULL, ''SAMPLED'') AS afp JOIN ' + DB_NAME(@db) + '.sys.indexes AS i ON (afp.[OBJECT_ID] = i.[OBJECT_ID] AND afp.index_id = i.index_id) AND afp.database_id = ' + CAST(@db AS nvarchar) + ' AND afp.index_type_desc IN (''NONCLUSTERED INDEX'') AND ( (afp.avg_fragmentation_in_percent >= 10 AND afp.avg_fragmentation_in_percent < 15) OR (afp.avg_page_space_used_in_percent > 60 AND afp.avg_page_space_used_in_percent < 75) ) AND afp.page_count > 12 AND afp.[OBJECT_ID] NOT IN ( SELECT [OBJECT_ID] FROM ' + DB_NAME(@db) + '.sys.dm_db_index_physical_stats (' + CAST(@db AS nvarchar) + ', NULL, NULL, NULL, ''SAMPLED'') WHERE database_id = ' + CAST(@db AS nvarchar) + ' AND index_type_desc IN (''CLUSTERED INDEX'') AND (avg_fragmentation_in_percent >= 15 OR avg_page_space_used_in_percent < 60) AND page_count > 1 ) ORDER BY [Инструкция T-SQL]'
SET @@SQL2 = @@SQL2 + ' OPEN GLOBAL reindex' + CAST(@db AS nvarchar) + ' WHILE 1 = 1 BEGIN FETCH reindex' + CAST(@db AS nvarchar) + ' INTO @SQL IF @@fetch_status <> 0 BREAK EXEC(@SQL) PRINT @SQL END CLOSE GLOBAL reindex' + CAST(@db AS nvarchar) + ' DEALLOCATE GLOBAL reindex' + CAST(@db AS nvarchar) + ''
--PRINT @dbENDCLOSE GLOBAL usersdatabasesDEALLOCATE usersdatabasesDECLARE @SQL1 nvarchar(500)--PRINT @@SQL2EXECUTE master..sp_executesql @@SQL2 ,N'@SQL1 nvarchar(2048) OUTPUT' ,@SQL1 = @SQL1 OUTPUT--PRINT('----------------------')--PRINT @SQL1GO
Ещё один метод "Proactive Deadlock Notifications": blogs.lessthandot.com/.../DataMgmt
Тут используется DBCC TRACEON (3605,1204,1222,-1)
Ещё один сценарий: weblogs.asp.net/.../6819737.aspx
Спасибо Александр за описание требований к обслуживанию БД. Это очень полезные два документа, которые формализуют деятельность DBA.
Уже стало для меня некой традицией в начале года верстать очередной, актуальный BlogROLL . За основу
И где ее можно купить?
Список магазинов: www.ecom.ru/SiteItem.aspx
Эта новость появилась в блоге itcommunity.ru - Издательство Эком Паблишерз выпустил в свет "Репликация
Вы же наверное ни все читаете из этого. Назовите TOP 5 блогов для Вас.
Слежу за всем, а читаю только то, что заинтересует. Мало того, все полезные материалы складываю в архив, по которому потом могу искать локальным поиском (так получается эффективнее, чем "гуглить"). Лучшую пятёрку назвать не берусь... тут дело сотней попахивает :)))
Первый магазин, разместивший информацию о книге на своём сайте: www.mdk-arbat.ru/bookcard_all4.aspx
Книга на ОЗОНЕ: www.ozon.ru/.../4263488
На озоне книги нет :)
Точнее: "Сообщить о поступлении в продажу".
Альянс-книга: www.alians-kniga.ru/.../UID_463.html
Теперь сборник можно заказать на сайте издательства ЭКОМ: www.ecom.ru/BookItem.aspx
Сборник на сайте сети книжных магазинов "Деловая литература" г. Ростов-на-Дону: www.bbook.ru/modules.php
В дополнение к посту Александра Гладченко “Как определить, какой CD-KEY использовался для установки SQL...
Ещё сылки, где можно заказать или найти нашу книгу:
http://books.allmedia.ru/showTov.asp?Cat_Id=574828http://books.businesstest.ru/showTov.asp?FND=&Cat_id=575281http://books.claw.ru/showTov.asp?Cat_Id=574828http://books.md.icsmir.ru/showTov.asp?Cat_Id=574828http://dmu201.semir.mesi.ru/showTov.asp?Cat_Id=574828http://kniga4.ru/good/4263488http://litera.by/book14755.htmlhttp://market.yandex.ru/model.xml?modelid=3974592http://russia-book.ru/book.php?t=4341265&go=1070843http://shop.top-kniga.ru/books/item/in/399815/http://vaschakniga.ru/view.php?t=639023&go=11283http://www.alians-kniga.ru/shop/UID_463.htmlhttp://www.bbook.ru/modules.php?name=Book&k=0023238http://www.biblion.ru/product/604246/http://www.booka.ru/books/411427http://www.bookin.org.ru/books/j33000012871.htmlhttp://www.bookler.ru/bookbuy/55/435712.shtmlhttp://www.bookline.ru/book4263488.htmhttp://www.bookoved.ru/kn.php?t=587037&go=46http://www.books.ru/shop/books/641275http://www.favorite-book.ru/cart.php?action=addcart&info=4263488http://www.goodreads.ru/books/1998430/default.aspxhttp://www.gorbushka.ru/?search=%E3%EB%E0%E4%F7%E5%ED%EA%EE&submit.x=41&submit.y=10http://www.hugahuga.ru/item/1002415550.htmlhttp://www.knigi-o.com/product_info.php?products_id=59983&osCsid=ad49b9700735a7dcbae588beeb783c0fhttp://www.kupitknigu.ru/books/1778991.shtmlhttp://www.labirint-shop.ru/books/187884/http://www.libring.ru/book385283http://www.lit.by/production/view/?id=62287http://www.mdk-arbat.ru/bookcard_all4.aspx?book_id=2532277http://www.moscowbooks.ru/book.asp?id=448649http://www.my-shop.ru/shop/books/435712.htmlhttp://www.ozon.ru/context/detail/id/4263488/http://www.qpig.ru/showTov.asp?Cat_Id=574828http://www.regionbook.ru/goods.php?id=11488http://www.sprinter.ru/books/1778991.htmlhttp://www.ukazka.ru/product-book469472.htmlhttp://www.wwww4.com/w4198/620572.htmhttp://www.ykbook.ru/goods.php?id=11325http://www.zone-x.ru/showTov.asp?Cat_Id=574828http://www.anybook.ru/index.php
Для SQL Server 2008 ситуация изменилась, разница между TOP 100 и TOP 101 уже не так заметна и ROWCOUNT даёт сравнимые по времени результаты.
Не разбирался. Но.
select @@version
Microsoft SQL Server 2005 - 9.00.4035.00 (Intel X86) Nov 24 2008 13:01:59 Copyright (c) 1988-2005 Microsoft Corporation Enterprise Edition on Windows NT 5.2 (Build 3790: Service Pack 2)
Msg 14234, Level 16, State 1, Procedure sp_verify_job, Line 192
The specified '@notify_email_operator_name' is invalid (valid values are returned by sp_help_operator).
Msg 14294, Level 16, State 1, Procedure sp_verify_job_identifiers, Line 20
Supply either @job_id or @job_name to identify the job.
Msg 8145, Level 16, State 1, Procedure sp_add_jobschedule, Line 0
@schedule_uid is not a parameter for procedure sp_add_jobschedule.
“Optimize For” enhancement in SQL Server 2008: decipherinfosys.wordpress.com/.../optimize-for-enhancement-in-sql-server-2008
TO Dmitry,
Это моя промашка, не следовало оператора задавать, которого у других нет :( Попробуйте закоментировать строку, как после моего исправления...
Под руками только 2005 сервер.
Поэтому еще строчку:
--, @schedule_uid=N'ffb0a0d2-93bc-49d0-9fc7-4e35140bfd9f'
закомментировать, чтобы ошибки не было:
Прочитал сегодня интересный рецепт, как быстро определить, кто даёт слабину, процессор или дисковая...
Приветствую!
Я так понял что идеальная система должна стремиться к отношению 50% / 50% ?
Обязательно проверю на своих подопечных! :)
Хорошая заявка на инструмент экспресс оценки прозводительности сервера.
Нашёл вот такую информацию:
------
sqlcat.com/.../sql-server-2005-oltp.aspx
Признаки нехватки ресурсов ЦП
•Значение счетчика SignalWaits превышает 25 % от общего времени ожидания. Просмотреть значения времени ожидания сигнала и общего времени ожидания можно в представлении sys.dm_os_wait_stats. SignalWaits — это время, проведенное в очереди на запуск в ожидании процессора. Высокое значение этого параметра свидетельствует о нехватке ресурсов процессора.
т.е. если по колонке "ожидание сигнала %" мы получаем число 25% и выше - необходимо рассмотреть вопрос замены ЦП на более производительные или увеличить их количество.
Похоже, что сооношение должно быть близко к 20/80 :)))
Я исправил пару ошибок в сценарии и поменял результаты, теперь должно правильно показывать (Спасибо Сергею Гавриленко за внимательность)
BCE! 0.77 99.23 33334353412
BROKER_RECEIVE_WAITFOR 0.00 100.00 5577445296
BROKER_TASK_STOP 0.01 99.99 3467775000
SQLTRACE_BUFFER_FLUSH 0.00 100.00 3466867968
LAZYWRITER_SLEEP 0.02 99.98 3466695109
BACKUPBUFFER 0.90 99.10 3307504062
WRITELOG 3.49 96.51 2522062093
CXPACKET 0.47 99.53 1997941718
PAGEIOLATCH_SH 0.07 99.93 1726839843
BACKUPIO 1.10 98.90 1201220781
LCK_M_IX 0.05 99.95 1052778187
ASYNC_IO_COMPLETION 0.00 100.00 963511093
LCK_M_U 0.30 99.70 794246921
OLEDB 0.00 100.00 648973906
LCK_M_IS 0.02 99.98 579903093
PAGEIOLATCH_EX 0.19 99.81 558565531
LCK_M_S 0.02 99.98 426800484
ASYNC_NETWORK_IO 2.60 97.40 372790531
LATCH_EX 0.77 99.23 342325265
PAGELATCH_SH 0.16 99.84 154191937
LCK_M_SCH_S 0.00 100.00 128086390
Счетчики с одного из продакшен серверов, БД "ИТ-Предприятие" http://www.it.ua/
Тип ожидания ожидания сигнала % ожидания ресурса % ожидания ms
------------------------------------------------------------ ---------------------- ---------------------- --------------------
BCE! .04 99.96 5147048373
LAZYWRITER_SLEEP .00 100.00 4898999906
BROKER_TASK_STOP .00 100.00 93756515
BROKER_RECEIVE_WAITFOR .00 100.00 40067593
PAGEIOLATCH_SH .07 99.93 20876453
MSQL_DQ .00 100.00 15833046
CXPACKET 2.79 97.21 13921187
BACKUPIO .05 99.95 11823671
ASYNC_IO_COMPLETION .00 100.00 9554437
BACKUPBUFFER .10 99.90 9515000
OLEDB .00 100.00 8276500
BACKUPTHREAD .03 99.97 4446234
DTC .00 100.00 4265875
SLEEP_BPOOL_FLUSH .38 99.62 3841156
SLEEP_TASK 5.71 94.29 3395703
ASYNC_NETWORK_IO 4.79 95.21 1505109
PAGEIOLATCH_EX .06 99.94 1464828
WRITELOG 1.38 98.62 1354609
SOS_SCHEDULER_YIELD 99.03 .97 1099296
SQLTRACE_BUFFER_FLUSH .00 100.00 608000
LCK_M_IS .00 100.00 566703
Вспомнил ещё один фактор, который может существенно усложнить вставку - это наличие у таблицы материализованных представлений.
Выполнил запрос на своей продуктовой базе (sql2005,x64,EE+sp3) - некоторые таблицы повторяются с различными данными...:(
Если у вас используется секционирование, нужно соответственно переделать этот сценарий.
Секционирования нет, данные отличаются только в этих колонках :
[TableName]| [Pages]| [Rows]| [AverageRecordBytes]| [AverageFragmentationPercent]
...
_Anthology 23 570 288 4
_Anthology 553 1177 2760 0
_Anthology_Lang 25 59 2981 0
_Anthology_Lang 2 23 555 50
_Editorial 2 42 191 50
_Editorial 36 88 2394 0
_EditorialAuthors 1 5 272 0
_EditorialAuthors 1 10 450 0
_Errors 89700 1043600 614 0
_Errors 10504 491000 166 3
Я поправил сценарий (убрал неклаастеризованные индексы), попробуйте ещё...
Для UPDATE STATISTICS почему-то не работает, зато работает с ALTER FULLTEXT CATALOG .. REORGANIZE.
Одной из распространённых задач систем с высокой транзакционной загрузкой является определение того,...
msmvps.com/.../1694801.aspx(на примере полки с 14 одинаковыми...
Счетчики с продакшен базы:
BCE! .13 99.87 19413365701
LAZYWRITER_SLEEP .01 99.99 6227846031
SQLTRACE_BUFFER_FLUSH .00 100.00 6227180125
OLEDB .00 100.00 6169222328
SLEEP_TASK .65 99.35 538197218
CXPACKET 7.09 92.91 165990468
ASYNC_NETWORK_IO .34 99.66 23205843
SOS_SCHEDULER_YIELD 94.12 5.88 8819953
LCK_M_IS .06 99.94 8420765
MSSEARCH .00 100.00 7732406
ASYNC_IO_COMPLETION .00 100.00 6851875
BACKUPBUFFER .19 99.81 6766156
WRITELOG 7.90 92.10 3994625
LATCH_EX 14.17 85.83 2917812
MSQL_DQ .00 100.00 2289390
BACKUPIO .16 99.84 1883843
SLEEP_BPOOL_FLUSH 2.59 97.41 1578640
PAGEIOLATCH_SH .82 99.18 1454656
BACKUPTHREAD .00 100.00 1445312
WAITFOR .00 100.00 1211234
SQLTRACE_LOCK .06 99.94 1183125
Здесь будет идти речь о кластере Windows Server 2003 Enterprise Edition и о запуске в кластере службы...
--Сценарий T-SQL инвентаризации установки SQL Server.
--Был найден в документе IBM "Consolidating Microsoft SQL Server on the IBM System x3950 M2".
--Example 4-2 Transact SQL script to help gather information
set nocount on
set dateformat dmy
set concat_null_yields_null off
use master
go
DECLARE @SysInfo INT
DECLARE @DomainName VARCHAR(128)
EXEC sp_OACreate 'ADSystemInfo', @SysInfo OUTPUT
EXEC sp_OAGetProperty @SysInfo, 'DomainShortName', @DomainName OUTPUT
print ''
print '1. General Info'
print '**********************************************'
print 'Server Name................: ' + convert(varchar(100), serverproperty('ServerName'))
print 'Physical Server Name.......: ' + convert(varchar(100), serverproperty('MachineName'))
print 'Domain Name................: ' + isnull(@DomainName, 'NOT ON DOMAIN')
print 'Instance Name..............: ' + convert(varchar(30),@@SERVICENAME)
print 'SQL Server version.........: ' + convert(varchar(100), serverproperty('productversion'))
print 'Edition....................: ' + convert(varchar(100), serverproperty('edition'))
print 'Service Pack Level.........: ' + convert(varchar(100), serverproperty('productlevel'))
print 'Authentication Mode........: ' + case when serverproperty('IsIntegratedSecurityOnly') = 1 then
'Windows Integrated' else 'Mixed Mode' end
print 'Is Clustered...............: ' + case when serverproperty('IsClustered') = 1 then 'Yes' else 'No'
end
print 'License Type...............: ' + convert(varchar(100), serverproperty('LicenseType'))
print 'Number of Licenses.........: ' + convert(varchar(100), serverproperty('NumLicenses'))
print 'Default Instance Collation.: ' + convert(varchar(100), serverproperty('collation'))
print '2. System Information.'
exec master..xp_msver
print '3. Other information'
print 'Number of connections..: ' + convert(varchar(30),@@connections)
print 'Language...............: ' + convert(varchar(30),@@language)
print 'Lock Timeout...........: ' + convert(varchar(30),@@LOCK_TIMEOUT)
print 'Maximum of connections.: ' + convert(varchar(30),@@MAX_CONNECTIONS)
print 'CPU Busy...........: ' + convert(varchar(30),@@CPU_BUSY/1000)
print 'CPU Idle...........: ' + convert(varchar(30),@@IDLE/1000)
print 'IO Busy............: ' + convert(varchar(30),@@IO_BUSY/1000)
print 'Packets received...: ' + convert(varchar(30),@@PACK_RECEIVED)
print 'Packets sent.......: ' + convert(varchar(30),@@PACK_SENT)
print 'Packets w errors...: ' + convert(varchar(30),@@PACKET_ERRORS)
print 'TimeTicks..........: ' + convert(varchar(30),@@TIMETICKS)
print 'IO Errors..........: ' + convert(varchar(30),@@TOTAL_ERRORS)
print 'Total Read.........: ' + convert(varchar(30),@@TOTAL_READ)
print 'Total Write.........: ' + convert(varchar(30),@@TOTAL_WRITE)
print '4. Database Information'
exec master..sp_helpdb
PRINT ''
Print '5. Lists of users/groups with DBA privileges'
DECLARE @Statement VARCHAR(255)
SELECT @Statement = 'SELECT ISNULL(name,loginname) as ' +
'''System Admin Role Users''' +
'FROM master..syslogins where sysadmin = 1'
EXEC (@Statement)
IF @@rowcount =0
PRINT '!!!! No One has System Admin rights !!!!'
print '6. List of special users per database'
declare @name sysname,
@SQL nvarchar(600)
if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#tmpTable'))
drop table #tmpTable
CREATE TABLE #tmpTable (
[DATABASE_NAME] sysname NOT NULL ,
[USER_NAME] sysname NOT NULL,
[ROLE_NAME] sysname NOT NULL
)
declare c1 cursor for select name from master.dbo.sysdatabases
open c1
fetch c1 into @name
while @@fetch_status >= 0
begin
select @SQL =
'insert into #tmpTable
select N'''+ @name + ''', a.name, c.name
from ' + QuoteName(@name) + '.dbo.sysusers a
join ' + QuoteName(@name) + '.dbo.sysmembers b on b.memberuid = a.uid
join ' + QuoteName(@name) + '.dbo.sysusers c on c.uid = b.groupuid
where a.name != ''dbo'''
exec(@SQL)
close c1
deallocate c1
select * from #tmpTable
print ' '
print ' 7. Datafiles list '
if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#TempForFileStats '))
DROP TABLE #TempForFileStats
if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#TempForDataFile'))
DROP TABLE #TempForDataFile
if exists (select [id] from tempdb..sysobjects where [id] = OBJECT_ID ('tempdb..#TempForLogFile'))
DROP TABLE #TempForLogFile
DECLARE @DBName nvarchar(40)
DECLARE @SQLString nvarchar (2000)
DECLARE c_db CURSOR FOR
SELECT name
FROM master.dbo.sysdatabases
WHERE status&512 = 0
CREATE TABLE #TempForFileStats( [Database Name] nvarchar(40),
[File Name] nvarchar(128),
[Usage Type] varchar (6),
[Size (MB)] real,
[Space Used (MB)] real,
[Growth Type] varchar (12),
[File Id] smallint,
[Group Id] smallint,
[Physical File] nvarchar (260),
[Date Checked] datetime
CREATE TABLE #TempForDataFile ( [File Id] smallint,
[Total Extents] int,
[Used Extents] int,
[Physical File] nvarchar(260)
CREATE TABLE #TempForLogFile ( [File Id] int,
[Size (Bytes)] real,
[Start Offset] varchar(30),
[FSeqNo] int,
[Status] int,
[Parity] smallint,
[CreateTime] varchar(30)
OPEN c_db
FETCH NEXT FROM c_db INTO @DBName
WHILE @@FETCH_STATUS = 0
BEGIN
SET @SQLString = 'select ''' + @DBName + '''' + ' as ''Database'', ' +
' f.name, ' +
' CASE ' +
' WHEN (64 & f.status) = 64 THEN ''Log'' ' +
' ELSE ''Data'' ' +
' END as ''Usage Type'', ' +
' f.size*8/1024.00 as ''Size (MB)'', ' +
' NULL as ''Space Used (MB)'', ' +
' WHEN (1048576&f.status) = 1048576 THEN ''Percentage'' ' +
' ELSE ''Pages'' ' +
' f.fileid, ' +
' f.groupid, ' +
' filename, ' +
' getdate() ' +
' FROM ' + @DBName + '.dbo.sysfiles f'
INSERT #TempForFileStats
exec(@SQLString)
SET @SQLString = 'USE ' + @DBName + ' DBCC SHOWFILESTATS'
INSERT #TempForDataFile
UPDATE #TempForFileStats
SET [Space Used (MB)] = s.[Used Extents]*64/1024.00
FROM #TempForFileStats f,
#TempForDataFile s
WHERE f.[File Id] = s.[File Id]
AND f.[Group Id] = s.[Group Id]
AND f.[Database Name] = @DBName
TRUNCATE TABLE #TempForDataFile
SET @SQLString = 'USE ' + @DBName + '; DBCC LOGINFO'
INSERT #TempForLogFile
SET [Space Used (MB)] = (SELECT (MIN(l.[Start Offset]) +
SUM(CASE
WHEN l.Status <> 0 THEN l.[Size (Bytes)]
ELSE 0
END))/1048576.00
FROM #TempForLogFile l
WHERE l.[File Id] = f.[File Id])
FROM #TempForFileStats f
WHERE f.[Database Name] = @DBName
AND f.[Usage Type] = 'Log'
TRUNCATE TABLE #TempForLogFile
END
DEALLOCATE c_db
SELECT * FROM #TempForFileStats
По состоянию на 2009 год Эта статья - вольная интерпретация рекомендаций: Microsoft, IBM, HP, Dell,...
Я уже коментировал на itcommunity.com, но хотелось бы всё таки уяснить для себя кое-что. Там мне ответили что UAC не нужен на сервере, потому что таковы рекомендации вендоров, указанных вначале статьи. Есть пруфлинки на такие рекомендации для UAC?
В документе Майкрософт "Performance Tuning Guidelines for Windows Server 2008 R2 (June 25, 2009)" есть такая рекомендация:
• Navigate to Start > All Programs > Administrative Tools > System Configuration Tools tab, disable User Account Control (UAC) by selecting Disable UAC, and then reboot the system.
По материалам статьи: Microsoft SQL Server 2005 TPC-C Trace FlagsВольный перевод Александра Гладченко...
По материалам статьи: Microsoft SQL Server 2008 TPC-E Trace FlagsВольный перевод Александра Гладченко...
По материалам стать Иан Джоз (Ian Jose): Query Processor Modelling Extensions in SQL Server 2005 SP1Перевод...
Александр, в данной статье вы рекомендуете включить "Lock pages in memory", а на форуме technet (social.technet.microsoft.com/.../2dac3aab-586f-4f67-a8c3-c9fb3281d9ad) пишете обратное:
"Закрепление страниц в памяти - это крайняя мера. Без нужды этой возможностью пользоваться не стоит, мало того, это может оказаться даже опастным... лучше ещё памяти добавить."
Какой из этих двух рекомендаций следует доверять?
Andrey,
Не вижу там противоречий. Данная статья представляет собой перечень рекомендаций вендоров и не предусматривает применение этих рекомендаций без нужды. Ответ в блоге касается конкретной ситуации.
В случае, когда сервер обслуживает только один экземпляр СУБД и наблюдаются листания, вполне может оказаться полезным включение предлагаемой в статье политики и воспрепятствовать выгрузке страниц из пула для SQL Server. Но это не от хорошей жизни... Как я понимаю, в TPC-H и TPC-C этим пользуются потому, чтобы съэкономить на оперативке (она дорогая). Но это ещё не повод для подражания.
По материалам статьи: "Resolving PAGELATCH Contention on Highly Concurrent INSERT Workloads".
Pingback from Трактат о производительности MS CRM. Книга II: настройки базы данных
Хочу подчеркнуть, что в статье приведён довольно экзотический случай. На практике, довольно часто удаётся воспользоваться данной тут вскользь рекомендацией: «…Одним из способов снизить конкуренцию за одну страницу состоит в том, чтобы выбрать в качестве первого столбца индекса другой, не увеличивающийся монотонно столбец…».
Т.е. более простым случаем может являться разделение первичного ключа и кластеризованного индекса, так чтобы монотонно возрастающая последовательность перестала быть основой кластеризации.
Одной из трудно оптимизируемых задач SQL Server является вставка. Не раз мне приходилось сталкиваться
Не такая уж и экзотическая, как раз месяца полтора назад именно это дело и именно таким путём оптимизировал.
-- Для SQL Server 2008 системные таблицы нужно выбрать другие:
USE msdb
SELECT 'EXEC [master].[sys].[xp_cmdshell] ''dtutil /Q /SQL ' +
CASE f.foldername WHEN '' THEN '"' + p.[name] + '"' ELSE '"' + f.foldername + '\' + p.[name] + '"' END
+ ' /ENCRYPT FILE;"c:\temp\' + p.[name] + '.dtsx";0 /SOURCESERVER ' + @@SERVERNAME + ''''
FROM msdb.dbo.sysssispackages p
JOIN msdb.dbo.sysssispackagefolders f
ON p.folderid = f.folderid
WHERE p.folderid <> '00000000-0000-0000-0000-000000000000'
GO
Если SSIS не установлен, то можно вытащить XML с помощью показанного ниже сценаоия и сохранить каждый пакет в тестовом файле с расширением ".dtsx"
,PlanXML=CAST(CAST(packagedata AS VARBINARY(MAX)) AS XML)
FROM msdb.dbo.sysssispackages
WHERE name NOT IN ( 'SqlTraceCollect','SqlTraceUpload',
'TSQLQueryCollect','TSQLQueryUpload',
'PerfCountersCollect','PerfCountersUpload',
'QueryActivityCollect','QueryActivityUpload'
Очень часто получается так, что реальные бизнес -требования оказываются сложнее, чем возможности мастеров...
А если бы в октябрском серваке тоже был сторедж на 700-900 гигов, соотношение было бы то же?
А как долго от нас уходят и все никак не уйдут FDD накопители.. :)
Думаю HDD будут отходить еще дольше, но самое главное - лед тронулся!
а статистики нет по количеству вылетов SAS дисков? или лично увиденного?
Просто тоже обнаружил странную тенденцию , уж очень часто они вылетать стали.
То есть если еще и по количеству вылетов SAS чаще вылетают , то тут становится очевидным что SSD лучше.
TO sorgery,
Они и так таким числом шпинделей не смогли до результата на SSD дотянуться... т.ч. большое дисковое пространство там только потому, что собраны массивы необходимой производительности, т.е. берут не умением, а числом :)))
TO cru5ader,
Плохой статистики по количеству вылетов SAS дисков у меня нет, вылетают - но не так чтобы часто...
А как насчет ограниченности циклов перезаписи SSD-дисков?
При высокой нагрузке исчерпывается очень быстро.
Конечно, там есть запас для замены истощенных ячеек, но логика перенаправления данных тоже требует времени на работу.
SSD работает быстро только вначале, когда количество деградированных ячеек мало, а затем все хуже и хуже.
Так что HDD от нас не уйдут еще долго.
По материалам технической статьи Майкрософт: A Case Study: Fast and Reliable Backup and Restore of a