Как установить forceplan для таблицы sql
Перейти к содержимому

Как установить forceplan для таблицы sql

  • автор:

Как установить forceplan для таблицы sql

Параметр FORCEPLAN иллюстрирует старый метод настройки в Microsoft SQL Server и Sybase. Он требует отдельного оператора SQL: SET FORCEPLAN ON

Этот параметр действует на весь SQL-код, который выполняется в текущем соединении, пока вы не выполните оператор: SET FORCEPLAN OFF

Когда значение параметра FORCEPLAN равно ON, база данных выполняет только простейшую оптимизацию SQL. Обычно она использует планы вьшолнения с вложенными циклами, которые работают при помощи индексов и соединяют таблицы в том же порядке, в каком они перечислены в разделе FROM. Если вы хотите получить план именно такого типа, то SET FORCEPLAN будет идеальным вариантом, поскольку не только включает нужный план, но и экономит время разбора, которое в противном случае было бы потрачено на выбор из большого диапазона планов, особенно для соединений множества таблиц. Это, образно говоря, обоюдоту-пой меч, поэтому применяйте его только когда знаете, что в разделе FROM указан правильный порядок соединения, и хотите использовать вложенные циклы.

5Диаграммное изображение простых запросов SQL

Для превращения искусства настройки SQL в науку необходим общий язык, общая парадигма для описания и решения проблем настройки SQL. Эта книга — первое печатное издание, которое может научить вас методу, исправно служившему мне и тем, кому я его объяснил. Я называю этот метод методом диаграммного изображения запросов.

Как и любой новый инструмент, метод диаграммного изображения запросов требует некоторых авансовых инвестиций и затрат времени от будущего пользователя. Но мастерство владения этим инструментом обеспечивает гигантские вознаграждения, поэтому я прошу вас быть терпеливыми — трудно будет лишь в самом начале. Скоро вы найдете ответы, которые не дал бы вам ни один другой инструмент, пртем приложить првдется лишь немного усилий. А в конце изучения мой метод станет вам настолько привычным, что, как и в случае с любым другим хорошим инструментом, вы не будете замечать, что используете его.

Зачем нужен новый метод?

Поскольку я прошу вас быть терпеливыми, начну с рассмотрения того, зачем нам нужен этот новый инструмент. Почему бы не использовать то, что вы уже знаете, например информацию SQL-сервера, для решения проблем производительности? Самая большая проблема с использованием SQL-сервера для настройки — то, что он предлагает одновременно слишком много и недостаточно информации для решения задачи настройки. Информация SQL-сервера существует для функционального описания, какие столбцы и строки нужны приложению из каких таблиц, по каким условиям их нужно соединять, и в каком порядке возвращать. Однако большая часть этой информации совершенно не относится к настройке запроса. С другой стороны, информация, относящаяся и даже жизненно необходимая для настройки-о распределении данных в таблицах- полностью отсутствует. У SQL много общего со старыми проблемами эквивалентности, печально известными еще из математики начальной школы, разве что SQL-сервер с большей вероятностью пропускает необходимую информацию. Кахсую задачу, из двух приведенных ниже, вам будет легче решить?

Для отдыха на природе Джонни приготовил по восемь лепешек, три сосиски, одной полоске бекона и два яйца для себя и своих друзей Джима, Мэри и Сью. Каждая девочка отдала одну треть своих сосисок, 25 % лепешек и половину яиц мальчикам. Джим уронил лепешку и две сосиски, и их украл енот. У Джонни аллергия на кленовый сироп, а у Мэри на половине лепешек была клубника, но все остальные поливали лепешки кленовым сиропом. Сколько лепешек с кленовым сиропом съел каждый ребенок?

(8+(0.25 X 8) -1) + (0.75 х 8/2) + (0.75 х 8) — ? Естественно, вторую задачу решать проще.

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

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

Дополнительным и совершенно незапланированным преимуществом оказывается то, что диаграммы запросов оказываются ценным средством в поиске целых классов незаметных логических ошибок приложения, которые трудно обнаружить при тестировании, так как они возникают в достаточно редких и трудных случаях. В главе 7 я буду подробно обсуждать, как использовать эти диаграммы для поиска и исправления таких логических проблем.

ALTER TABLE — изменение таблицы в SQL

Рассказываем о команде ALTER TABLE и учим вносить с ее помощью изменения в таблицы и столбцы.

Эта инструкция — часть курса «MySQL для новичков».

Смотреть весь курс

Введение

ALTER TABLE — один из самых незаменимых инструментов в работе с базами данных SQL. В этой статье мы рассмотрим SQL оператор ALTER TABLE и его применение. Узнаем, как добавить или удалить поля с помощью этого инструмента, и рассмотрим различные примеры его использования. В данной статье мы не будем рассматривать MS SQL и остановимся на синтаксисе наиболее популярной версии — MySQL.

Синтаксис оператора ALTER TABLE в SQL

Синтаксис оператора ALTER TABLE выглядит следующим образом:

ALTER TABLE название_таблицы [WITH CHECK | WITH NOCHECK]

Из этой записи мы видим, что сценариев применения данной команды достаточно много. Давайте рассмотрим их. В качестве примера мы будем использовать базу данных slcbookshelf, которую мы создавали в статье о первичных и внешних SQL ключах.

use slcbookshelf; 

Добавление столбца в таблицу (ADD COLUMN)

Сейчас наша таблица выглядит следующим образом:

mysql> DESC books; +---------------+--------------+------+-----+---------+-------+ | Field | Type | Null | Key | Default | Extra | +---------------+--------------+------+-----+---------+-------+ | book_id | int | NO | | NULL | | | book_name | varchar(255) | NO | | NULL | | | book_category | varchar(255) | YES | | NULL | | +---------------+--------------+------+-----+---------+-------+ 3 rows in set (0.00 sec) 

Давайте добавим в нашу таблицу новый столбец, в котором будет отображаться автор каждой книги:

ALTER TABLE books ADD author NVARCHAR(50) NOT NULL; 

Данным запросом мы создали в нашей таблице новый столбец authors с типом NVARCHAR и длиной в 50 символов, который не может принимать пустое значение. Если мы не знаем автора произведения, тогда наша команда будет иметь такой вид:

ALTER TABLE books ADD author NVARCHAR(50) NOT NULL DEFAULT 'Неизвестен'; 

Теперь для существующих данных, для которых не заполнен столбец author, значение по умолчанию будет «Неизвестен».

Переименование столбца и таблицы

Переименование столбца (RENAME)

С помощью ALTER TABLE можно переименовать существующий столбец. Для этого выполните команду:

ALTER TABLE books RENAME COLUMN author TO authors; 

Переименование таблицы (RENAME)

При помощи ALTER TABLE можно переименовать таблицу. Выполняем запрос:

ALTER TABLE books RENAME TO books_selectel; 

Удаление столбца (DROP)

Чтобы удалить столбец из таблицы с помощью ALTER TABLE, требуется выполнить следующий запрос:

ALTER TABLE books DROP COLUMN authors; 

Изменение столбца (ALTER COLUMN)

Иногда бывают случаи, когда необходимо изменить уже созданный ранее столбец. Это действие можно выполнить с помощью команды ALTER TABLE. Для изменения существующего столбца необходимо выполнить такой запрос:

ALTER TABLE books ALTER COLUMN book_category VARCHAR(200); 

В данном примере мы изменили максимальное количество символов, которое может использоваться в полях столбца book_category с 255 до 200.

Также с помощью ALTER TABLE можно сделать действие сразу с несколькими столбцами. Чтобы изменить сразу несколько столбцов, вам потребуется использовать эту команду:

ALTER TABLE books MODIFY book_category VARCHAR(200), MODIFY book_name VARCHAR(200), . ; 

Таким запросом мы изменили сразу два столбца: book_category и book_name.

Изменение типа столбца

При помощи ALTER TABLE можно изменить тип столбца в таблице SQL. Изменение типа существующего столбца осуществляется при помощи команды:

ALTER TABLE books ALTER COLUMN book_category NVARCHAR(200); 

Выполнив эту команду, мы изменили тип book_category на NVARCHAR(200).

Добавление первичного и внешнего ключей при помощи ALTER TABLE

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

ALTER TABLE books ADD PRIMARY KEY (book_id); 

Аналогично при помощи ALTER TABLE можно добавить внешний ключ таблицы. Чтобы создать внешний ключ для таблицы MySQL выполните команду:

ALTER TABLE books ADD FOREIGN KEY (author_id) REFERENCES authors(author_id); 

В результате выполнения этой команды поле author_id в таблице books будет внешним ключом для аналогичного поля в таблице authors.

Работа с ограничениями

Ограничения — специальные правила, которые применяются к таблице, чтобы ограничить типы данных в таблице. Ограничения очень важны, так как их правильное применение помогает обеспечить целостность данных в таблицах и наладить стабильную работу базы. Давайте рассмотрим одно из таких ограничений — ограничение CHECK. Применяя ограничения CHECK к столбцу таблицы, мы создаем правило, по которому при добавлении данных СУБД будет автоматически проверять их на соответствии заданным правилам.

Создание ограничения

Например, если нам необходимо, чтобы все клиенты в базе данных Customers имели возраст больше 21 года, мы можем установить следующее ограничение:

ALTER TABLE Customers ADD CHECK (Age > 21); 

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

ALTER TABLE Customers WITH NOCHECK ADD CHECK (Age > 21); 

Добавление ограничений с именами

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

ALTER TABLE Customers ADD CONSTRAINT Check_Age_Greater_Than_Twenty_One CHECK (Age > 21); 

Удаление ограничений

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

ALTER TABLE Customers DROP Check_Age_Greater_Than_Twenty_One; 

После выполнения этой команды ограничение перестанет применяться при добавлении новых данных в столбец.

Заключение

В данной статье мы с вами узнали что такое ALTER TABLE, рассмотрели работу с этой командой и научились вносить с ее помощью изменения в таблицы и столбцы, а также рассмотрели несколько примеров использования данной команды, которые сильно упростят будущую работу с базами данных.

Сброс пароля root в MySQL

Strange behaviour of force plan in query store

I force plan in query store. Plan is connected to procedure in a job which run once a day. One of step of this job is just:

EXEC [schema].[LoadData] 

Procedure [schema].[LoadData] looks like

TRUNCATE TABLE [schema].[Data]; INSERT INTO [schema].[Data] ([A1], [A2], . . ., [A49] ) SELECT * ,CURRENT_TIMESTAMP AS [Insert TimeStamp] FROM [schema].[View] 

enter image description here

where view is a view which contains some CTEs and use synonyms (connect to tables from different databases). In query store execution looks like : To test If forcing plan is working I follow below steps:

  1. Run query in SSMS -> EXEC [schema].[LoadData]
  2. Above execution was treated as different query so did not see anything new in Query Store for query = 7
  3. DBA create a new job just with step which is running query -> EXEC [schema].[LoadData]
  4. Run of above newly created job cause Plan >Question why execution plan was not forced ? In column «forced plan failure count» is 0.

82.5k 28 28 gold badges 398 398 silver badges 625 625 bronze badges
asked Feb 11, 2022 at 16:22
299 1 1 silver badge 8 8 bronze badges

1 Answer 1

The chances are that plan id 29800 is indeed forced, but query store makes this difficult to see.

Plan forcing does not guarantee new plans will be identical to the original, as documented at sp_query_store_force_plan (emphasis added):

The resulting execution plan forced by this feature will be the same or similar to the plan being forced. Because the resulting plan may not be identical to the plan specified by sp_query_store_force_plan, the performance of the plans may vary.

If the generated plan is not identical, you will see a new plan id. That does not necessarily mean plan forcing failed. When plan forcing fails, the extended event query_store_plan_forcing_failed is fired.

You can verify plan forcing succeeded by looking at the plan xml with id 29800 for the attribute UsePlan=»1″ in the QueryPlan element. It also appears as a property at the root of the graphical plan. Plan id 29800 will also appear in the ‘queries with forced plans’ report.

You might like to read Erland Sommarskog’s explanation in his article Slow in the Application, Fast in SSMS?

As an aside, the reason SSMS generated a different query id is almost certainly because you do not have SET QUOTED_IDENTIFIER ON in your job step, or you have your SSMS configured to SET ARITHABORT ON (as is the pointless default).

save transaction

ГЛАВА 7 Команды [readpast] [shared] соединение _ANSI ::= ссылка _ на _ таблицу тип _ соединения join ссылка _ на _ таблицу условия _ соединения тип _ соединения::= inner | left [outer] | right [outer] условия _ соединения ::= on условия _ поиска инструкция _where ::= where условия _ поиска инструкция _group_by ::= group by [all] выражение _ без _ агрегатов [, выражение _ без _ агрегатов]. инструкция _having ::= where условия _ поиска инструкция _order_by ::= order by инструкция _sort [, инструкция _sort ]. инструкция _sort ::= < [[[база _ данных.]владелец.]<имя _ таблицы.|имя _ представления.>]имя _ ст олбца | номер _ в _ списке _ выборки | выражение > [asc | desc] инструкция _compute ::= compute строка _ агрегат(имя _ столбца) [, строка _ агрегат(имя _ столбца)]. [by имя _ столбца [, имя _ столбца]. ] инструкция _read_only ::= for инструкция _isolation ::= at isolation < read uncommitted | 0 >| < read committed | 1 >| < repeatable read | 2 >| < serializable | 3 >инструкция _browse ::= for browse инструкция _plan ::= plan «абстрактный план» Параметры all Включает все строки в набор результатов . all – настройка по умолчанию .

