Разделы
Публикации
Популярные
Новые
|
Главная » Оптимизация производительности transact 1 ... 48 49 50 51 52 53 54 55 (kl int identity, timestamp timestamp) DECLARE latsl timestamp, iats2 timestamp SELECT iatsl=@@DBTS, iats2-iatsl SELECT CASE WHEN TSEQUAL(iatsl, iats2) THEN Equal ELSE Not Equal END INSERT #testts DEFAULT VALUES SET iats2=iaiaDBTS SELECT CASE WHEN TSEQUAL(gtsl, iats2) THEN Equal ELSE Not Equal END GO DROP TABLE #testts Equal Server; Msg 532, Level 16, State 2, Line 16 The timestamp (changed to 0x0000000000000093) shows that the row has been updated by another user, @@MICROSOFTVERSION Эта автоматическая перементшя возвращает внутренний номер версии сервера, используемый Microsoft. SELECT laMICROSOFTVERSION 117441211 Недокументированные флаги трассировки Флаги трассировки представляют собой специальные настройки сервера, которые задаются при по.мощи команды DBCC TRACEON() или через опцию ко.мандтюй строки -Т сервера. Некоторые опции и.меют смысл только для всего сервера, поэтому их лучше указать как опцию командной строки. Больша>1 часть флагов, однако, устанавливается через DBCC TRACEON(flagnum), где flagnum - флаг, который необходимо установить. Для того чтобы установить более одного флага сразу, разделите их запяты.ми. Для просмотра статуса флага служит команда DBCC TRACESTATUS(flagnum). Если ей передать -1, будут перечислены все установленные флаги трассировки. Вот простой пример: EXEC master, .xpjogevent 99999.CHECKPOINT before setting flag 3502.informational CHECKPOINT DBCC TRACEON(3604.3502) DBCC TRACESTATUS(-l) EXEC master, .xpjogevent 99999.CHECKPOINT aften setting flag 3502.informational CHECKPOINT DBCC TRACEOFF(3604.3502) DBCC TRACESTATUS(-l) Вот как выглядит журнал ошибок сервера после вьиюлнения этих команд (флаг 3502 приводит к выводу расширенной информации о событиях CHECKPOINT): 1999-07-27 19:57:20.06 spidll Error: 99999. Severity: 10, State: 1 1999-07-27 19:57:20,06 spidll CHECK,d01NT before setting flag 3502, 1999-07-27 19:57:20,06 spidll DBCC TRACEON 3604, server process ID (SPID) 11, 1999-07-27 19:57:20,06 spidll DBCC TRACEON 3502, server process ID (SPID) 11, 1999-07-27 19:57:20,07 spidll Error: 99999, Severity: 10, State: 1 1999-07-27 19:57:20,07 spidll ChCCKPOlNT after setting flag 3502, 1999-07-27 19:57:20,0/ spidll Ckpt dbid 4 started (100000) 1999-07-27 19:57:20,07 spidll Ckpt dPid 4 phase 1 ended (100000) 1999-07-27 19:57:20,07 spidll Ckpt dbid 4 complete 1999-07-27 19:57:20,0/ spidll OBCC TRACEOFF 3604, server process ID (SPID) 11, 1999-07-27 19:57:20,07 spidll DBCC TRACEOFF 3502, server process ID (SPID) 11, В табл. 20.4 лодержатся некоторые из флагов трассировки (обратитесь к Books Online за списком документированных). Этот список неполон - существует множество недоку.меитированиых флагов, не указанных в нем. Таблица 20.4. Некоторые из недокументированных флагов трассировки SQL Server Флаг Значение 1200 Отображает детальную информацию о блокировках 1206 Дополняет флаг 1204, отображая другие блокировки, налагаемые участниками мертвой блокировки 2509 /1спользуется совместно с DBCC CHECKTABLE для просмотра общего числа фантомных записей таблицы 3502 Протоколирует расширенную информацию при наступлении события checkpoint в системный журнал ошибок 3607 Пропускает автоматическое восстановление баз данных 3608 Пропускает автоматическое восстановление баз данных, за исключением базы master 3609 Пропускает создание базы tempdb при старте сервера 8687 Отключает параллельное выполнение запросов (для многопроцессорных машин) Недокументированные процедуры Сущее гвует очень большое количество недокументированных процедур. По мои.м нодсчета.м, их npn.viepno сотия, не считая связа1нть[х с репл1Н<ацией. Я привел большую их часть в табл. 20.5. По мпоги.м причинам приведены пе все. Во-первых, их слишком много, чтобы описать соответствующи.м образом. Поэтому я ие описал недокументированные процедуры, связанные с ренликациег!. Также часто нeдoкy.vIeггиpoвaиныe процедуры столь опасны и столь .мало полезны, что лучше их не рассматривать. Наконец, некоторые недокументированные проце-ду1)ы работают ошибочно или так силь[10 зависят от внешнего по отношению к серперу кода (например, в Enterprise Manager и SQL-DMO), что они либо бесполезны, либо вызывают сомнения в [10лез[1ости у разработчика Transact-SQL. Смысл здесь в том, чтобы представт[ть обзор без лт[иших подробностей. Таблица 20.5. Недокументированные системные и расширенные хранимые процедуры Процедура Назначение sp checl<names [@mode] sp delete bacl<uphistory @oldest date sp enumerrorlogs sp enumoledbdatasources sp fixindex @dbname, @tabname, @indid sp gettypestring @tabid,@colid, @typestring output sp MS marksystemobject @objname .sp MSaddguidcol @source owner, @source table sp MSaddguidindex @source owner, @source table sp MSaddlogin implicit nt login ©loginame sp MSadduserJmplicit ntl ogin @ntname sp MScheck uid owns any thing @uid Проверяет ключевые системные таблицы на наличие He-ANSI-имен Очищает системную историю резервного копирования до указанной даты Перечисляет системные журналы ошибок текущего сервера Перечисляет провайдеров OLEDB, доступных на сервере Позволяет создавать и удалять индексы на системных таблицах Выводит текстовое описание типа данных столбца Устанавливает системный бит (ОхСООООООО). Некоторые функции и команды DBCC работают неправильно, если вызваны не из системного объекта. Установка системного бита приводит к тому, что значение свойства IsMSShipped равно 1 Добавляет ROWGUIDCOL-столбец к таблице.Также помечает таблицу для репликации (для того чтобы отменить это, используйте EXEC sp MSunmarkreplinfo) Создает индекс на столбце ROWGUIDCOL таблицы Добавляет учетную запись SQL Server, соответствующую существующей учетной записи NT Добавляет пользователя базы данных, соответавующето существующей учетной записи NT Возвращает 1, если пользователь является владельцем объектов в текущей базе данных sp checknames @mode=silent msdb..sp delete backuphistory @oldest date datetime master..sp enumerrorlogs sp enumoledbdatasources USE Northwind EXEC sp dboption Northwind, single, true EXEC sp fixindex Northwind, sysobjects, 2 EXEC sp dboption Northwind, single, false declare ©tabid int @typestr varchar(30) @tabid=OBJECT ID(authors) EXEC sp gettypestring @tabid, 1, @typestr OUTPUT sp Ms marksystemobject sp dir sp MSaddguidcolumn dbo, testguid sp MSaddguidindex dbo, testuid sp MSaddlogin implicit ntlogin GoofyTingler sp MSadduser implicit ntlogin GoofyTingler DECLARE @res int, @uid int SELECT @uid = SUSER ID() EXEC @res = sp MScheck uid owns anything @uid Продолжение Таблица 20.5. Продолжение Процедура Назначение sp MSdbuseraccess @mode=permdb, @qualdb name mask sp MSdbuserpriv @mode=permserv]verrole sp MSdependencies @objname, @objtype, ©flags int @objlist sp MSdrop object ;@object id] ,@object name] ,@object owner] sp MSexists file @full path, @filename sp MSforeachdb @commandl @replacechar = ? [,@command2] ,@command3] ,@precommand] ,@postcommand] sp msforeachtable @commandl @replacechar = ? [,@command2] ,@command3] ,@whereand] ,@precommand] ,@postcommand] sp MSget oledbinfo ©server [,@login ,@infotype] [,@password] sp MSget qualified name @object id, @quaHfied name OUTPUT sp MSget type @tabid, (Scolid, @colname OUTPUT @type OUTPUT adJLrstright@tabl body = sp MSguidtostr @guid, @mystr OUTPUT Возвращает список доступных пользователю баз данных и битовую маску, описывающую доступ в каждой базе Возвращает битовую маску привилегий пользователя Показывает зависимости объекта Удаляет таблицу, представление, триггер или процедуру Проверяет, существует ли указанный файл Выполняет до трех команд для каждой из баз данных. @replacechar будет заменен именем базы данных, @precommand и @postcommand могут быть использованы для направления команд в единый результирующий набор Выполняет до трех команд для каждой таблицы каждой базы данных (опционально соответствующей выражению @whereand) Возвращает информацию о провайдере OLEDB для связанного сервера Переводит ObjectlD в полное имя объекта Возвращает имя и тип столбца таблицы Возвращает значение типа uniqueidentifier как строку sp MSdbuseraccess @mode = db sp MSdbuserpriv @mode = role sp MSdependencies @objname = titleauthor sp MSdrop object @object name = authors2 DECLARE @resint EXEC @res = sp MSexists file d:\readme.txt EXEC sp MSforeachdbDBCC CHECKDB(?) EXEC sp MSforeachdb @commandl=PRINT Listing ? , @command2=USE ?; EXEC sp dir EXEC sp MSforeachtable @commandl=EXEC sp help [?] EXECsp MSforeachtable @commandl=PRINT Listing ?=, @command2=SELECT * FROM ?,@whereand= AND name like title% <$ [i n te rf a с e ta bl>s p M S g e t ole dbinfo @server=pythia, @login=sa DECLARE @oid int, @obname sysname SET @oid=DBJECT ID(titles) EXEC sp MSget qualified name @oid, @obname OUTPUT DECLARE @tabid int, @colname sysname, @type nvarchar(4000) SET @tabid=OBJECT ID(authors) EXEC sp MSget type ©tabid, 1, @colname OUTPUT @type OUTPUT DECLARE @guid uniqueidentifier, @guidstr sysname SET @guid=NEWID() EXEC sp MSguidtostr @guid, @guidstr OUTPUT Процедура Назначение sp MShelpindex @tablename [,@indexname] [,@flags] sp MShelptype @typename] ,flags=sdtTuddtNULL] sp MSindexspace @tablename [,@index name] sp MSis pl< col @source table, @colname, @indid sp MSI<iUdb @dbname sp MSloginmappings @loginname sp MStable has uniqueJn dex @tabid sp MStablel<eys tablename] [,@colname] ,@type] [,@l<eyname] ;,@ftags] sp Mstablerefs @tablename, @type=Nactualtables, @direction = Nprimary, @reftable sp MStablespace [@name] s p M S u П c to d rive @unc path, @local server, @locaLpath OUTPUT sp MSuniquecolname table name, @base colname, @unique colname OUTPUT sp Msuniquename @seed, ©start Выводит информацию из каталога индексов Выводит информацию из каталога типов Возвращает информацию о размере индекса Проверяет, является ли столбец первичным ключом Удалят базу при помощи DBCC DBREPAIR (даже если база не повреждена) Выводит соответствие между учетной записью, пользователем базы данных и псевдонимом Проверяет, есть ли у таблицы уникальный индекс Перечисляет ключи таблицы Выводит список объектов, на которые ссылается таблица или которые ссылаются на таблицу Выводит информацию о дисковом пространаве, занятом таблицей Преобразует UNC-путь в диско- Генерирует уникальное имя столбца для указанной таблицы на основе заданного базового Возвращает уникальное имя объекта для текущей базы на основе значения @seed и начального значения sp MShelpindex titles EXEC sp MShelptype id EXEC sp MShelptype int.sdt EXEC sp MShelptype EXEC sp MSindexspace titles DECLARE @res int EXEC @res=sp MSis pk col titles,titlejd,l sp MSkilldb northwind2 sp MSloginmappings DECLARE @obJTd int @res int SET @objid=OBJECT ID(titles) EXEC @res=s p MStable has u niquej ndex @objid sp MStablekeys titles sp MStablerefs titleauthor sp MStablespace titleauthor DECLARE @path sysname EXEC sp MSunc to drive \\PYTHIA\C$\, PYTHIA, @path OUTPUT DECLARE @uniquename sysname EXEC sp MSuniquecolname titles, titlejd, @uniquename OUTPUT sp MSuniquename titles, 3 Продолжение Таблица 20.5. Продолжение Процедура Назначение sp Msuniqueobjectname @name in, @name out OUTPUT sp Msuniquetempname @namejn, @name out OUTPUT sp readerrorlog [@lognum] sp remove tempdb file @?lenaine sp set locaLtime [@server name] [,@adjustmentjn minutes ] (forWinQx) sp tempdbspace xp dirtree rootpath xp dsninfo @systemdsn xp enum oledb providers xp enumdsn xp enumerrorlogs xp fileexist filename xp fixeddrives xp get MAPI default profile xp get MAPI profiles xp getfiledetails ?lename xp getnetname Возвращает уникальное имя объекта для текущей базы Возвращает уникальное имя временного объекта на основе базового Выводит системный журнал ошибок с указанным номером. Если номер не указан, выводит текущий журнал ошибок Удаляет файл, на котором основана база tempdb Синхронизирует локальное время с указанным сервером Возвращает информацию об использовании дискового пространства базой tempdb Выводит полное содержимое каталогов и подкаталогов указанного пути Выводит информацию ODBC DSN для указанного системного источника данных Перечисляет доступные на сервере гуэовайдеры OLEDB Перечисляет системные источники данных ODBC на сервере Выводит список журналов ошибок сервера Проверяет, существует ли указанный файл Выводит список жестких дисков сервера Возвращает имя профиля MAPI по умолчанию Возвращает список имен системных профилей MAPI Возвращает детальную информацию об указанном файле Возвращает сетевое имя сервера DECLARE @outname sysname SET @outname = - не может быть NULL EXEC sp MSuniqueobjectname titles, @outname OUTPUT CREATE TABLE tempdb..test(cl int) DECLARE @outname sysname EXEC sp MSuniquetempname test, @outname OUTPUT sp readerrorlog master..sp remove tempdb file tempdev02 msdb..sp set locaLtime sp tempdbspace master..xp dirtree c:\ master..xp dsninfo pubsdsn master..xp enum oledb providers master..xp enumdsn master..xp enumerrorlogs master..xp fileexist d:\mssql7\install\readme.txt master..xp fixeddnves Master..xp get MAPI default profile master..xp get MAPI profiles master..xp getfiledetails d:\mssql7\install\readme.txt master..xp getnetname Заключение Процедура Назначение xp oledbinfo @providername, @datasource, ©location, @providerstring, ©catalog, @login, ©password, @infotype xp readerrorlog [lognum] xp regaddmultistr xp regdeletekey xp regdeletevalue xp regenumvalues xp regread xp regremovemultistring xp regwrite xp subdirs xp test MAPI profile proiile xp varbintohexstr Возвращает детальную информацию OLEDB для указанного связанного сервера Возвращает набор (с1 char(255) с2 int), содержащий указанный журнал ошибок Позволяет добавлять, изменять, удалять ключи и значения реестра Выводит список подкаталогов первого уровня указанного каталога Проверяет указанный профиль MAPI (то, что он существует и с ним можно установить соединение) Преобразует переменную типа varbinary в строковое представление шестнадцатеричиого числа master..xp oledbinfoSQLOLEDB, PYTHIA,NULU NULL, NULL,sa, drkildare, NULL master..xp readerrorlog EXEC master..xp regenumvalues HKEY LOCAL MACHINE, SOFTWARE\Microsoft\MSSQLServer\ MSSOLServer DECLARE @dfnvarchar(64) EXECUTE master.dbo.xp regread NHKEY CURRENT USER, NContj;ol Panel\International, NsShortDate, @df OUTPUT, Nno output master..xp subdirs D:\MSSQL7 master..xp test MAPI proiile SQL CREATE PROC sp hex @i int @hx varchar(30) OUT AS DECLARE @vb varbinary(30) SET @vb=CAST(@i as varbinary) EXEC master..xp varbintohexstr @vb, @hx OUTPUT GO DECLARE @hex varchar(30) EXEC sp hex 343, @hex OUTPUT Заключение в этой главе рассмотрено множество флагов трассировки SQL Server, ко.манд DBCC, функций, переменных и храни.мых процедур, недокументированных в Books Online. Если вы решите использовать их в своей работе, делать это следует осторожно. Помните о возможных изменениях в новых выпусках SQL Server. Не следует ожидать поддержки со стороны Microsoft, поскольку недоку.ментированные возможности не поддерживаются, и их можно произвольно изменить. Применение недокументированных функций, в то.м числе и в SQL Server, ие рекомендуется. Не делайте этого без крайней необходимости. Попурри Нетерпимость - это кореиъ всего зла или, как минимум, многих его проявлений. Это мог бы быть мой или ваш сын, забитый до смерти и привя.эа1Н1ый к забору из колючей проволоки из-за его сексуатьной ориентации. Или мой или ваш брат, которого тащит грузовик, пока голова не оторвется. Это могли бы быть вы или я. Если вы хотите избавить мир от зла, начните с нетерпи.мости. Г. В. Кентоп В этой главе собрано все, что не по.\1естилось на других страницах книги. Здесь вы найдете всякую всячину, не подходящую для других глав. Пере.мещение материала в эту 1-лаву не означает, что описываемая те.ма второстепенна. Некоторые представленные здесь способы весьма полезны. Скрытые функции Каждый выпуск SQL Server привносит новые функции в язык Transact-SQL. Сейчас их более пятидесяти. Не удивительно, что при таком большом количестве функций неаккуратршш разработчик может не знать о каких-то из них. Хотя эта книга не призвана заменить Books Online, некоторые из этих функций заслуживают упоминания, поскольку могут избавить от лишней работы. Функции статуса Функции статуса сообщают о рабочем окружении. У SQL Server множество таких функций. Вероятно, вы знакомы с некоторыми из них, с другими - нет. Вот несколько функций, выделяющихся среди прочих в плане редкости и полезности. GETANSINULLO позволяет определить опцию но умолчанию для значения NULL базы данных. Эта опция управляется при помощи процедуры sp dboption через опцию ANSI null default, так же как и через ко.манды сессии SET ANSI NULL DFLT ON/SET ANSI NULL DFLT OFF. GETANSINULLO принимает необязательный параметр - имя базы. Вот код, использующий GETANSINULLO: DECLARE @ansirull int -- Сохранить, чтобы потом восстановить SET (Заns 1 null-GETANS1 NULL(tempdb) IE ((?ansinull=C) SET ANSI NULL DELT ON ON CREATE TABLE #nulltest (cl int) INSERT #nulltest (cl) VALUES (NULL) SELECT * EROM #nulltest IE (@ansinul1=0) - Вернуть прежнюю настройку SET ANSI NULL DELT ON OEE Этот код использует GETANSINULL() для определения статуса ANSI null default до изменения значения. Далее создается временная таблица, состоящая из одного столбца, значение NULL по у.молчаиию для которого не указано, и в нее вставляется запись со значением NULL. Потом восстанавливается первоначальное значение. HOST NAME(), GETDATEO и USER NAME() - также удобные фупкции статуса окружения. Вы часто будете встречать их при указании значений по умолчанию для столбцов, хотя их можно указывать и в списках SELECT, как видно из следующего фрагмента кода: SELECT HOSTJAMEO PUCKJEET Здесь HOST NAME() применяется для того, чтобы получить имя рабочей станции. Другой частый пример использования этих функций - значения по умолчанию для столбцов. Вот пример: CREATE TABLE #REPORT LOG (RepontLogld int identity PRIMARY KEY. RepontDate datetime DEEAULT GETDATEO. RepontUsen varchanOO) DEEAULT USERJAMEO. ReportMaciiine varchanOO) DEEAULT HOSTJAMEO. ReportName varcharOO) DEEAULT UNKNOWN) INSERT #REPORT LOG DEEAULT VALUES SELECT * EROM #REPORT LOG (результаты сокращены) ReportLogId ReportDate ReportUser ReportMachine 1 1999-06-17 02:10:03.617 dbo PUCKJEET Обратите внимание на при.менение конструкции INSERT...DEFAULT VALUES для добавления записей в таблицу с использованием только значения по умолчанию. Столбцы, допускающие значение NULL, будут содержать NULL при отсутствии значения по у.молчаиию во время добавления записи; столбцы, не допускающие значение NULL, в такой ситуации вызовут ошибку. Обратите вии.мание, что можно было бы задействовать ANSI SQL-92-функ-ции CURRENT TIMESTAMP и CURRENT USER вместо GETDATEO и USER NAME() соот- петстпенно. USER и SESSION USER являются сшюпи.ма.ми для CURRENT USER. ANSI-92-функции также могут применяться в выражениях SELECT; SELECT CURRENTJIMESTAMP. CURRENTJSER 1999-06-17 02:32:13.600 dbo Функции SUSER NAME() и SUSER SNAME() удобны, когда необходн.мо указать в качестве значения по умолчанию для столбца и.мя учетгюй защюи текущего пользователя, а не са.мо имя пользователя в текущей базе данных (ANSI SQL эквивалент SYSTEM USER). Если ириложение использует только учетную запись sa и не при.меняет имен пользователей базы данных, хранение и.меии текущего пользователя в таблице лишено смысла. Оно всегда будет равно dbo. Хранение имени учетной записи текущего пользователя позволит отслеживать активность без необходимости создания отдельных пользователей базы дан1Ш1х. Функция SUSER NAME() включена в последний выпуск SQL Server только по соображе-ния.м обратной сов.местимости, в.место нее следует задействовать функцию SUSER SNAME(). Функция SUSER NAME() больше не включена в модель безогшс-иости SQL Server, поэтому ее применение не вызывает снижения производительности. Функции свойств Эти функции возврап[ают информапто об объектах в базе данных. 06i>i4ho это метаданные - данные о данных. Было вре.мя, когда даже для получения базовых метаданных требовалось исследование системных таблиц. К счастью, было добавлено достаточное количество функций, так что теперь эта пробле.ма не существует. Далее приведены наиболее интересные из них. COLUMNPROPERTYO возвращает полезную инфо1)мацию о столбцах таблицы и napa.vieTpax хранимой процедуры. Эта функция принимает три параметра: идентификатор объекта (таблицы или хранимой процедуры - .\южно использовать функции OBJECrr ID() для получения опого), и.мя столбца или параметра, строковое выражение, указывающее на тип получаемой инфор.мации. За более подробной информацией .\южно обратиться к Books Online, но одно из са.мых интересных применений функции COLUMNPROPERTYO проиллюстрировано ниже: CREATE TABLE #testfunc (kl int identity PRIMARY KEY. cl decimal(10.2), c3 AS kl*cl) USE tempdb SELECT C0LUMNPR0PERTY(0BJECT 1D(tftestfunc).kl,Isldentity). COLUMNPROPERTY(OBJECT ID(tftestfunc).сГ ,Scale). COLUMNPROPERTY(OBJECT ID(#testfunc).c3.IsComputed). COLUMNPROPERTY(OBJECT ID(testfunc).kl.AllowsNul1) 12 10 Обратите внимание иа нермслючение контексга на базу tempdb непосредственно перед вызовами функции COLUMNPROPERTYO. Это необходн.мо, так как рассматриваемый объект находится в базе данных tempdb, а COLUMNPROPERTYO не работает со ссылками в разных базах даниых. 1 ... 48 49 50 51 52 53 54 55 |
© 2004-2024 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки. |