select distinct Включает в набор результатов только уникальные строки . Ключевое слово distinct должно быть первым словом в списке выборки ; в режиме просмотра оно игнорируется . Для ключевого слова distinct значения NULL считаются равными друг другу . Поэтому будет выбрана только одна строка со значениями NULL, независимо от того , сколько таких строк удовлетворяет осталь — ным условиям запроса . список _ выборки Включает в себя один или несколько следующих элементов : • символ “*”, означающий , что будут выбраны все столбцы ( в порядке , определенном в команде create table ). • Список имен столбцов ( в произвольном порядке ). Если нужно вы — брать существующий столбец IDENTITY, можно вместо факти — ческого имени столбца указать ключевое слово syb_identity , при необходимости уточненное именем таблицы . • Добавление столбца IDENTITY к таблице результатов : имя _ столбца = identity( точность ) • Псевдоним , использующийся вместо заголовка столбца по умол — чанию ( которым является имя столбца ). Имеет одну из следующих форм : заголовок _ столбца = имя _ столбца имя _ столбца заголовок _ столбца имя _ столбца as заголовок _ столбца В любой из этих форм заголовок столбца может быть заключен в кавычки . Заголовок столбца нужно заключить в кавычки , если он не является допустимым идентификатором ( то есть либо является зарезервированным словом , либо начинается со специального символа , либо содержит пробелы или знаки пунктуации ). • Выражение ( имя столбца , константа , функция или любая комбинация имен столбцов , констант и функций , соединенных арифметическими или поразрядными операциями , или подзапрос ). • Встроенная функция или агрегат . • Любая комбинация вышеперечисленных элементов .

ГЛАВА 7 Команды В списке _ выборки также можно присваивать значения переменным с помощью следующего синтаксиса : @ переменная = выражение [, @ переменная = выражение . ] Нельзя совмещать присваивание значений переменным с каким — либо другим вариантом синтаксиса списка _ выборки . into Создает новую таблицу на основе столбцов , указанных в списке выборки , и строк , выбранных инструкцией where . См . подраздел “ Использование команды select into” в этом разделе . lock datarows | datapages | allpages Указывает схему блокировки , которая будет использоваться для таблицы , создаваемой командой select into . По умолчанию применя — ется настройка параметра конфигурации lock scheme , заданная на уровне сервера . max_rows_per_page Ограничивает количество строк на страницах данных таблицы , созда — ваемой с помощью команды select into . В отличие от параметра fillfactor , значение max_rows_per_page сохраняется при вставке или удалении данных . Параметр max_rows_per_page не поддерживается в таблицах с блокировкой только данных . existing table имя_таблицы Указывает , что данные выбираются в прокси — таблицу . Этот синтаксис select into нельзя использовать ни с какими другими типами таблиц . Столбцы , указанные в списке выборки , должны соответствовать столбцам прокси — таблицы по типу , длине и количеству . at «путь» Указывает полный путь к внешнему файлу , в который записываются выбранные данные . Параметр at можно указывать только при выборе в прокси — таблицу . external [ table | file ] file указывает , что внешний объект является файлом , а table – что таб — лицей . Если в команде select into не указано ни file, ни table, то считает — ся , что используется таблица . column delimeter » разделитель » Указывает разделитель , используемый для отделения столбцов друг от друга . Если разделитель не указан , то в команде select into разделите — лем является символ табуляции .

select exp_row_size = количество_байтов Указывает ожидаемый размер строки для таблицы , создаваемой с по — мощью команды select into . Применяется только для схем блокирова — ния datarows и datapages и только для таблиц со строками переменной длины . Допустимые значения – 0, 1 и любое значение между мини — мальной и максимальной длиной строки таблицы . Значение 0 ( являю — щееся значением по умолчанию ) означает , что используется значение по умолчанию , заданное на уровне сервера . reservepagegap = количество_страниц Указывает отношение числа заполненных страниц к числу страниц , которые должны остаться пустыми при выделении экстентов для хра — нения данных командой select into . Этот параметр можно использовать только в команде select into . На каждые количество _ страниц страниц оставляется одна пустая страница для расширения таблицы в будущем . Допустимые значения – от 0 до 255. Значение по умолчанию – 0. readpast Указывает , что запрос должен пропускать строки с монопольными блокировками , не ожидая их освобождения и не выдавая сообщение . with identity_gap Указывает интервал между значениями столбца IDENTITY в таблице . Для данной таблицы это значение имеет приоритет над системной настройкой . шаг Величина интервала между значениями IDENTITY. Таблица , создаваемая командой select into , не наследует настройку identity gap от родительской таблицы . Вместо этого в новой таблице применяется параметр identity burning set factor . В команде select into можно задать для новой таблицы другое значение интервала identity_gap . Интервал между значениями IDENTITY для новой табли — цы может быть таким же , как и в родительской таблице , а может и отличаться от него . from Указывает , какие таблицы и представления используются в команде select . Это ключевое слово обязательно , за исключением случая , когда список выборки не содержит имен столбцов , а только константы и арифметические выражения , например :

select 5 x, 2 y, «the product is», 5*2 Result
x y Result
———— ———— ————— ————
5 2 the product is 10

ГЛАВА 7 Команды В запросе может быть указано не более 50 таблиц и 14 рабочих таблиц ( например , создаваемых агрегатными функциями ). В этот 50- таблич — ный лимит входят : • таблицы ( или представления на таблицах ), указанные в инструк — ции from ; • все ссылки на одну и ту же таблицу ( одна таблица может быть указана более одного раза , например , в рефлексивных соеди — нениях ); • таблицы , указанные в подзапросах ; • таблицы , создаваемые с помощью инструкции into ; • базовые таблицы , на которые ссылаются представления , содержа — щиеся в инструкции from . имя _ представления, имя _ таблицы Список таблиц и представлений , используемых в команде select . Если таблица или представление находится в другой базе данных , нужно указать имя базы данных , а если в этой базе данных существует не — сколько таблиц или представлений с указанным именем , нужно ука — зать владельца . По умолчанию владельцем является текущий поль — зователь , а базой _ данных – текущая база данных . Если список содержит несколько таблиц или представлений , их имена должны быть разделены запятыми . Порядок , в котором указаны таб — лицы или представления после ключевого слова from , не влияет на результат . В одной команде можно делать запросы к таблицам , находящимся в разных базах данных . Таблицам и представлениям можно назначать псевдонимы ( сопостав — ляющие имена ). Псевдонимы делают текст запроса более понятным , а также позволяют указывать одну и ту же таблицу несколько раз ( это нужно , в частности , в запросах , содержащих рефлексивные соедине — ния или подзапросы ). Чтобы назначить псевдоним , укажите имя табли — цы или представления , затем пробел и введите псевдоним , например : select pub_name, title_id from publishers pu, titles t where t.pub_id = pu.pub_id Все другие ссылки на эту таблицу или представление ( например , в ин — струкции where ) должны использовать этот псевдоним . Псевдонимы не могут начинаться с цифры .

select index имя_индекса Указывает индекс , который нужно использовать для доступа к таблице имя _ таблицы . Этот параметр нельзя использовать при запросе к представлению , но его можно указать в инструкции select команды create view . parallel Указывает , что будет применено параллельное сканирование секций или сканирование индекса , если конфигурация Adaptive Server до — пускает параллельную обработку . степень _ параллелизма Задает число рабочих процессов , которые будут параллельно скани — ровать таблицу или индекс . Если этот параметр равен 1, запрос вы — полняется последовательно . prefetch размер Указывает объем ввода — вывода ( в килобайтах ) для таблиц , кэши кото — рых сконфигурированы для больших объемов ввода — вывода . Этот параметр нельзя использовать при запросе к представлению , но можно указать в инструкции select команды create view . Процедура sp_helpcache показывает допустимые объемы для кэша , с которым связан объект , или для кэша по умолчанию . Для настройки размера кэша данных используйте процедуру sp_cacheconfigure . Возможные значения размера для предварительной выборки , указываемого после ключевого слова prefetch , – 2 КБ или любое кратное двум число на логической странице размером до 16 КБ . Параметры размера prefetch в килобайтах приведены ниже :

Размер Размер для
логической предварительной
страницы выборки
2 2, 4, 8 16
4 4, 8, 16, 32
8 8, 16, 32, 64
16 16, 32, 64, 128

Размер , указанный в запросе после ключевого слова prefetch – это просто подсказка . Чтобы указанный размер можно было использовать , нужно сконфигурировать кэш данных этого размера . Если кэш данных заданного размера не сконфигурирован , будет использоваться размер prefetch , заданный по умолчанию . И c пользование параметра prefetch для удаленных серверов невозможно , если включены службы Component Integration Services.

ГЛАВА 7 Команды lru | mru Указывает стратегию замены значений в буфере , которая будет ис — пользоваться для таблицы . Если указать lru , то оптимизатор будет считывать таблицу в кэш по алгоритму MRU/LRU (most recently used/least recently used, прочитанный позже / раньше всех остальных ). Если указать mru , буфер будет сразу удаляться из кэша и заменяться на следующий буфер для таблицы . Этот параметр нельзя использовать при запросе к представлению , но его можно указать в инструкции select команды create view . holdlock Делает разделяемую блокировку указанной таблицы или представле — ния более ограничительной , удерживая ее до завершения транзакции ( вместо того , чтобы снимать разделяемую блокировку как только страница данных больше не требуется , независимо от того , завершена ли транзакция ). Параметр holdlock применяется только к таблице или представлению , для которого он указан , и действует только на протяжении транзакции , содержащей данную команду select. Если была выполнена команда set transaction isolation level 3 , то установка holdlock неявно применяется ко всем командам select внутри транзакции . Ключевое слово holdlock недопустимо в команде select , содержащей параметр for browse . В одном запросе нельзя одновременно указывать параметры holdlock и noholdlock . Если службы Component Integration Services включены , параметр holdlock нельзя указывать для удаленных серверов . noholdlock Не дает серверу удерживать блокировки , полученные во время выпол — нения этой команды select ( независимо от действующего уровня изо — ляции транзакций ). В одном запросе нельзя одновременно указывать параметры holdlock и noholdlock . shared Указывает Adaptive Server использовать разделяемую блокировку ( вместо блокировки обновления ) для указанной таблицы или пред — ставления . Это позволяет другим клиентам получить блокировку обновления на эту таблицу или представление . Ключевое слово shared можно использовать только с инструкцией select , входящей в состав команды declare cursor , например : declare shared_crsr cursor for select title, title_id from titles shared where title_id like «BU%»

select Ключевое слово holdlock можно использовать вместе с ключевым словом shared после каждого имени таблицы или представления , ( при этом holdlock должно быть указано перед shared ). соединение ANSI Внутреннее или внешнее соединение , использующее синтаксис ANSI. Таблицы , участвующие в соединении , должны быть указаны в ин — струкции from . inner Указывает , что будет выполнено внутреннее соединение ( включающее только строки внутренней и внешней таблиц , удовлетворяющие усло — виям инструкции on ). Результирующий набор запроса с внутренним соединением не содержит строк внешней таблицы , не удовлетворяю — щих условиям инструкции on . outer Включает все строки внешней таблицы , независимо от того , удовле — творяют ли они условиям инструкции on . Если строки не удовлетво — ряют условиям инструкции on , значения из внутренней таблицы сохра — няются в итоговой таблице как значения NULL. То , какие строки будут включены в результирующий набор внешнего соединения ANSI, определяется инструкцией where . left При левом соединении выбираются все строки таблицы , указанной слева от инструкции join . Левую таблицу называют внешней таблицей , или таблицей с сохранением строк . В приведенных ниже запросах T1 – внешняя таблица , а T2 – внутренняя таблица : T1 left join T2 T2 right join T1 right При правом соединении выбираются все строки таблицы , указанной справа от инструкции join ( см . пример выше ) условия _ поиска используется для настройки условий для поиска строк . Условие поиска может включать имена столбцов , выражения , арифметические опера — торы , операторы сравнения , ключевые слова not , like , is null , and , or , between , in , exists , any и all , подзапросы , выражения case и любые комбинации этих элементов . Подробности см . в разделе “where” на стр . 767 .

ГЛАВА 7 Команды group by Вычисляет значение для каждой группы . Эти значения отображаются в наборе результатов не в виде новых строк , а в виде новых столбцов . В стандартном языке SQL в команде , содержащей инструкцию group by , все элементы списка выборки должны либо иметь фиксированное значение в каждой строке группы , либо являться агрегатными функ — циями , которые вычисляют скалярное значение для каждой группы . В Transact-SQL отсутствуют подобные ограничения на элементы в списке выборки . Кроме того , Transact-SQL позволяет выполнять груп — пировку по любому выражению ( кроме псевдонимов столбцов ), тогда как в стандартном языке SQL разрешена группировка только по столб — цам . В таблице 7-31 перечислены агрегатные функции , которые можно использовать с инструкцией group by ( выражение – это почти всегда имя столбца ): Таблица 7-31. Результаты использования агрегатных функций в инструкции group by

Агрегатная функция Результат
sum([all | distinct] выражение) Сумма значений числового столбца .
avg([all | distinct] выражение) Среднее значений числового столбца .
count([all | distinct] Количество отличных от NULL
выражение) ( различающихся ) значений в столбце .
COUNT(*) Количество выбранных строк .
max(выражение) Наибольшее значение в столбце .
min(выражение) Наименьшее значение в столбце .

Подробности см . в разделе “group by и having” на стр . 576 . Таблицу можно сгруппировать по любой комбинации столбцов , то есть группы могут быть вложены друг в друга . В инструкции group by можно указывать имя столбца , выражение или номер , представляющий позицию элемента в списке выборки , но не заголовок столбца . group by all Включает в набор результатов все группы , даже те , в которых нет строк , соответствующих условиям поиска . Пример см . в разделе “group by и having” на стр . 576 . выражение _ без _ агрегатов Выражение , в котором нет агрегатов .

select having Задает условия для инструкции group by аналогично тому , как инструк — ция where задает условия для инструкции select . Количество условий , которые можно включить в эту инструкцию , не ограничено . Инструкцию можно использовать having без инструкции group by . Если к каким — либо столбцам списка выборки не применяются агре — гатные функции и эти столбцы не включены в инструкцию group by ( что запрещено в стандартном SQL), то инструкции having и where будут иметь немного разную семантику . В этой ситуации инструкция where накладывает фильтр на строки , включаемые в агрегатное вычисление , но не накладывает фильтр на строки , возвращаемые запросом . И наоборот , инструкция having накладывает фильтр на строки , возвращаемые запросом , но не влияет на вычисление агрегатной функции . Примеры см . в разделе “group by и having” на стр . 576 . order by Сортирует набор результатов по столбцам . В Transact-SQL в инструк — ции order by можно указывать элементы , которые не перечислены в списке выборки . В инструкции order by можно указывать имена и заголовки ( псевдонимы ) столбцов , выражения , а также позиции эле — ментов в списке выборки ( номер _ в _ списке _ выборки ). Если в этой инструкции указан номер в списке выборки , столбцы , по которым нужно упорядочить набор результатов , должны быть включены в список выборки . Кроме того , в списке выборки в этом случае нельзя указывать символ “*”. asc Сортирует результаты по возрастанию ( этот порядок сортировки используется по умолчанию ). desc Сортирует результаты по убыванию . compute Используется с функциями агрегирования строк ( sum , avg , min , max и count ) для формирования итоговых значений по группам . Итоговые результаты отображаются в результирующем наборе запроса как дополнительные строки , что позволяет вывести с помощью одной команды как детальные , так и итоговые данные . Вместе с инструкцией compute нельзя использовать инструкцию select into .

compute by :

ГЛАВА 7 Команды Если указана инструкция compute by , необходимо также указать ин — струкцию order by . Столбцы , указанные в инструкции compute by , должны быть подмножеством столбцов , указанных в инструкции order by ( в частности , эти два набора столбцов могут в точности совпадать ). Кроме того , в этих двух инструкциях столбцы должны идти в одном и том же порядке и начинаться с одного и того же выражения , а столбцы , которые были смежными в одной инструкции , должны остаться смеж — ными и в другой . Например , для инструкции order by a, b, c возможны следующие варианты инструкции compute by a, b, c compute by a, b compute by a Ключевое слово compute можно использовать без ключевого слова by для создания общих итогов , подсчета общего количества строк и т . п . В этом случае инструкцию order by указывать необязательно . Подроб — ности и примеры см . в разделе “compute” на стр . 327 . Если службы Component Integration Services включены , инструкцию compute нельзя использовать для удаленных серверов . for Указывает , является ли набор результатов курсора обновляемым или доступным только для чтения . Этот параметр можно использовать только в хранимой процедуре , и только если запрос для курсора определен в этой процедуре . В этом случае в процедуре допустим только оператор select . Именно оператор select ( а не оператор declare cursor ) определяет режим курсора ( for read only или for update ). Преиму — щество этого метода объявления курсоров заключается в том , что при извлечении строк накладываются блокировки на уровне страницы . Для оператора select , содержащегося в хранимой процедуре и не опре — деляющего курсор , Adaptive Server игнорирует параметр for read only | update . Дополнительную информацию об объявлении курсоров с по — мощью хранимых процедур см . в документации по языку Embedded SQL™, а об обновляемых курсорах и курсорах только для чтения – в книге Transact-SQL User’s Guide . of список_имен_столбцов Столбцы из результирующего набора курсора , указанные после ключевого слова for update , можно обновлять .

at isolation

select at isolation Указывает уровень изоляции запроса (0, 1, 2 или 3). Если не указать эту инструкцию , в запросе будет использоваться уровень изоляции сеанса , в котором он выполняется ( по умолчанию – уровень изоляции 1). Инструкция at isolation допустима только в запросах , не являющихся частью другой команды ( см . ниже ), и в команде declare cursor . При использовании инструкции at isolation в следующих конструкциях СУБД Adaptive Server выдает сообщение о синтаксической ошибке : • В запросе с инструкцией into . • В подзапросе . • В запросе , являющемся частью команды create view . • В запросе , являющемся частью команды insert . • В запросе с инструкцией for browse . Если запрос содержит оператор union , инструкция at isolation должна быть указана после последнего запроса select , участвующего в объеди — нении . Если в запросе , в котором указан уровень изоляции read uncommitted , также указан параметр holdlock , noholdlock или shared , Adaptive Server выдаст предупреждение и проигнорирует инструкцию at isolation . Для других уровней изоляции параметр holdlock имеет приоритет над инструкцией at isolation . Дополнительную информацию об уровнях изоляции см . в книге Transact-SQL User’s Guide . Если службы Component Integration Services включены , параметр at isolation нельзя использовать для удаленных серверов . read uncommitted | 0 Указывает для запроса уровень изоляции 0. read committed | 1 Указывает для запроса уровень изоляции 1. repeatable read | 2 Указывает для запроса уровень изоляции 2. serializable | 3 Указывает для запроса уровень изоляции 3. for browse Этот параметр должен быть указан в конце команды SQL, отправленной на сервер Adaptive Server из приложения , использующего библиотеку DB-Library. Дополнительную информацию см . в книге Open Client DB-Library Reference Manual .

ГЛАВА 7 Команды plan «абстрактный план» Указывает абстрактный план , который будет использоваться для опти — мизации запроса . Это может быть полный или частичный план , напи — санный на языке абстрактных планов . Дополнительную информацию см . в главе 30, “ Руководство по написанию абстрактных планов ”, книги Руководство по настройке производительности .

Примеры Пример 1. Выбирает все строки и столбцы из таблицы publishers :
select * from publishers
pub_id pub_name city state
—— ————————— ——————— ——
0736 New Age Books Boston MA
0877 Binnet & Hardley Washington DC
1389 Algodata Infosystems Berkeley CA

Пример 2. Выбирает все строки из определенных столбцов таблицы publishers : select pub_id, pub_name, city, state from publishers Пример 3. Выбирает все строки из определенных столбцов таблицы publishers , подставляя вместо имени одного столбца псевдоним и добавляя строку к набору результатов : select «The publisher’s name is», Publisher = pub_name, pub_id from publishers

Publisher pub_id
———————— —————————— ——
The publisher’s name is New Age Books 0736
The publisher’s name is Binnet & Hardley 0877
The publisher’s name is Algodata Infosystems 1389

Пример 4. Выбирает все строки из определенных столбцов таблицы titles , подставляя вместо имен столбцов псевдонимы : select type as Type, price as Price from titles Пример 5. Указывает схему блокировки и интервал между резервными страницами для команды select into : select title_id, title, price into bus_titles lock datarows with reservepagegap = 10 from titles where type = «business»

Пример 6. Выбирает только строки , не блокированные в монопольном режиме . Если какой — то другой пользователь установил монопольную блокировку на строку , удовлетворяющую условию запроса , эта строка не возвращается : select title, price from titles readpast where type = «news» and price between $20 and $30 Пример 7. Выбирает определенные столбцы и строки , помещая результаты во временную таблицу # advance_rpt : select pub_id, total = sum (total_sales) into #advance_rpt from titles where advance < $10000 and total_sales is not null group by pub_id having count(*) >1 Пример 8. Выполняет конкатенацию двух столбцов и помещает результаты во временную таблицу # tempnames : select «Author_name» = au_fname + » » + au_lname into #tempnames from authors Пример 9. Выбирает определенные столбцы и строки , возвращает результаты , упорядоченные по столбцу type ( от наибольшего к наименьшему ), и вычисляет итоговые значения : select type, price, advance from titles order by type desc compute avg(price), sum(advance) by type compute sum(price), sum(advance) Пример 10. Выбирает определенные столбцы и строки и вычисляет итоги для столбцов price и advance : select type, price, advance from titles compute sum(price), sum(advance) Пример 11. Создает таблицу coffeetabletitles , имеющую ту же структуру , что и таблица titles , и заносит в нее строки этой таблицы , соответствующие книгам дороже $20: select * into coffeetabletitles from titles where price > $20

ГЛАВА 7 Команды Пример 12. Создает таблицу newtitles , имеющую ту же структуру , что и таблица titles , но не содержащую данных : select * into newtitles from titles where 1 = 0 Пример 13. Заносит в существующую таблицу authors строки с книгами дороже $20: select * into authors from titles where price > $20 Пример 14. Дает подсказку оптимизатору : select title_id, title from titles (index title_id_ind prefetch 16) where title_id like «BU%» Пример 15. Выбирает столбец IDENTITY из таблиц sales_east и sales_west , используя ключевое слово syb_identity : select sales_east.syb_identity, sales_west.syb_identity from sales_east, sales_west Пример 16. Создает таблицу newtitles , являющуюся копией таблицы titles , плюс столбец IDENTITY: select *, row_id = identity(10) into newtitles from titles Пример 17. Указывает уровень изоляции транзакции для запроса . select pub_id, pub_name from publishers at isolation read uncommitted Пример 18. Выполняет запрос к таблице titles , используя уровень изоляции repeatable read . Ни один другой пользователь не может изменять или удалять выбранные запросом строки , пока транзакция не завершится : begin tran select type, avg(price) from titles group by type at isolation repeatable read Пример 19. Дает подсказку оптимизатору о степени параллелизма для запроса : select ord_num from salesdetail (index salesdetail parallel 3)

select Пример 20. Соединяет таблицы titleauthor и titles по столбцу title_id . В набор результатов включаются только строки , для которых значение столбца price больше 15: select au_id, titles.title_id, title, price from titleauthor inner join titles on titleauthor.title_id = titles.title_id and price > 15 Пример 21. Этот набор результатов содержит всех авторов из таблицы authors . Для авторов , которые не живут в одном городе со своим издателем , столбец pub_name равен NULL. Только для авторов , которые живут в одном городе со своим издателем (Cheryl Carson и Abraham Bennet), столбец pub_name не равен NULL: select au_fname, au_lname, pub_name from authors left join publishers on authors.city = publishers.city Пример 22. Создает новую таблицу ( newtable ) на основе существующей ( oldtable ) и задает интервал между значениями столбца IDENTITY: select identity into newtable with identity_gap = 20 from oldtable

Дополнительную информацию см . в разделе “Managing Identity Gaps in
tables” главы 7, “Creating Databases and Tables”, книги Transact-SQL User’s
Guide .
Использование • Ключевые слова в команде select , как и во всех других командах ,
должны идти в порядке , указанном в синтаксисе .
• Максимальное количество выражений в команде select – 4096.
• Чтобы обеспечить совместимость с другими реализациями SQL,
после ключевого слова select можно указать ключевое слово all ( хотя
это делать необязательно , так как all – режим по умолчанию ). В этом
контексте ключевое слово all противоположно distinct . Оно включает
в результирующий набор все найденные строки , в том числе и
повторяющиеся .
• Во всех командах , кроме create table , create view и select into , заголовки
столбцов могут содержать любые символы , в том числе пробелы и
ключевые слова Adaptive Server ( при условии , что они заключены
в кавычки ). Если заголовок не заключен в кавычки , он должен соот —
ветствовать правилам именования идентификаторов .
• Символьная строка , указанная с ключевым словом like , не может
быть длиннее 255 байтов .

ГЛАВА 7 Команды • Команду select. for browse нельзя выполнять над таблицами , содержащими более 255 столбцов . • Заголовки столбцов и псевдонимы таблиц в командах create table , create view и select into должны соответствовать правилам именования идентификаторов . • Если команда select используется для вставки данных , то может слу — читься так , что исходная таблица содержит значения NULL, а в при — нимающей таблице значения NULL не допускаются . В этом случае необходимо указать значение , которое будет подставлено вместо значений NULL исходной таблицы . Например , для вставки данных в таблицу advances , которая не допускает значения NULL, в приве — денном ниже примере значения NULL заменяются на “0”: insert advances select pub_id, isnull(advance, 0) from titles Если бы не было этой функции isnull , эта команда вставила бы все строки со значениями , отличными от NULL, в таблицу advances и выдала бы сообщения об ошибках для всех строк таблицы titles , для которых столбец advance равен NULL. Если такую замену не сделать , нельзя будет вставить данные со зна — чениями NULL в столбцы с ограничением NOT NULL. Две таблицы могут иметь идентичную структуру , но отличаться тем , что для какого — либо столбца в одной таблице разрешены значения NULL, а для соответствующего столбца в другой – не разрешены . Чтобы узнать , какие столбцы допускают значения NULL, выполните процедуру sp_help . • Длина по умолчанию для данных типа text или image , возвращаемых командой select , равна 32 КБ . Это значение можно изменить с помо — щью команды set textsize . Значение для текущего сеанса хранится в глобальной переменной @@ textsize . Некоторые клиентские програм — мы могут выполнять команду set textsize при подключении к серверу Adaptive Server. • Данные с удаленных серверов Adaptive Server можно извлечь с помо — щью вызовов удаленных процедур . Подробности см . в описании команд create procedure и execute . • Команда select , используемая в определении курсора ( команде declare cursor ), должна содержать инструкцию from , но не может содержать инструкций compute , for browse и into . Если команда select содержит какую — либо из следующих конструкций , курсор считается необновляемым и доступным только для чтения :

select into
declare cursor .

select • distinct , параметр • group by , инструкция • Агрегатные функции • union , оператор Если в хранимой процедуре объявляется курсор с помощью команды select , содержащей инструкцию order by , то этот курсор считается доступным только для чтения . Через курсор , определенный коман — дой select , содержащей соединение двух и более таблиц , нельзя уда — лить строку ( даже если курсор считается обновляемым ). Подробнос — ти см . в описании команды • Если команда select , присваивающая значение переменной , возвра — щает более одной строки , переменной присваивается последнее воз — вращенное значение . Например : declare @x varchar(40) select @x = pub_name from publishers print @x (3 rows affected) Algodata Infosystems Использование синтаксиса ANSI-соединений • Перед тем как приступить к написанию запросов с использованием синтаксиса внутренних и внешних ANSI- соединений , прочитайте раздел “Outer Joins” главы 4, “Joins: Retrieving Data From Several Tables”, книги Transact-SQL User’s Guide . Использование команды select into • select into является двухшаговой операцией . На первом шаге создается новая таблица , а на втором в нее вставляются указанные строки . Примечание . С помощью команды select into можно вставлять строки и в существующую таблицу . Поскольку операции вставки строк с помощью команды не записываются в журнал , команды select into нельзя выполнять внутри пользовательских транзакций , даже если параметр базы данных tran равен true . Однако выделение страниц при выполнении операций select into записывается в журнал , поэтому операции select into могут заполнить журнал транзакций .

ГЛАВА 7 Команды Если в команде select into происходит сбой после создания новой таб — лицы , то таблица не удаляется автоматически и ее первая страница данных не освобождается . Это означает , что все строки , вставленные на первую страницу до ошибки , остаются на этой странице . Проверь — те значение глобальной переменной @@ error после выполнения команды select into , чтобы убедиться в отсуствии ошибок . Удалите новую таблицу с помощью команды drop table , а затем повторно выполните команду select into . • Имя новой таблицы должно быть уникально в базе данных и соот — ветствовать правилам именования идентификаторов . С помощью команды select into можно вставить строки во временные таблицы ( см . примеры 7, 8 и 11). • Никакие правила , ограничения или значения по умолчанию , связанные с исходной таблицей , не переносятся на новую таблицу . Для привязки правил или значений по умолчанию к новой таблице нужно выполнить системные процедуры sp_bindrule и sp_bindefault . • Команда select into не копирует в новую таблицу значение параметра max_rows_per_page для исходной таблицы . В новой таблице значение параметра max_rows_per_page будет равно 0. Чтобы присвоить ему значение , выполните системную процедуру sp_chgattribute . • Чтобы с помощью команды select into можно было вставить строки в постоянную таблицу , параметру select into/bulkcopy/pllsort нужно присвоить значение true ( с помощью системной процедуры sp_dboption ). Если же команда select into используется для вставки во временную таблицу , параметр select into/bulkcopy/pllsort не требуется устанавливать в true , поскольку временная база данных никогда не восстанавливается . После выполнения команды select into необходимо сделать полную резервную копию базы данных , прежде чем можно будет исполь — зовать команду dump transaction . Для операций select into записы — вается в журнал только выделение страниц , но не изменение строк данных . Следовательно , изменения нельзя восстановить по журна — лам транзакций . В такой ситуации при запуске команды dump transaction будет выдано сообщение об ошибке , указывающее , что вместо него нужно выполнить команду dump database . По умолчанию параметр select into/bulkcopy/pllsort в созданных базах данных устанавливается в false . Можно изменить это значение по умолчанию , установив этот параметр в true в базе данных model . • Команда select into работает медленнее , если в это же время выполняется команда dump database .

select • С помощью команды select into можно скопировать структуру табли — цы , не занося в новую таблицу никаких данных . Для этого нужно за — дать ложное условие в инструкции where ( см . пример 12). • Каждому столбцу в списке выборки , содержащему агрегатную функ — цию или выражение , нужно назначить заголовок . Это относится ко всем константам , арифметическим и символьным выражениям , встроенным функциям и элементам , образуемым путем конкатена — ции других элементов в списке выборки . Заголовок столбца должен быть допустимым идентификатором или должен быть заключен в кавычки ( см . примеры 7 и 8). • Для столбцов таблицы , создаваемой командой select into , типы дан — ных и допустимость значений NULL назначаются неявно , например : select x = getdate() into mytable В этом случае столбец новой таблицы не будет допускать значений NULL, независимо от значения параметра allow nulls by default . Это зависит от того , в каком контексте используется команда select и какие еще команды есть в запросе . С помощью синтаксиса convert можно явно указать тип данных и допустимость значений NULL для результирующих столбцов , а не принимать настройки по умолчанию . Можно применить к getdate функцию , результатом которой может быть NULL, например : select x = nullif(getdate(), «1/1/1900») into mytable или использовать функцию convert : select x = convert(datetime null, getdate()) into mytable • Команду select into нельзя использовать в пользовательских транзакциях и вместе с инструкцией compute . • Чтобы выбрать столбец IDENTITY в результирующую таблицу , нужно включить имя этого столбца ( или ключевое слово syb_identity ) в список _ столбцов команды select . Новый столбец подчиняется следующим правилам : • Если столбец IDENTITY выбирается несколько раз , то в новой таблице он будет определен как NOT NULL. Этот столбец не унаследует свойство IDENTITY.

ГЛАВА 7 Команды • Если столбец IDENTITY указан в списке выборки в составе вы — ражения , результирующий столбец также не наследует свойство IDENTITY. Новый столбец будет допускать значения NULL, если какой — либо из столбцов в выражении допускает значения NULL; в противном случае он создается с ограничением NOT NULL. • Если команда select содержит инструкцию group by или агре — гатную функцию , результирующий столбец не унаследует свойство IDENTITY. Столбцы , содержащие агрегатную функ — цию над столбцом IDENTITY, будут допускать значения NULL, остальные – нет . • Столбец IDENTITY, который выбирается в таблицу с объеди — нением (union) или соединением (join), не сохраняет свой — ство IDENTITY. Если таблица содержит объединение столбца IDENTITY и столбца , допускающего значения NULL, новый столбец тоже будет допускать значения NULL. В противном случае он будет определен как NOT NULL. • С помощью команды select into нельзя создавать таблицу с несколь — кими столбцами IDENTITY. Если в команде select указан как сущест — вующий столбец IDENTITY, так и новая спецификация IDENTITY в виде имя _ столбца = identity ( точность ) , эта команда не будет выпол — нена и возвратит ошибку . • Если службы Component Integration Services включены и таблица , указанная после ключевого слова into , хранится на сервере Adaptive Server, то сервер использует подпрограммы массового копирования для копирования данных в новую таблицу . Перед выполнением ко — манды select into с удаленными таблицами задайте параметру базы данных select into/bulkcopy значение true . • Дополнительную информацию о команде Embedded SQL select into список _ переменных _ базового _ языка см . в книге Open Client Embedded SQL Reference Manual . Изменение допустимости значений NULL для результирующего столбца в команде select. into • С помощью команды convert можно разрешить или запретить значе — ния NULL в столбце , в который выбираются данные . Например , следующая команда выбирает данные из таблицы titles в таблицу temp_titles , при этом для столбца total_sales устанавливается ограни — чение not null ( хотя для соответствующего столбца в исходной таблице этого ограничения не было ):

select select title, convert (char(100) not null, total_sales) total_sales into #tempsales from titles Указание схемы блокировки с помощью select. into • Параметр lock команды select. into позволяет указать схему блоки — ровки для таблицы , создаваемой этой командой . Если не указать схему блокировки , применяется схема блокировки по умолчанию , заданная параметром конфигурации lock scheme . • При использовании параметра lock также можно указать свойства управления пространством max_rows_per_page , exp_row_size и reservepagegap . Свойства управления пространством для таблицы , созданной с помо — щью команды select into , можно изменить с помощью системной процедуры sp_chgattribute . Использование index , prefetch и lru | mru • Параметры index , prefetch и lru | mru позволяют указать индекс , стра — тегии кэширования и ввода — вывода для выполнения запроса . Эти параметры переопределяют значения , выбранные оптимизатором Adaptive Server. Их следует использовать очень осторожно , а также всегда проверять их влияние на производительность с помощью команды set statistics io on . Дополнительную информацию об этих параметрах см . в книге Руководство по настройке производитель — ности . Использование параметра parallel • Параметр parallel уменьшает число рабочих потоков , которые оптимизатор Adaptive Server может использовать для параллельной обработки . Значение степени _ параллелизма не может превышать значение max parallel degree . Если значение , указанное в параметре parallel , больше значения max parallel degree , этот параметр будет проигнорирован оптимизатором . • Когда несколько рабочих процессов объединяют свои результаты , порядок строк , возвращаемых Adaptive Server, не определен и может быть разным при выполнении одной и той же команды . Чтобы полу — чить строки из секционированной таблицы в согласованном порядке , используйте инструкцию order by или отмените параллельное выпол — нение запроса , указав параметр parallel 1 в инструкции from запроса . • Инструкция from с параметром parallel игнорируется в следующих случаях :

ГЛАВА 7 Команды • Команда select используется для обновления или вставки . • Инструкция from используется в определении курсора . • Параметр parallel используется в инструкции from во внутреннем блоке подзапроса . • Команда select создает представление . • Таблица является внутренней во внешнем соединении . • В запросе используются функции min или max над данными таблицы и указан индекс . • Указан несекционированный кластерный индекс , или только с его помощью можно выполнить запрос параллельно . • В запросе указана инструкция exists для таблицы . • Значение параметра конфигурации max scan parallel degree равно 1, и в запросе указан индекс . • Запрос покрывает некластерный индекс . Дополнительную информацию о покрытии запросов индексами см . в главе 9, “ Как работают индексы ”, книги Руководство по настройке производительности . • Таблица является системной или виртуальной . • Запрос обрабатывается по стратегии OR. Описание стратегии OR см . в книге Руководство по настройке производительности . • Запрос выдает пользователю большое количество строк . Использование параметра readpast • Параметр readpast позволяет команде select обращаться к указанной таблице , не ожидая снятия несовместимых блокировок , удерживае — мых другими задачами . Параметр readpast можно указывать только в запросах к таблицам с блокировкой только данных . • Если параметр readpast указан для таблицы с блокировкой всех стра — ниц , он игнорируется . Команда выполняется с уровнем изоляции , указанным для этой команды или для сеанса . Если используется уровень изоляции 0, выполняется “ грязное ” чтение . В этом случае команда возвращает значения из заблокированных строк и не ожидает снятия блокировки . Если же уровень изоляции – 1 или 3, команда ожидает снятия несовместимых блокировок со страниц , которые она должна прочитать .

select

• Комбинации уровней изоляции , заданных для сеанса , и значений
параметра readpast для таблицы , заданных в команде select , описаны
в таблице 7-32 .
Таблица 7-32. Комбинации уровней изоляции для сеанса и
значений параметра readpast
Уровень изоляции Результат
сеанса
0 , read uncommitted Параметр readpast игнорируется , и пользователю возвращаются строки ,
(“ грязные ” чтения ) содержащие еще незафиксированные данные . Также выводится
соответствующее предупреждение .
1 , read committed Строки или страницы с несовместимыми блокировками не выбираются
запросом ; читаемые строки или страницы не блокируются .
Запрос с ключевым словом readpast может возвратить одинаковые строки ,
причем добавление инструкции distinct не решит проблему .
Чтобы избежать этого , вместе с ключевым словом readpast нужно указать не
только инструкцию distinct , но и инструкцию group by .
2 , repeatable read Строки или страницы с несовместимыми блокировками не выбираются
запросом ; для всех считываемых строк или страниц удерживаются
разделяемые блокировки до окончания команды или транзакции ;
блокируются все страницы , считываемые командой , до завершения
транзакции .
3 , serializable Параметр readpast игнорируется , команда выполняется с уровнем изоляции 3.
Выполнение команды прерывается , если она встречает строку или страницу с
несовместимыми блокировками .
• Команда select с параметром readpast не будет выполнена и выдаст
сообщение об ошибке , если она содержит :
• инструкцию at isolation , задающую уровень изоляции 0 ( read
uncommitted );
• инструкцию at isolation , задающую уровень изоляции 3
( serializable );
• ключевое слово holdlock для той же таблицы .
• Если в запросе select , содержащем параметр readpast , также указан
параметр at isolation 2 ( или at isolation repeatable read ), то разделяемые
блокировки таблиц , для которых указано ключевое слово readpast ,
удерживаются до завершения команды или транзакции .
• Если команда select с параметром readpast обнаруживает текстовый
столбец , заблокированный несовместимой блокировкой , соответ —
ствующая строка будет извлечена , но значение этого текстового
столбца будет равно null . В этом случае нельзя будет понять , был
ли текстовый столбец равен NULL в исходной таблице , или значение
NULL было возвращено из — за того , что столбец блокирован .
ГЛАВА 7 Команды
Стандарты Уровень соответствия стандарту SQL92 : совместимость с базовым
уровнем стандарта .
Тем не менее , в Transact-SQL существуют следующие расширения этой
команды :
• инструкция into для создания новой таблицы ;
инструкции lock ;
инструкции compute ;
• глобальные и локальные переменные ;
• инструкции index , prefetch, parallel и lru | mru ;
• ключевые слова holdlock , noholdlock и shared ;
• синтаксис “ заголовок _ столбца = имя _ столбца ”;
• полные имена таблиц и столбцов ;
• select в инструкции for browse
• использование в списке выборки столбцов , которых нет в списке
group by и к которым не применяются агрегатные функции ;
• параметр at isolation repeatable read | 2.
Полномочия По умолчанию команду select разрешено выполнять владельцу таблицы
или представления , который может предоставить это право другим
пользователям .
См. также Команды compute , create index , create trigger , delete , group by и having ,

insert , order by , set , union , update , where Функции avg , count , isnull , max , min , sum Системные процедуры sp_cachestrategy , sp_chgattribute , sp_dboption
set set

Описание Задает параметры обработки запросов , действующие в течение рабочего
сеанса пользователя , а также некоторые параметры внутри триггеров или
хранимых процедур .
Синтаксис set ansinull
set ansi_permissions
set arithabort [arith_overflow | numeric_truncation]
set arithignore [arith_overflow]
set
self_recursion, showplan, sort_resources>
set char_convert ] |
charset [with ]>
set cis_rpc_handling
set [clientname имя _ клиента | clienthostname
имя _ узла | clientapplname имя _ приложения]
set cursor rows количество for имя _ курсора
set
language язык>
set explicit_transaction_required [true | false]
set fipsflagger
set flushmessage
set forceplan
set identity_insert [база _ данных.[владелец.]]имя _ таблицы
set jtc
set lock
set offsets
procedure, statement, param, execute>
set parallel_degree число
set plan [имя _ группы]
set plan exists check
set plan replace
set prefetch [on|off]
set process_limit_action
set proxy login_name

ГЛАВА 7 Команды set quoted_identifier set role set set scan_parallel_degree количество set session authorization login_name set sort_merge set statistics set statistics simulate < on | off >set strict_dtm_enforcement set string_rtruncation set table count количество set textsize set transaction isolation level < [ read uncommitted | 0 ] | [ read committed | 1 ] | [ repeatable read | 2 ]| [ serializable | 3 ] >set transactional_rpc Параметры ansinull Определяет , обрабатываются ли операнды со значением NULL в агре — гатных функциях в соответствии со стандартом SQL92. Если параметр set ansinull равен on , Adaptive Server выдает предупреждение , когда агрегатная функция исключает операнд со значением NULL из вычис — ления . Этот параметр не влияет на обработку Adaptive Server значений NULL при сравнении на равенство (=) или неравенство (!=). Например , если параметр set ansinull имеет значение off ( значение по умолчанию ), то результатом следующего запроса к таблице titles : select max(total_sales) from titles будет : ———— 22246 Если же этот параметр равен on , этот запрос возвратит то же значение , а также сообщение об ошибке , поскольку столбец total_sales содержит значения NULL: ———— 22246 Warning — null value eliminated in set function

arith_overflow on
arithabort arith_overflow и arithabort
set Это сообщение указывает , что некоторые строки в этой таблице содержат значение NULL в столбце total_sales , то есть нет полной информации о суммарных продажах по всем книгам . Однако из доступных данных возвращенное значение является наибольшим . ansi_permissions Определяет , проверяется ли соблюдение требований SQL92 по полномочиям для команд delete и update . Значение по умолчанию – off . Требования по полномочиям приведены в таблице 7-33 : Таблица 7-33. Полномочия , необходимые для операций обновления и удаления данных

Команда Полномочия , необходимые Полномочия , необходимые при параметре
при параметре set set ansi_permissions, равном on
ansi_permissions, равном off
update Полномочия update для • Полномочия update для столбцов , чьи значения
столбцов , чьи значения устанавливаются этой командой
устанавливаются этой • Полномочия select для всех столбцов , перечисленных
командой в инструкции where
• Полномочия select для всех столбцов , указанных
в правой части инструкции set
delete Полномочия delete для • Полномочия delete для таблицы .
таблицы • Полномочия select для всех столбцов , перечисленных
в инструкции where

arithabort Определяет поведение Adaptive Server при возникновении ариф — метических ошибок . Параметры numeric_truncation обрабатывают разные типы арифметических оши — бок . Эти параметры можно устанавливать как отдельно друг от друга , так и оба сразу с помощью оператора set arithabort on или set arithabort off . • Параметр arithabort arith_overflow определяет поведение Adaptive Server при ошибке , связанной с делением на ноль или с потерей точности при явном или неявном преобразовании типа данных . Ошибки этого типа серьезны . Если задан параметр arithabort ( значение по умолчанию ), то происходит откат всей транзакции , в которой встречается такая ошибка . Если эта ошибка происходит в пакете , который не содержит транзакций , то при настройке arithabort arith_overflow on не происходит откат предыдущих команд пакета ; СУБД Adaptive Server не выполняет все остальные команды пакета , следующие за ошибочной командой .
begin transaction

ГЛАВА 7 Команды Если же задано arithabort arith_overflow off , Adaptive Server отменяет команду , вызвавшую ошибку , но продолжает обработку других команд в транзакции или пакете . • Параметр arithabort numeric_truncation определяет поведение Adaptive Server при потере масштаба числовым типом данных с точным представлением , возникающей при неявном преобразо — вании типов данных . ( Если потеря масштаба происходит при яв — ном преобразовании типов , из результата выбрасываются поте — рянные цифры , а предупреждение не выдается ). Если этот пара — метр равен on ( значение по умолчанию ), Adaptive Server отменяет команду , вызвавшую ошибку , но продолжает обработку других команд в транзакции или пакете . Если же этот параметр равен off , Adaptive Server выбрасывает из результатов запроса потерянные цифры и продолжает обработку . arithignore arith_overflow Определяет , выводит ли Adaptive Server сообщение после ошибки , связанной с делением на ноль или потерей точности . По умолчанию параметр arithignore равен off . В этом случае Adaptive Server выводит предупреждающее сообщение , если при выполнении запроса возни — кает числовое переполнение . Чтобы Adaptive Server игнорировал ошибки переполнения , установите параметр arithignore в on . Можно опустить необязательное ключевое слово arith_overflow . chained Начинает транзакцию в начале сеанса и после завершения другой транзакции , сразу перед первой командой , выполняющей поиск или изменение данных . В связанном режиме транзакций сервер Adaptive Server неявно выполняет команду перед командами delete , fetch , insert , open , select и update . Команду set chained нельзя выполнять в транзакции . char_convert Включает и отключает преобразование набора символов между Adaptive Server и клиентом . Если клиент использует библиотеку Open Client DB-Library версии 4.6 или выше , а его набор символов отли — чается от набора символов на клиенте , преобразование включается во время соединения с сервером , а его входной набор символов выби — рается по умолчанию согласно набору символов , используемому клиентом . Можно также явно указать , какой набор символов будет являться входным для преобразования , с помощью команды set char_convert набор_символов . charset – это идентификатор набора символов либо имя из таблицы syscharsets со значением столбца type меньше 2000.

set Настройка set char_convert off отключает преобразование , в результате чего символы не меняются при отправке и получении . Параметр set char_convert on включает преобразование , если оно в настоящий момент отключено . Если преобразование набора символов не было включено во время подключения к серверу или с помощью команды set char_convert , то команда set char_convert on выдает сообщение об ошибке . Если было включено преобразование набора символов с помощью команды set char_convert набор_символов , но Adaptive Server не может выполнить это преобразование , то состояние преобразования оста — нется тем же , каким было до запроса . Например , если до выполнения команды set char_convert набор_символов преобразование было отключено , оно останется отключенным при ошибке в запросе . Если в команде set char_convert указан параметр with no_error , сервер Adaptive Server не будет уведомлять приложение о том , что набор символов сервера не может быть преобразован в набор символов клиента . Выдача сообщений об ошибках изначально включена при подключении клиента к Adaptive Server. Чтобы не получать сообщения об ошибках , ее можно отключить для всех сеансов с помощью команды set char_convert with no_error . Чтобы включить сообщения об ошибках во время сеанса , выполните команду set char_convert with error . Независимо от того , включена ли выдача сообщений об ошибках , байты , которые нельзя преобразовать , заменяются вопросительными знаками ASCII (?). Дополнительную информацию об обработке ошибок при преобра — зовании символов см . в книге Руководство по системному админи — стрированию . cis_rpc_handling Определяет , обрабатываются ли по умолчанию исходящие вызовы удаленных процедур службами Component Integration Services. clientapplname Назначает приложению индивидуальное имя . Это позволяет различать клиентов в системе , где множество клиентов подключаются к Adaptive Server, используя одно и то же имя приложения . Новое имя приложе — ния будет также занесено в таблицу sysprocesses . clienthostname Назначает узлу индивидуальное имя . Это позволяет различать клиентов в системе , где множество клиентов подключаются к Adaptive Server, используя одно и то же имя узла . Новое имя хоста будет также занесено в таблицу sysprocesses .

ГЛАВА 7 Команды clientname Назначает клиенту индивидуальное имя . Это позволяет различать клиентов в системе , где множество клиентов подключаются к Adaptive Server, используя одно и то же имя клиента . Новое имя пользователя будет также занесено в таблицу sysprocesses . close on endtran Указывает серверу Adaptive Server закрыть все открытые в транзакции курсоры в конце этой транзакции . Транзакция завершается командой commit или rollback . Следует отметить , что будут закрыты только кур — соры , объявленные в блоке , в котором был задан этот параметр ( хра — нимой процедуре , триггере и т . п .). Дополнительную информацию об областях действия курсоров см . в книге Transact-SQL User’s Guide . Дополнительную информацию об опробованной конфигурации см . в книге Руководство по системному администрированию . cursor rows Указывает , что будет возвращаться количество строк , равное значе — нию параметра количество , при каждом запросе на извлечение данных через курсор , поступающем от клиентского приложения . Значение параметра количество может быть числовой константой без десятич — ной точки или локальной переменной типа integer . Если в качестве количества было задано неположительное значение , этот параметр устанавливается в 1. Параметр cursor rows можно установить для курсора независимо от того , закрыт он или открыт . Однако этот пара — метр не действует , если команда fetch содержит инструкцию into . Пара — метр имя _ курсора указывает курсор , для которого задается количество возвращаемых строк . datefirst Присваивает первому дню недели номер ( от 1 до 7). Для языка us_english значение по умолчанию – 1 ( воскресенье ). dateformat Задает порядок , в котором идут части даты ( месяц , день и год ) для ввода значения типа данных datetime или smalldatetime . Допустимые значения : mdy ( месяц / день / год ), dmy ( день / месяц / год ), ymd ( год / месяц / день ), ydm ( год / день / месяц ), myd ( месяц / год / день ) и dym ( день / год / месяц ). Для языка us_english значение по умолчанию – mdy . explicit_transaction_required Если этот параметр установлен в true, нельзя будет начать неявную транзакцию , а также отправить вызов удаленной процедуры на удаленный сервер вне транзакции . Все остальные команды будут выполнены успешно .

set fipsflagger Определяет , будет ли выдаваться предупреждение при использо — вании расширения базового уровня SQL92, доступное в Transact-SQL. По умолчанию Adaptive Server не выводит предупреждения при ис — пользовании нестандартного SQL. Этот параметр не отключает расши — рений SQL. Обработка будет нормально завершена при вводе команды , не соответствующей стандарту ANSI SQL. flushmessage Определяет , когда Adaptive Server будет выдавать сообщения пользова — телю . По умолчанию сообщения хранятся в буфере , пока сформиро — вавший их запрос не завершится или буфер не переполнится . Если выполнить команду set flushmessage on , сообщения будут выдаваться пользователю сразу после того , как они были сформированы . forceplan Указывает оптимизатору запросов , что в плане запроса должен ис — пользоваться такой же порядок соединения , что и порядок таблиц в инструкции from этого запроса . Параметр forceplan обычно использует — ся , когда оптимизатору не удается выбрать хороший план . Навязыва — ние неправильного плана может существенно понизить скорость ввода — вывода и производительность . Дополнительную информацию см . в книге Руководство по настройке производительности . identity_insert Определяет , допустимы ли явные вставки данных в столбец IDENTITY указанной таблицы . ( Обновления столбца IDENTITY никогда не допускаются .) Этот параметр может использоваться только с базовыми таблицами . Его нельзя использовать с представлениями или задавать в триггере . Если установить параметр identity_insert имя _ таблицы в on , то владе — лец таблицы , владелец базы данных или системный администратор смогут явным образом вставлять значения в столбец IDENTITY. Вставка значения в столбец IDENTITY позволяет указать начальное значение для столбца или восстановить строку , удаленную по ошибке . Если по столбцу IDENTITY не был создан уникальный индекс , Adaptive Server не проверяет уникальность вставленного значения ; поэтому можно вставлять любое положительное целое число . Команду set identity_insert имя _ таблицы on для таблицы со столбцом IDENTITY могут выполнять ( тем самым разрешая ручную вставку значений в столбец IDENTITY) владелец таблицы , владелец базы

noexec off .
set nocount off

ГЛАВА 7 Команды данных или системный администратор . Однако только следующие пользователи действительно могут вставлять значения в столбец IDENTITY, если параметр identity_insert установлен в on : • владелец таблицы ; • владелец базы данных в следующих случаях : • Если владелец таблицы явно предоставил ему полномочия insert на этот столбец • Если он выдает себя за владельца таблицы ( для чего он должен выполнить команду setuser) Если установлено значение параметра identity_insert имя_таблицы off , то явная вставка в столбцы IDENTITY запрещается . Команду set identity_insert имя_таблицы on можно выполнить с отдельной таблицей базы данных в любое время в течение сеанса . jtc Включает / отключает режим транзитивного замыкания соединений . Дополнительную информацию см . в книге Руководство по настройке производительности . language Официальное название языка , на котором отображаются системные сообщения . Этот язык должен быть установлен на Adaptive Server. Значение по умолчанию – us_english. nocount Указывает , будет ли отображаться количество строк , обработанных командой . Установка set nocount on отключает отображение коли — чества строк , а – включает . noexec Компилирует все запросы , не выполняя их . Параметр noexec часто используется с параметром showplan . После того как установлен параметр noexec on , никакие команды ( в том числе другие команды set ) не выполняются , пока не будет установлен параметр При этой установке все запросы компилируются , но не выполняются . Команда set fmtonlyon часто используется с параметром showplan для устранения неполадок . Параметр noexec on можно установить сразу после выполнения запроса . В результате последующие команды ( в том числе другие команды set ) не будут выполняться , пока не будет установлен параметр noexec off . Параметр set noexec можно использовать в хранимых процедурах .

select , from , order , compute , table , procedure , statement,

set lock wait Задает период времени , в течение которого команда может ожидать получения блокировки . Когда этот период истечет , команда завер — шится с сообщением об ошибке . количество _ секунд Количество секунд , которые команда будет ожидать получения блокировки . Допустимые значения – от 0 до 2147483647 ( макси — мальное значение для типа integer). lock nowait Указывает , что если команда не может установить блокировку немед — ленно , она завершается ошибкой . Команда set lock nowait эквивалентна set lock wait 0 . offsets Возвращает позицию указанных ключевых слов ( относительно начала запроса ) в операторах Transact-SQL. Список ключевых слов , отделен — ных друг от друга запятыми , может содержать следующие конструк — ции Transact-SQL: param и execute . Adaptive Server возвращает смещения при отсутствии ошибок . Этот параметр может использоваться только в библиотеке Open Client DB-Library. parallel_degree Указывает верхний предел для количества рабочих процессов , участ — вующих в параллельном выполнении запроса . Это число должно быть не больше значения параметра конфигурации max parallel degree ( за — дающего количество рабочих процессов , которое может использо — ваться для одного запроса ). Текущая настройка хранится в глобальной переменной @@ parallel_degree . parseonly Проверяет синтаксис всех запросов и выдает сообщения об ошибках , не компилируя и не выполняя запрос . Параметр parseonly нельзя использовать в хранимых процедурах и триггерах . plan Указывает , что команда работает с абстрактным планом . Дополни — тельную информацию см . в главе 30, “ Создание и использование абстрактных планов ”, книги Руководство по настройке производи — тельности . dump Включает и отключает сохранение абстрактных планов для текущего соединения . Если имя _ группы не указано , планы сохраняются в груп — пе , установленной по умолчанию ( ap_stdout ).

ГЛАВА 7 Команды load Включает и отключает загрузку абстрактных планов для текущего со — единения . Если имя _ группы не указано , планы загружаются из группы , установленной по умолчанию ( ap_stdin ). имя _ группы Имя группы абстрактных планов , которая должна использоваться для загрузки или хранения планов . exists check Если этот параметр , а также параметр set plan load установлены в on , хэш — ключи для не более чем 20 запросов из группы абстрактных планов сохраняются в кэше , выделенном пользователю . replace Включает и отключает замену существующих абстрактных планов в режиме сохранения планов . По умолчанию замена планов отключена . prefetch Включает и отключает операции ввода — вывода большого объема из кэша данных . process_limit_action Указывает , будет ли Adaptive Server выполнять параллельные запросы , если доступных рабочих процессов недостаточно . В этом случае , если параметр process_limit_action установлен в quiet , Adaptive Server скор — ректирует план ( без выдачи сообщения ) таким образом , чтобы степень параллелизма не превышала количество доступных процессов . Если параметр process_limit_action установлен в warning , то при недостаточ — ном количестве доступных рабочих процессов Adaptive Server выдает предупреждающее сообщение во время корректировки плана . Если же параметр process_limit_action установлен в abort , Adaptive Server пре — кратит выполнение запроса и выдаст поясняющее сообщение “an insufficient number of worker processes are available” ( не хватает доступ — ных рабочих процессов ). procid Возвращает идентификационный номер хранимой процедуры в библиотеку Open Client DB-Library/C ( а не пользователю ) перед отправкой строк , сформированных этой хранимой процедурой . proxy Позволяет использовать полномочия , регистрационное имя и suid ( идентификатор пользователя на сервере ) пользователя , определен — ного регистрационным _ именем . регистрационное _ имя должно быть допустимым регистрационным именем из таблицы master..syslogins ,

set proxy login_name ,

set заключенным в кавычки . Чтобы вернуться к исходному регистрацион — ному имени и идентификатору suid , выполните команду set proxy с ис — ходным регистрационным _ именем . Примечание . Ни роль sa_role, ни роль sso_role не позволяют пользо — вателю выполнить команду set proxy login_name , если у него нет на это явных полномочий . Чтобы использовать команду любой пользователь ( в том числе администратор безопасности ) должен обладать полномочиями , явно предоставленными администратором безопасности . Подробности см . в разделе “ Использование команд set proxy и set session authorization” на стр . 730 . quoted_identifier Определяет , распознает ли Adaptive Server идентификаторы с раздели — телями . По умолчанию параметр quoted_identifier равен off и все иденти — фикаторы должны соответствовать правилам по именованию иденти — фикаторов . Если параметр set quoted_identifier установлен в on, имена таблиц , представлений и столбцов могут начинаться не с буквы и включать символы , которые нельзя было бы использовать , если бы этот параметр был равен off. Кроме того , имена могут быть зарезер — вированными словами ( такие идентификаторы нужно заключить в двойные кавычки ). Идентификаторы с разделителями не могут быть длиннее 28 байтов , могут распознаваться не всеми клиентскими про — граммами , а их использование в качестве параметров системных про — цедур может привести к неожиданным результатам . Если параметр quoted_identifier установлен в on , все символьные стро — ки , заключенные в двойные кавычки , воспринимаются как идентифи — каторы . Символьные или битовые строки должны быть заключены в одинарные кавычки . роль Включает или отключает указанную роль во время текущего сеанса . Когда пользователь соединяется с сервером , все предоставленные ему системные роли включаются . Для отключения роли нужно выполнить команду set role имя_роли off , для включения – команду set role имя_роли on . sa_role, sso_role и oper_role – это системные роли . Пользо — ватель , не зарегистрированный в текущей базе данных , в которой нет роли пользователя — гостя , не может отключить роль sa_role , так как ему не назначен идентификатор пользователя на сервере .

max scan parallel

ГЛАВА 7 Команды имя _ роли Имя определенной пользователем роли , созданной администратором по безопасности . Роли , определенные пользователем , по умолчанию отключены . Чтобы включить такую роль при соединении с сервером , пользователь или администратор по безопасности должен выполнить команду set role on . with пароль Указывает пароль , который активирует роль . Если для определенной пользователем роли назначен пароль , необходимо указать именно этот пароль . rowcount Указывает Adaptive Server прекратить выполнение команд SQL ( select , insert , update или delete ) после того , как было обработано заданное ко — личество строк . количество может быть числовым литералом без десятичной точки или локальной переменной типа integer . Чтобы отключить этот параметр , введите : set rowcount 0 scan_parallel_degree Указывает максимальную степень параллелизма в сеансе для сканиро — ваний таблицы на основе хэш — функции ( параллельных сканирований индексов и несекционированных таблиц ). Это число должно быть не больше текущего значения параметра конфигурации degree . Текущее значение хранится в глобальной переменной @@ scan_parallel_degree . self_recursion Определяет , могут ли триггеры вызывать сами себя ( это называется саморекурсия ). По умолчанию Adaptive Server не допускает саморе — курсии триггеров . Этот параметр можно включить только для теку — щего сеанса клиента ; его действие ограничивается областью действия триггера , в котором он установлен . Например , после того как триггер , в котором установлен параметр self_recursion on , завершается или вы — зывает срабатывание другого триггера , параметр снова становится равным off . Этот параметр работает только внутри триггера и не влияет на пользовательские сеансы . session authorization Установка этого параметра идентична команде set proxy , за тем исклю — чением , что set session authorization соответствует стандарту SQL, а команда set proxy является расширением , появившимся в Transact-SQL.

set showplan Формирует описание плана обработки запроса . Результаты showplan используются при диагностике производительности . Установка пара — метра showplan в хранимой процедуре или триггере не выводит резуль — таты . Для параллельных запросов результаты , сгенерированные в ре — зультате установки параметра showplan , также включают в себя план запроса , скорректированный на этапе выполнения ( если корректиров — ка имела место ). Дополнительную информацию см . в книге Руковод — ство по настройке производительности . sort_merge Включает и отключает использование соединений типа “ сортировка — слияние ” во время сеанса . Дополнительную информацию см . в книге Руководство по настройке производительности . sort_resources Формирует описание плана сортировки для команды create index . Эти результаты используются для определения того , как будет выполнять — ся сортировка – последовательно или параллельно . Если установлен параметр sort_resouces on , сервер Adaptive Server выводит план сорти — ровки , но не выполняет оператор create index . Дополнительную инфор — мацию см . в главе 24, “ Параллельная обработка запросов ”, книги Руководство по настройке производительности . statistics io Выводит следующую статистическую информацию для всех таблиц , указанных в операторе : • число обращений к таблице ( число сканирований ); • количество логических чтений ( обращений к страницам в памяти ); • количество физических чтений ( обращений к устройству хранения базы данных ). Для каждой команды параметр statistics io отображает количество буферов , в которые была произведена запись . Если в сервере Adaptive Server были настроены лимиты ресурсов , параметр statistics io также отображает суммарные затраты на операции ввода — вывода . Дополнительную информацию см . в главе 35, “ Использование команд set statistics”, книги Руководство по настройке производительности . statistics subquerycache Отображает количество удачных и неудачных обращений к кэшу и количество строк в кэше подзапроса для каждого подзапроса .

ГЛАВА 7 Команды statistics time Отображает время , затраченное сервером Adaptive Server на анализ и компиляцию каждой команды , а также время выполнения каждого шага команды statistics time . Время приводится в миллисекундах и вре — менных импульсах ( точное значение которых зависит от компьютера ). statistics simulate Указывает , что для оптимизации запроса оптимизатор должен исполь — зовать статистику , полученную по результатам моделирования . strict_dtm_enforcement Определяет , распространяет ли сервер транзакции на серверы , кото — рые не поддерживают службы координации транзакций Adaptive Server. Значение по умолчанию наследуется от значения параметра конфигурации strict dtm enforcement . string_rtruncation Определяет , инициирует ли Adaptive Server исключение SQLSTATE, когда команда insert или update усекает строки типа char , unichar , varchar или univarchar . Если усекаются только пробелы , исключение не инициируется . Если параметр установлен в значение по умолчанию ( off ), исключение SQLSTATE не инициируется и символьная строка усекается без выдачи сообщения . table count Задает количество таблиц , которые сервер Adaptive Server обрабаты — вает за один раз при оптимизации соединения . Значение , используемое по умолчанию , зависит от количества таблиц в соединении следую — щим образом :

Количество Количество таблиц ,
таблиц , обрабатываемых за один раз
участвующих в
соединении
2 – 25 4
26 – 37 3
38 – 50 2

Допустимые значения : 0 – 8. Значение 0 задает поведение по умолча — нию . Значения выше 8 по умолчанию заменяются на 8. Установка параметра table count может улучшить оптимизацию некоторых запросов с соединениями , но увеличивает время компиляции .

set textsize Указывает максимальный размер в байтах для данных типа text и image , которые возвращаются командой select . Текущее значение хранится в глобальной переменной @@ textsize . Чтобы вернуть параметру textsize значение по умолчанию (32 КБ ), введите : set textsize 0 Значение по умолчанию в утилите isql равно 32 КБ . Некоторые клиент — ские программы устанавливают другие значения по умолчанию . transaction isolation level Задает уровень изоляции транзакций для сеанса . Все транзакции , вы — полняющиеся в момент установки этого параметра , а также запущен — ные после этой установки , будут использовать этот уровень изоляции . read uncommitted | 0 Если установлен уровень изоляции 0, никакие блокировки не приме — няются . Следовательно , в этом случае набор результатов , по которому происходит сканирование , может измениться во время сканирования . Если позиция сканирования потеряна из — за изменений в базовой таб — лице , для повторного запуска сканирования необходим уникальный индекс . При отсутствии уникального индекса сканирование может быть прекращено . По умолчанию для сканирования ( при уровне изоляции 0) таблицы , которая не хранится в базе данных только для чтения , необходим уникальный индекс . Можно обойти это требование , заставив Adaptive Server выбрать неуникальный индекс или сканировать саму таблицу , например следующим образом : select * from имя _ таблицы (index имя _ таблицы ) Если во время сканирования с базовой таблицей выполняются какие — либо операции , оно может быть аварийно завершено . read committed | 1 По умолчанию уровнем изоляции транзакций в Adaptive Server яв — ляется read committed , или 1 , допускающий разделяемые блокировки чтения . repeatable read | 2 предотвращает невоспроизводимые чтения .

ГЛАВА 7 Команды serializable | 3 Задает уровень изоляции 3. Сервер Adaptive Server применяет настрой — ку holdlock во всех операциях select и readtext в транзакции . При этом блокировки чтения для запросов удерживаются до завершения тран — закции . Если также установлен связанный режим транзакций , этот уровень изоляции также будет использоваться для любого оператора , выполняющего выборку или изменение данных , который неявно начинает транзакцию . transactional_rpc

Задает способ обработки вызовов удаленных процедур . Если этот
параметр установлен в on , то если транзакция отложена , вызов уда —
ленной процедуры координируется самим Adaptive Server. Если этот
параметр установлен в off , вызов удаленной процедуры обрабаты —
вается межузловым обработчиком Adaptive Server. Значение по
умолчанию наследуется от параметра конфигурации enable xact
coordination .
Примеры Пример 1. Для всех запросов возвращает описание плана обработки ,
но не выполняет его :
set showplan, noexec on
go
select * from publishers
go
Пример 2. Задает ограничение в 100 байтов на размер данных типа text и
image , возвращаемых командой select :
set textsize 100
Пример 3. Для всех команд insert , update , delete и select Adaptive Server
прекращает обработку запроса после обработки первых четырех строк .
Например :

select title_id, price from titles

title_id price
——— ———-
BU1032 19.99
BU1111 11.95
BU2075 2.99
BU7832 19.99

(4 rows affected) set rowcount 4

set Пример 4. Активирует преобразование набора символов ( при этом будет использоваться преобразование по умолчанию , основанное на наборе символов , используемом клиентом ). Если символы не могут быть преобразованы в набор символов клиента , Adaptive Server уведомит об этом клиента или приложение : set char_convert on with error Пример 5. Пользователь , выполняющий эту команду , теперь работает на сервере под именем “mary” и идентификатором этого пользователя : set proxy «mary» Пример 6. Альтернативный способ записи примера 5: set session authorization «mary» Пример 7. Возвращает пять строк для каждого последующего оператора fetch с курсором test_cursor , выполняемого клиентом : set cursor rows 5 for test_cursor Пример 8. Вставляет значение 100 в столбец IDENTITY таблицы stores_south , а затем запрещает дальнейшие явные вставки в этот стол — бец . Обратите внимание на использование ключевого слова syb_identity ; Adaptive Server заменяет это ключевое слово именем столбца IDENTITY: set identity_insert stores_south on go insert stores_south (syb_identity) values (100) go set identity_insert stores_south off go Пример 9. Удерживает блокировки чтения для каждого оператора select в транзакции на протяжении этой транзакции : set transaction isolation level 3 Пример 10. Отключает роль системного администратора для пользователя в текущем сеансе : set role «sa_role» off Пример 11. Указывает Adaptive Server выдавать предупреждающие сообщения при использовании расширения Transact-SQL: set fipsflagger on В этом случае при использовании нестандартного SQL, например : use pubs2 go

ГЛАВА 7 Команды Adaptive Server выдаст сообщение : SQL statement on line number 1 contains Non-ANSI text. The error is caused due to the use of use database. Пример 12. Указывает Adaptive Server обрабатывать операнды со значе — нием NULL в операциях сравнения (= и !=) и в агрегатных функциях согласно начальному уровню стандарта SQL92: set ansinull on Если set ansinull установлен в on , агрегатные функции и строки с агреги — рованными значениями инициируют следующее предупреждение SQLSTATE, если в одном или нескольких столбцах или строках нахо — дятся значения NULL: Warning — null value eliminated in set function Если в сравнении на равенство или на неравенство операнд равен NULL, результатом сравнения будет UNKNOWN. Например , следующий запрос не возвращает ни одной строки в режиме ansinull : select * from titles where price = null Если же этот параметр установлен в off , этот запрос возвращает строки , в которых столбец price равен NULL. Пример 13. Указывает серверу Adaptive Server инициировать исключение при усечении строки типа char , unichar или nchar : set string_rtruncation on Если оператор insert или update должен выполнить усечение строки , Adaptive Server выдаст : string data, right truncation Пример 14. Указывает Adaptive Server воспринимать любую сим — вольную строку , заключенную в двойные кавычки , как идентифи — катор . Если параметр quoted_identifier установлен в on , то имя таблицы “!*&strange_table” и имя столбца “emp’s_name” являются допустимыми именами идентификаторов : set quoted_identifier on go create table «!*&strange_table» («emp’s_name» char(10), age int) go set quoted_identifier off go

Пример 15. Указывает , что исходящие RPC- вызовы по умолчанию обрабатываются службами Component Integration Services: set cis_rpc_handling on Пример 16. Указывает , что когда транзакция ожидает обработки , вызовы RPC обрабатываются методами доступа служб Component Integration Services, а не межузловым обработчиком Adaptive Server: set transactional_rpc on Пример 17. Активирует роль doctor_role. Эта команда активирует указанную роль : set role doctor_role on Пример 18. Активирует роль doctor_role, когда пользователь вводит пароль : set role doctor_role with passwd «physician» on Пример 19. Отключает роль doctor_role: set role doctor_role off Пример 20. Задает для параллельных сканирований индексов и несекционированных максимальную степень параллелизма , равную 4: set scan_parallel_degree 4 Пример 21. Последующие команды в сеансе или хранимой процедуре будут ждать пять секунд для получения блокировки , а затем завершатся с сообщением об ошибке : set lock wait 5 Пример 22. Последующие команды в сеансе или хранимой процедуре выдадут сообщение об ошибке , если не смогут сразу получить необходимые блокировки : set lock nowait Пример 23. Последующие команды в сеансе или хранимой процедуре могут ждать получения блокировок сколь угодно долго : set lock wait Пример 24. Эта команда указывает , что все следующие команды в сеансе запускаются с уровнем изоляции транзакций “repeatable reads”: set transaction isolation level 2 Пример 25. Активирует запись абстрактных планов в группу dev_plans :

ГЛАВА 7 Команды set plan dump dev_plans on Пример 26. Активирует загрузку абстрактных планов из группы dev_plans для запросов в текущем сеансе : set plan load dev_plans on Пример 27. Назначает этому пользователю : • имя клиента alison; • имя узла money1; • имя приложения webserver2. set clientname ‘alison’ set clienthostname ‘money1’ set clientapplname ‘webserver2’

Использование • Некоторые параметры set можно группировать следующим образом :

• Параметры parseonly , noexec , prefetch , showplan , rowcount и nocount управляют способом выполнения запроса . Не имеет смысла одновременно устанавливать параметры parseonly on и noexec on . Параметр rowcount по умолчанию равен 0 ( возвра — щаются все строки ), а другие параметры – off . • Параметры statistics выводят статистику производительности после каждого запроса . Значение по умолчанию для парамет — ров statistics – off . Дополнительную информацию о параметрах noexec , prefetch , showplan и statistics см . в книге Руководство по настройке производительности . • В инструкции set можно указать до 1024 столбцов для обновле — ния , используя для указания новых значений литералы , пере — менные или выражения , возвращенные подзапросом . • Для интерпретации результатов , возвращенных Adaptive Server, в библиотеке DB-Library используются параметры offsets и procid . По умолчанию эти параметры равны on . • Параметры datefirst , dateformat и language влияют на функции дат , порядок частей даты и отображение сообщений . Если эти пара — метры устанавливаются внутри триггера или хранимой проце — дуры , им не возвращаются предыдущие значения после завер — шения триггера или процедуры . Если используется язык по умолчанию (us_English), то параметр datefirst равен 1 ( воскресенье ), dateformat – mdy , а сообщения отображаются на английском . Для одних языков ( включая us_english) по умолчанию воскресенье =1, понедельник =2 и т . д ., а для других – понедельник =1, вторник =2 и т . д .

set Если была выполнена команда set language , то первый день неде — ли и формат даты будут взяты из языка , указанного в этой коман — де , если эти параметры не были установлены ранее в текущем сеансе командами set datefirst или set dateformat . • Параметры cursor rows и close on endtran определяют , как будет происходить обработка курсоров . По умолчанию параметр cursor rows равен 1 для любого курсора , а параметр close on endtran – off . • Параметры chained и transaction isolation level позволяют Adaptive Server обрабатывать транзакции в соответствии со стандартами SQL. Параметры fipsflagger , string_rtruncation , ansinull , ansi_permissions , arithabort и arithignore определяют различные аспекты обработки ошибок сервером Adaptive Server, а также совместимости со стандартами SQL. Примечание . Параметры arithabort и arithignore были переопределены для версии 10.0 и более поздних . Если эти параметры используются в приложениях , следует убедиться , что они по — прежнему обеспечивают желаемый результат . • Параметры cis_rpc_handling и transactional_rpc можно использовать , только когда службы Component Integration Services включены . • Если параметр quoted_identifier установлен в on , идентификатор не нужно заключать в двойные кавычки , если в синтаксисе оператора требуется , чтобы строка в кавычках содержала идентификатор . Например : set quoted_identifier on create table «1one» (c1 int) Однако для функции object_id требуется указать строку , поэтому в ней имя таблицы необходимо заключить в одинарные кавычки : select object_id(‘1one’) ———————— 896003192 Чтобы включить в имя идентификатора , заключенное в кавычки , двойную кавычку , нужно указать две двойные кавычки подряд : create table «embedded»»quote» (c1 int) Впрочем , нет необходимости указывать две двойные кавычки под — ряд , если синтаксис оператора требует , чтобы имя объекта было строкой : select object_id(’embedded»quote’)

ГЛАВА 7 Команды • Параметры parallel_degree и scan_parallel_degree ограничивают степень параллелизма для запросов , если Adaptive Server скон — фигурирован для параллельного выполнения . Эти параметры подсказывают оптимизатору , что нужно ограничить количество параллельных запросов и использовать меньше рабочих процессов , чем разрешено параметрами конфигурации . Установка этих пара — метров в 0 восстанавливает значения , заданные на уровне сервера . Если указанное значение превышает значение соответствующего параметра конфигурации , СУБД Adaptive Server выдает предуп — реждение и использует значение , заданное параметром кон — фигурации . • Большинство параметров , установленных командой set внутри триг — гера или хранимой процедуры , возвращаются к своим прежним значениям после выполнения триггера или процедуры . Следующим параметрам не возвращаются их прежние значения после выполнения процедуры или триггера . Вместо этого заданные значения сохраняются в течение всего сеанса Adaptive Server или до их явного изменения : • datefirst • dateformat • identity_insert • language • quoted_identifier • Если в команде set указано несколько параметров и какой — то параметр указан с синтаксической ошибкой , то все параметры , идущие после ошибки , игнорируются . Тем не менее , параметрам , указанным до ошибки , присваиваются новые значения . • Назначения пользователю имени клиента , узла или приложения , действуют только в текущем сеансе . При следующем соединении пользователя с сервером эти назначения придется сделать заново . Хотя новые имена отображаются в таблице sysprocesses , они не используются для проверки полномочий , а в системной процедуре sp_who по — прежнему отображается соединение клиента с исходным регистрационным именем . Дополнительную информацию о на — стройке пользовательских процессов см . в книге Руководство по системному администрированию .

set • Все параметры , устанавливаемые командой set ( кроме showplan и char_convert ), вступают в силу немедленно . Параметр showplan всту — пает в силу в следующем пакете . Ниже даны два примера исполь — зования параметра set showplan on : set showplan on select * from publishers go

pub_id pub_name city state
——- ——————— ————
0736 New Age Books Boston MA
0877 Binnet & Hardley Washington DC
1389 Algodata Infosystems Berkeley CA
(3 rows affected)

Но : set showplan on go select * from publishers go QUERY PLAN FOR STATEMENT 1 (at line 1). STEP 1 The type of query is SELECT FROM TABLE publishers Nested iteration Table Scan Ascending Scan. Positioning at start of table.

pub_id pub_name city state
—— ——————— ———- —-
0736 New Age Books Boston MA
0877 Binnet & Hardley Washington DC
1389 Algodata Infosystems Berkeley CA

(3 rows affected) Роли и команда set • Когда пользователь соединяется с Adaptive Server, все предоставлен — ные ему системные роли активируются автоматически . Однако роли , определенные пользователем , которые были ему предоставлены , не активируются автоматически . Чтобы автоматически активировать определенные пользователем роли , выполните системную процеду —

ГЛАВА 7 Команды ру sp_modifylogin . Подробности см . в описании процедуры “sp_modifylogin”на стр. 1138 . Для включения и отключения ролей используются команды set role имя_роли on или set role имя_роли off . Например , пользователь с ролью системного администратора может действовать от имени владельца текущей базы данных ( и исполь — зовать его идентификатор ). Чтобы вернуть настоящий идентифи — катор пользователя , выполните следующую команду : set role «sa_role» off Если пользователь не зарегистрирован в текущей базе данных и в этой базе данных нет роли пользователя — гостя , он не может устанав — ливать параметр sa_role off . • Чтобы активировать пользовательскую роль , для которой назначен пароль , необходимо указать этот пароль . Таким образом , в этом случае нужно использовать следующий пароль : set role » имя _ роли » with passwd » пароль » on Распределенные транзакции, службы CIS и команда set • Поведение свойства конфигурации cis rpc handling и команд set transactional_rpc изменилось с появлением ASTC. Если в версиях ранее 12.0 активировать параметр cis rpc handling , то все вызовы уда — ленных процедур направляются через библиотеку ClientLibrary из состава CIS. Таким образом , в этом случае установка параметра transactional_rpc не имела значения : система всегда вела себя так , как если бы этот параметр был установлен в on . Начиная с версии 12.0, это поведение изменилось . Если параметр cis rpc handling установлен в on, а параметр transactional_rpc – в off , вызовы удаленных процедур в транзакции направляются через межузловой обработчик . Вызовы удаленных процедур (RPC), выполненные вне транзакции , направ — ляются через библиотеку Client-Library из состава служб CIS. • Если службы СУБД Adaptive Server по управлению распределенны — ми транзакциями включены , то можно помещать вызовы удаленных процедур (RPC) внутри транзакций . Такие вызовы удаленных проце — дур называют транзакционными . Работу транзакционного вызова удаленных процедур можно включить в контекст текущей транзак — ции . Действия , выполненные этой удаленной процедурой , можно зафиксировать или откатить вместе с действиями , совершенными локальной транзакцией . Для использования транзакционных вызовов удаленных процедур нужно включить службы CIS и управление распределенными транзакциями с помощью системной процедуры sp_configure ,

set а затем выполнить команду set transactional_rpc . Если параметр set transactional_rpc установлен в on и транзакция не завершена , вызов удаленной процедуры координируется сервером Adaptive Server ( а не межузловым обработчиком ). По умолчанию параметр transactional_rpc равен off . Команда set cis_rpc_handling переопределяет команду set transactional_rpc . Если установить параметр cis_rpc_handling в on , все внешние вызовы удаленных процедур будут обрабатываться службами CIS. • Дополнительную информацию об использовании команд set transactional_rpc , set cis_rpc_handling и системной процедуры sp_configure см . в книге Component Integration Services User’s Guide . Использование команд set proxy и set session authorization Примечание . Ни роль “sa_role”, ни роль “sso_role” не позволяют выпол — нить команду set proxy login_name , если на это нет явных полномочий . Чтобы пользователь ( в том числе администратор безопасности ) мог выполнять команду set proxy login_name , ему должны быть явно предо — ставлены соответствующие полномочия администратором безопасности . • Прежде чем можно будет выполнять команду set proxy или set session authorization , администратор безопасности должен предоставить соответствующие полномочия из базы данных master . • Чтобы восстановить прежнее имя пользователя в базе данных , нужно указать в команде set proxy или set session authorization исходное регистрационное _ имя . • Команду set proxy или set session authorization нельзя выполнять в транзакции . • Adaptive Server допускает только один уровень изменения имен пользователей . Поэтому после того , как имя пользователя было изменено с помощью команды set proxy или set session authorization , нужно вернуться к исходному имени пользователя перед тем , как изменить его снова . Предположим , пользователь имеет регистра — ционное имя ralph. Чтобы создать таблицу от имени mary, представ — ление от имени joe, а затем вернуться к исходному имени пользо — вателя , нужно выполнить следующие команды : set proxy «mary» create table mary_sales (stor_id char(4), ord_num varchar(20),

ГЛАВА 7 Команды date datetime) grant select on mary_sales to public set proxy «ralph» set proxy «joe» create view joes_view (publisher, city, state) as select stor_id, ord_num, date from mary_sales set proxy «ralph» Использование команды lock wait • По умолчанию задача Adaptive Server, которая не может немедленно установить блокировку , ожидает снятия блокировок несовместимого типа , а затем продолжает обработку . К таким же результатам при — ведет выполнение команды set lock wait , в которой не указано значе — ние параметра количество _ секунд . • Чтобы установить период ожидания блокировки на уровне сервера , нужно выполнить системную процедуру sp_configure с параметром lock wait period . • Параметр • lock wait period , а также время ожидания блокировки , установленное на уровне сеанса командой set lock wait nnn , применимо только к пользовательским таблицам . Эти параметры не влияют на системные таблицы . • Период ожидания блокировки , определенный на уровне сеанса или в хранимой процедуре командой set lock , переопределяет время ожи — дания блокировки , установленное на уровне сервера . • Если в команде set lock wait не указано количество _ секунд , все после — дующие команды в текущем сеансе будут ждать сколь угодно долго для получения необходимых блокировок . • Системная процедура sp_sysmon выводит количество случаев , в которых задачи не смогли установить нужную блокировку до истечения периода ожидания . Уровень изоляции транзакций Repeatable-reads • При уровне изоляции транзакций repeatable-reads ( также называемом вторым уровнем изоляции транзакций ), все страницы , читаемые командой , блокируются до завершения транзакции . • Невоспроизводимым чтением называется ситуация , когда одна транзакция считывает строки из таблицы , а другая меняет те же строки и фиксирует изменения до завершения первой транзакции .

set Если первая транзакция повторно считает строки , они будут други — ми , поэтому первоначальное чтение нельзя воспроизвести . На этом уровне изоляции во время транзакции удерживаются разделяемые блокировки , не позволяющие другим транзакциям обновлять заблокированные строки или строки на заблокированных страницах . Использование статистики, полученной по результатам моделирования • Статистику , полученную по результатам моделирования , можно загрузить в базу данных с помощью режима simulate утилиты optdiag . Если выполнить в сеансе команду set statistics simulate on , то запросы будут оптимизироваться по смоделированной , а не по фактической статистике для таблицы .

Глобальные переменные, на которые влияет команда set
• В таблице 7-34 перечислены глобальные переменные , содержащие
сведения о параметрах сеанса , устанавливаемых командой set .
Таблица 7-34. Глобальные переменные , содержащие параметры
сеанса
Глобальная Описание
переменная
@@ char_convert Содержит 0, если преобразование набора символов не включено . Содержит 1,
если преобразование набора символов включено .
@@ isolation Содержит текущий уровень изоляции , используемый программой Transact-SQL.
@@isolation принимает значение активного уровня (0, 1 или 3).
@@ options Содержит шестнадцатеричное представление параметров , установленных
командой set для сеанса .
@@ parallel_degree Содержит текущую установку максимальной степени параллелизма .
@@ rowcount Содержит количество строк , обработанных последним запросом . Для команды ,
которая не возвращает строк ( например , if, update или delete ), переменная
@@ rowcount равна 0. Для курсора глобальная переменная @@ rowcount равна
суммарному количеству строк , возвращенных клиенту из набора результатов
курсора ( вплоть до последней команды fetch ).
Переменная @@ rowcount обновляется , даже если параметр nocount установлен
в on.
@@ scan_parallel_degree Содержит текущую настройку максимальной степени параллелизма для
сканирований некластерных индексов .
@@ textsize Максимальное количество байтов для данных типа text или image , возвращае —
мых командой select . Значение по умолчанию для isql равно 32 КБ , а в общем
случае оно зависит от клиентской программы . Его можно изменить для сеанса
с помощью команды set textsize .
@@ tranchained Содержит текущий режим транзакций , используемый программой
Transact-SQL. Переменная @@ tranchained равна 0 для несвязанного режима и 1
– для связанного .

ГЛАВА 7 Команды Использование параметра fipsflagger с языком Java в базе данных • Если параметр fipsflagger установлен в on, Adaptive Server выдает предупреждение , если используется одно из следующих расши — рений :

утилита installjava ;
команда remove java ;
• объявления столбцов и переменных , которые ссылаются на Java-
классы как на типы данных ;
• операторы , ссылающиеся на членов с помощью выражений
Java-SQL.
• Состояние параметра fipsflagger не влияет на арифметические
выражения , выполняемые Java- методами .
• Дополнительную информацию об использовании языка Java в базе
данных см . в книге Java in Adaptive Server Enterprise .
Стандарты Уровень соответствия стандарту SQL92 : расширение Transact-SQL.
В ранних версиях Adaptive Server поведение Transact-SQL отличается от

предусмотренного стандартом SQL92. Для всех приложений предкомпи — лятора со встроенным SQL по умолчанию включено поведение , совмес — тимое со стандартом SQL. Чтобы обеспечить соответствие этому стан — дарту для других приложений , можно использовать команду set для установки параметров , перечисленных в таблице 7-35 . Таблица 7-35. Значения параметров set, обеспечивающие совместимость с базовым уровнем стандарта SQL92

Параметр Значение
ansi_permissions on
ansinull on
arithabort off
arithabort numeric_truncation on
arithignore off
chained on
close on endtran on
fipsflagger on
quoted_identifier on
string_rtruncation on
transaction isolation level 3

set

Полномочия Как правило , команды set по умолчанию могут выполнять все пользова —
тели – для их использования не нужно особых полномочий . К исключе —
ниям относятся команды set role , set proxy и set session authorization .
Пользователь может выполнять команду set role только с ролями , предо —
ставленными ему системным администратором или администратором
безопасности . Если пользователь вошел в базу данных только потому , что
он имеет определенную роль , он не может отключить эту роль во время
работы этой базы данных . Например , если пользователь не прошел
обычную авторизацию для использования базы данных info_plan , но рабо —
тает с ней как системный администратор , то Adaptive Server выдаст сооб —
щение об ошибке при попытке установки параметра sa_role в off в базе
данных info_plan .
Чтобы пользователь мог выполнять команду set proxy или set session
authorization , администратор безопасности должен предоставить ему
соответствующие полномочия .
См. также Команды create trigger , fetch , insert , grant , lock table , revoke
Функции convert
Утилиты isql , optdiag

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *