Разделы
Публикации
Популярные
Новые
Главная » Оптимизация производительности transact

1 ... 31 32 33 34 35 36 37 ... 55

Рекурсия

SC i?tyi;ebtr-=ceci!nc! CAbUJyMAXJ r<LC;biLN AS /сГС1;сг ,2; . С IF TpLFRGPERTYCbigc.precisior; IS vOI iUl CXLC sp clroptype higd

tXFC SD adGtyDe b1gd.Ptypest -- Досаз:;>.01< г.спьзовате'-ьский run, соответствующий зчачемию переиенчсй t-()MAX ?R£CISiC!i vaa3ie

CREATE PROC dDc.5p calcfacLona; Obasenunber bgs. ?-ac*,crial cigd OUT AS

SET NOCOUN on

DECLARF (sprevious numper b:gc

IF ((?пазе г,ипсег>2б; and ;&@KA. PRECIS;0N-38;; OR (isbabe parrber-32) EEGIX RAISERROR (Computing this factorial would eceed the servers max. numeric precision of %a or

the max, procedure nesting level of 32.15,10,S!,aMAX PREC!SICN) return;-1)

IF ((3base numDer<0) BEGIN

RAISERRORCCan t calculate negative actorials, 16,10)

return;

IF ;3base n mDen<2) SET Cofactonial-l - Фа.чюриил 0 итп 1-; ELSE BEGIN

SEI @pre/ious number=ObaiG nuinbe 1

EXEC sp calcfactori3l P-previous rumjer. Ofactcria! Ои Рекурсивный вызов

IF ;c<ifactona>-l) RETURN;-1) -- Произои;1а ошибка, возвращаемся

SET ?factcrial ?factonal@base number

IF ;@@£RRCR<>0) RLTURN(-l) -- Ороизолта Ок1й0ка. возвращаемся

return;0) GO

DECLARE factorial bgd

EXEC sp calcfactcrial 26. catactcnal OUi

SELECI factcrial

lype acdec.

Cannot add rows to sysdepenos for tr,e crren. storeo oroceoure tecause it depenos on the missing ODject sp calcfactoria!. Tne stcrec procedure will still be created.

4C3291461126605635584000000

Сначала эта процедура создает числобо11 пользоватсльскн!! тип данных с размерностью, paiHioii значению автоматической nepe.MCHHoii (§)(§)MAX PRECISION, Это позволяет процедуре задействовать самые большие числа, которые сервер .может обработать, Зате.м оиа проверяет допустимость переданного числа, для которого необходи.мо вычислить факториал. После этого она рекурсивно вызывает са.ма себя для подсчета результата. Как вы можете видеть, с применением .максимально!! раз.мерностн, равной 28, SQL Server \южет обрабатывать числа свыше 400 септиллионов (чисто с 24 нуляхнг).



Автоматически запускаемые процедуры

Авто.магическн .запускаемые процеду])ы имеют .чиюжество практических при-Menennii. Вы .можете при.мепить их для запуска процессов при старте сервера, а также для выполнения других административных задач. Вы хюжете задейстпо-ват1) и.\ для загрузки часто исполы)\е.мых процедур в н1)онедурньп 1 кзш при каждом старте сервера. Для того чтобы по.метить хранн.мую процедуру как автоматически запускаемую, используется храни.мая процедура sp procoption, вот так: EXEC sp Drocoption sp daiabases.starTjp.true

Неско.чько замечаний относительно авго.матнчески запускае.мых процедур: О они должны находиться в базе данных master: О нх владельцем должен быть член группы sysadmin; О они не .могут принимать параметры; О они не могут возвращать результирующее множество;

О можно запустить SQL Server с флаго.чг трассировки 4022 (-Т4022), чтобы автоматически запускаемые процедуры не запускались.

Шифрование

Вы можете зашифровать исходный код (который хранится в таблице syscomments) хранимой процедуры, представления или триггера, указав п])1! созданнп объекта опцию WITH ENCRYPTION. Это препятствует п1)осмотру исходного кода с помощью таких инструментов, как Enterprise Manager, н не дает работать отладч1нса.м хранимых процедур (например, включснно.му в Visual Studio Enterprise Edition). У зашифрованных объектов установлен третш'! бит в столбце texttype в таблице syscomments. Учтите, что как только вы запшфровали объект, вы не сможете рас-ишфровать его стандартны.м способом. Его никто не сможет прое\н)треть - ни вы, ни члены группы sysadmin. пп кто-нибудь другой.

Триггеры

Триггер - это специальный тин хранимой процедуры, который запускается, когда выполняется некоторая DML-оиерация (INSERT, DELETE или UPDATE или любая нх комбинация). ] риггеры создаются с помощью ко.маиды CREATE TRIGGER и присоединяются к таблицам. Если удаляется таблица триггера, уда.тяется и сам триггер.

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



Триггеры

этого в рабочем коде. Обратиге вии.мание. что SQL Servei не разрешаеч' триггерам возвращать коды завершения.

Тр1итеры выполняются для каждого оне[)атора, а не для каждой записи, независи.мо от того, сколько записеГ] было изменено данным DML-onepaTopoNK Для ОДНО!! таблнпы вы можете оп])еделить сколько угодно триггеров (не больн!е 2 хи1ллиа])Д0в для базы данных) - триггеры. С1!язанные с некоторы.м DML-one-ратором, будут запускаться последовательно без какого-либо порядка.

Ограничения DRI (declarative referential integrity, лекларатнвнгш ссылочн;ш целостность) имеют приоритет над триггера.\п1. Это означает, что, если некото-poii DML-ко.мандой будет нарушено ОКЬофаничение, триггер ие будет запущен. Внутри триггера вы .%гожете проверять, какие столбцы были из.менены оиераци-ей, с помощью функций UPDATE() и COLUMNS UPDATE(). Функция UPDATE() возвращает true или false в зависи.мости от того, было ли установлено значение указанного столбца (не важно, было ли оно на сахюм деле изменено). COLUMNS UPDATEDO возвращает бугговую маску, определяющую, значения каких столбцов были установлены.

Триггеры могут запускать другие триггеры, если вложенные триггеры были разреп1ены с помощью sp configure (опция nested triggers). Триггеры могут запускать сами себя рекурсивно, если в базе данных разреншно использование рекурсивных триггеров (опция recursive triggers). Авто.матпческая пере.менная @@NESTLEVEL возвращает 1 нз триггеров первого уровня, 2 - из любого, который был запущен из него, и так да1ее.

Если пользовательская тран.закция не открыта, триггер и DML-операция, запустившая его, рассматриваются в одно11 транзакции. Когда триггер генерирует фататьную ошибку или выполняет ROLLBACK TRANSACTION, текущая актшитая транзакция откатывается, а текущий пакет команд прерывается.

SQL Server предоставляет специальные логические таблицы для нспользо-вапия в триггерах: inserted и deleted. Для onepaiuni INSERT в таблице inserted находятся записи, которые будут добавлены в таблицу. Для операций! DELETE в таблице deleted находятся записи, которые будут ула'!е!1ь! из таблиц!я. В случае операций UPDATE в таблице deleted будут находиться старые версии обновляемых за!И1сей, а в таблице inserted - новые. Вы можете запрашивать эт!1 таб-лиц!>!, чтобы разрешать или запрещать модификацию базы да!нтых, основываясь иа столбцах или данных, которые операции пыта!Отся ,модифиц1!ровать. Откат текущей тра!1закции - это нормальный способ прерыва!1ия триггера, так как Transact-SQL SQL Server ие поддерживает команду ROLLBACK TRIGGER (а la Sybase). Обратите внимание, что вы не можете модифицировать эти логическ!1е таблицы - они предназначены только для просмотра.

Нежурнатируемые операции (о!!ера!1ии, которые не заносят в журнат транзакций информацию об изменении каждой записи) не запускают триггеры. Так что даже при том, что TRUNCATE TABLE удатяет все записи в таблице, эти удаления за!И1сей ие регистрируются индивидуально, и 1!оэгому трип-еры, которые определены для таблицы, не запускаются. Вы можете отключить триггеры с !io-мощью ко.манды ALTER TABLE...DISABLE TRIGGER. Отключенные триггеры мож!10 снова вкл!0чить с по.мощь!0 ALTER TABLE...ENABLE TRIGGER. Вот несколько примеров:



А' ilR TAcL- bd ;еь

UISAbI.F HIGGlR SalesOly lNStK uPjAir ALTER TABLE Sdles

ENABLE TRIGGER SaiesQty !NSERT uPDATr

ALTER TABL sa-es DISABLE TRIGGER ALL

ALTER TABLE sales ENABLE TRIGGER ALL

Триггеры запускаются сразу после того, как отрабс)т;ы DML-onepaiop, по до того, как нз.%генепия внесены в базу данных. План выполиення DML-оператора расширяется непосредственно перед завершешшм за счет вк;почения в него всех сработавших триггеров. Если триггер позволяет операцпп продолжиться и нет открытой пользовательской транзакции, все из.менеиия, сделанные DML-one-paTopo.Nf, фиксируются в базе да1И1ых. Вот несколько ири.меров нспо.шзовання триггеров:

SET NOCOUNT ON

USE pubs

DROP TRIGGER Sale5Qty INSERT UP0ATE GO

CREATE TRIGGER SalesQty INSERT UPDATE ON sales FOR INSERT, UPDATE AS

IF OgROwCOUNT-O RETURN -- Ни одна запись не затронута, сразу выходим

IF {UPDATE(qty)) AND (SELECT MIN(qty) FROM ir,serled)<10 BEGIN RAISERRORCMinimum order is 10 units,16,10) ROLLBACK TRAN RETURN

END GO

-- Тост oneoaropa INSERT с одной записью BEGIN TRAN

INSERT sales VALUES (6380,0RD9997,GETDATEO,5.Net 60.BU1032) IF !a(aTRANCOUNT>0 ROLLBACK TRA.N GO

-- Тест оператора INSERT с несколькими записями BEGIN TRAN INSERT sales

SELECT stor id, ord num+A. ord date, 5, payte-ms, title id FROM sales IF (a@TRANCOUNT>0 ROLLBACK TRAN GO

DROP TRIGGER Sales DELETE GO

CREATE TRIGGER Sales DELETE ON sales FOR DELETE AS

IF @(aRGWCOUNT=0 RETURN - Ни одна запись не затронута, сразу выходки

IF ((ac°RO/JCOUNT>l) BEGIN

RAISERROR(Deletions of more than one row at a time are not permitted,16,10) ROLLBACK TRAN RETURN



END GO

BEGIN IRAN

DELETE sales IF (acaTRANCOUN i>0 ROLLBACK IRAN GO

DROP TRIGGER Sa!esord caie q:y d-DAIi GO

CREATE TRIGGER Salesc.-d ca:e qty UPDAlL CN saes FOR INSER . UPDATE AS IF giaROWCOUNT-O RETURN -- Ни одна запись не загэонута, сразу аыходин

- Проверяем. Оыли ли одновременпО исдифиц/ровапэ! 3-й и 4 й столбцы IF (COLUMNS UPDATED() & CP0WER(2.3-1) ; P0WEk;2.4-1));-I2 BEGIN

UPDATE s SET payterms-Cds.r

FROM sales s JOIN inserted i CN ;s.stur TC=i stor-jc AND s.ord num-1 .ord num)

IF ((a@ERROR<>0) -- UPDATE стенерировал ошибку, о-KaraiBaei, транзак'ию

ROLLBA(,K TRANSACTION RETURN END GO

-- Тест оттератора UPDAIE с одной записью BEGIN IRAN

UPDATE sales SET orc GaLe=GFTDA!E(}. qty=15 INHERE stor id=7066 and ord njm-A29/6

SELECT * FROM sales

WHERE stor id=7066 and ora num -A2976 IF (a(aTRANCDUNT>0 ROLLBACK TRAN GO

-- Тест оператора UPDATE с неско;1ькими затисями BEGIN TRAN

UPDATE sales SEI ord date-GETDAiEf). qty-lS WHERE stor id=7G66

SELECT - FROM saies WHERE storja=7066 IF (a(aTRANCOUNT>0 ROLLBACK TRAN

Server: Msg 5000C, Level 16, State 10, Procedure CnecKSaiesQty, I ine 3 Minimum order is 10 units

Server: Msg 50000, Leve 16, State 10, Procecure Ci:eclcSalesQty, Line 3 Minimum order is 10 units

Server: Msg 50000. Level 16. SLate 10, Procedure CtieckSalesCelete, Line 3 Deletions of more than one row at a tirrie a e not permittee

stor id

ord num

ord date

payterms

titie id

7066

A2976

1999-06-13 01

:10:

Cash

PCBBBB

stor ic

ord num

ord date

payterms

title id

7066

A2976

1999-06-13 01

:1C:

243

Cash

PCBBBB

7066

0A7442.3

1999-06-13 o;

:1C:

Cast,

PS2091



Отладка процедур

visual Studio Enterprise Edition, a также различные инстру.менты сторонних производителей позволяют осуществлять отладку хранимых процедур. Это означает, что вы можете пошагово проходить хранимые пронедуры, вызвагтые из проектов Visual Studio - приложений на VB и VC++. Вы можете оп])еделять точки останова, просматривать содержимое переменных, в общем, делать то, для чего предназначены отладчики, - отлажгшать код. Интерфейс, с помощью которого это осуществляется, известен как SQL Server Debug Interface, или SDL Первоначально он был реализован в SQL Server 6.5, а теперь полиостью интегрирован с Visual Studio.

Некоторые основные за.мечання. касаюнщеся трип-еров;

О Убедитесь, что ваши триггеры учитывают во.еможность. что за один раз может быть обработано более одной записи. Триггеры, которые за.мечательио работают с операция.\ги, затрагнвающи.мн слунгственную запись, часто перестают работать, если операция воздействует более че.м на одну запись. Триггеры, предназначенные для обработки единственной записи, - наиболее частая оии1бка новичков.

О Начгигайте каждый триггер с проверки @@ROWCOUNT. Если ни одна запись не изменилась, люжио немедленно выйти из трштера, носко.тьку триггеру в это.м случае нечего делать.

О Используйте функцгги UPDATE() и COLUMNS UPDATED() для ироверки того, что значенугя, которые вы хотите проверять, де11ствптельно нз.менились.

О Никогда не ждите ввода пользователя или других пользовательских действий в триггере.

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

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

О Выводите наглядные сообщен1ш об ошибках. Когда это воз.чюжно, возв1)ащайте пользовательские сообщения, а не непонятные снсте.\пН)1С сообщения об ошибках.

О Делайте свои триггеры модульны.ми, размеииш в храни,%гых процедурах код, который используется в нескольких триггерах пли длинный и сложньн! код.

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

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



Заключение

в это11 главе .мы 11Сслсд(Л!а.11! .множество !iioaiicoB i! особеииостеГ! созда!И1я хра-hhmijIX процедур i! триг!-еров. BijI узиати, как создавать пользовательск1!е п сис-те.м!1ые ироцедурь!, а также как передавать !1ара,метр!Я в со,зданИ!.1е ва.ми !ipone-дурь! II из lutx. Вы познаколпкшсь с некоторыми внз'тренни.ми .мехаииз.ма.м!! процесса выпо;и!ени>! хранимых 1!роцедур, а также узнал!!, как работают тригге-

pls!. Вь! 1!ЗуЧИЛ!! ОТЛДДКу Хра!!1!.\1Ь!Х !1рОЦедур И расСМОТрСЛИ такие тонкости !1Х

со.здан!!Я. как !11ифрова!!ие и переко.мпи.чяц1!Я плана выполнеипя.

Несколько ламечапи!!, касательно от.тадкн Tj-aosaci-SQL с noNKJuibio SD1:

О SD1 реализован с помощью псевлопроцедуры sp sdidebug (слютрите раздел <.1311 \трениие ироцедуры-> ранее в этой главе для более подробно!! ин(})орма-HIUI о псевлонронедура.х ).

О При отладке вы лолж!1Ь! за!1ускать SQL Sei ver, !1С110льзуя !!ользовательскую учетную за!1ИС1). а не LocalSysrem, иначе точк!! останова будут 1!едоступны.

О Есл!! в!я 11р()вол!1те от.талку на Toii же .маш1!не, где уста1!овлен сервер, запус-Kaiire сервер в контексте того же !10льзователя, что и отладчик.

О >белитесь, что !И>1 .можете запускать SQL Server как консольное приложение, а пе как сервис.

о Пол Wiiidows NT сообше!И1я SDI за11!!сываются в ж\-р!1ал событий с источ-1И!ком MSDEVSDI.



Оптимизация

производительности

Transact-SQL

XopoiiiaH раз1)а6о 1ка - это ])a,!iiiiua между колом, который выполняется восемь .минут, и коло.м, выполияющп.мся 1ю-се,\1ь часов. Это воздействует па люде 1 л(л1стБец|н)1м образо.м. Это уже не более cii()i)iibu i вопрос , чем вопрос

о тем. летает ли птица.

Л'. В. Кентоп

Онти.мизация производительности SQL Server вы.ходит за ра.\п<и этой книги. На эту тему можно запросто написать несколько томов, вместо чего в дашгой главе мы сосредоточи.мся на оптн.\и1зацин производительности запросов иа Traa.sact-SQL. Существует очень много вариантов достижения это!! задачи, а инстру.менты для ее решения M017T б15гть довольно сложны, однако есть несколько спецн(1)нчес1<:нх методов, которые вы можете прн.менять для создания оптимального кода на Transact-SQL и улучшения нроизводнтельностн запросов, работающих нелоста-Т0Ч1Ю хорошо.

Основные рекомендации по оптимизации производительности

о Если вы хотите гаранти1)овать, что гипнете оптн.ма.-1Ьный код, лучше всего постоянно увелгннтать уровень мастерства своей ко.манды разработчиков. Хорошие разработчики пишут хороший код. Очень полезно увеличивать навыки разработчиков с по.мощью интенсивных тренировок. Ни у кого из пас нет врожденных знаний о связанном подзапросе Инвестнцнн в люде11 часто приводят к долгосрочнььм выгодам, которые иначе получить тяжело, если вообще возможно.

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



О 1 Шате.пдк) г.олхо.пме к калчЛом;. с:;>с\:> ,::)(,(.1Л'} т салилх малетлпх до грандиозных, - прелнолагал, что онТ1т\ит>.1ция нрои.изолигельности не исправит плохое ирп.чожеиис пли ii,iuxo снроскт'иронаииую базу данньгх, .1уч-lue всего с са,\1оГ() иача.та 1И)И1п,1:;яIl .5ал;г!\ хорошо,

о Онредслт-е треиова.чия к' иро'.пио.игге.г.иисm в ;1И1ч-(Л>ых нагрузках. Общее .заяв.чеши типа <чЛ1(лч,\1а дп.-глхчк! обс(1;еч1П',:пь рг.бот} пятисот по.ть,И)вате-.leiio не очень по,1еЗп0, I3o-iicpiibL\, oy.iyr вс( 11о.1ь,зователп работать одновре.меиио? KaivOBo иико1и;е ко,п1чест1!о no.ib,soBaTe,ieii? Во-вторых, 4T(j они будут-лстатЧ)? Когда булс- ,\1акси,\:а,и>ная haip\3Ka па сервер? Когда не-обхоД11.\!о предска,-!ать нроп.-иголптс-и.ноп-ь реальи(Л-о И1мг-И)жепия. значения TPS-recTOB (iransaclions per,second, ко,-!ичсстио i-paiT3aKUHii в секунду) являются довольно оти(.)сительнь1,\1 п(Лча,!ато,-с,\1, Выяв.и.чше узких мест вашего приложения - это к,-поч к \-cnex\-, Д!)Явол кроется в ,\1елочах,

О 1--1,меГгге в виду, что ннотла военриятие }-нравляег лсйствительностью. Это прежде всего снравед.чиво в (.-1 \-чае штгерактпвпых прнложенпГг Иногда может быть важнее быстро верп\ть управление 11р1Пожеп.то, чем выгюлпять запрос ,макси.ма.-пл10 Э(})фективи(;, ТЬисказка оператора SELECT FAST п позволяет быстро ве])иу-гь управлепие вызвавшему при-ю-кеиню, хотя ее применение лкжет привесги к то.му, что запрос полиостыо будет выполняться дольше, Друго11 вариант - прн.меиепие асипхропгилх ку])соров (см. главу 1,3, Курсо-[)ы>>). По.\пигге. что вы .\1о;кеге пспо,-п.зоват-ь ко.маплу SET LOCK TIMEOUT, чтобы конфигурировать длите.-илюсть ожилання зап1)осо.м освобождения забло-кировап1И)го ресурса. .Это по.ию.тит прнложенто пе вьн\тядеть завнсши.м во вре.мя ожидания какого-ииб\,и> 1)сс>рса. Даже если заи1)(Х' будет в цело.м вы-иолпяться дольше, во.шрат 1\(ШТ])(ь-1Я ио.и^зоваге.по тактгм быстрым способо.м умеиьпигг количество нерезатру-зок к-о.\тыоте]5ов и.!-за нетерпеливости поль-зовате.ш. Э-И пе1)езаг[)узки ca.%ni .\ior\-r повлиять иа прсльзводигелыюсгь, особенно если SQL Server и пр1г-1ож(Чще гктходятся на олпо.м ко.\и1ьютере. Таки.м образом восцри>гтие исиосредствеипо влияет на де11с-т1!Нгельность.

о Из.меря11те производите.тьпость часто и тщательно в процессе разработки. Тестированне производительности прнло-лачтя - это не отдельньп ! процесс, которьй! \южио осуществить после окошкишя процесса разработки. Ои должен быть непрерывным, текущи.м, hoctojhhio сопровождать процесс разработки. Ко.\и10ненты приложения до.тжиы моде.иц)оваться, иснытываться и оцениваться на протяжспии вс(.мо процесса разработки. Лучше сразу узнать, что ироизводнтельиость будет iien[)ne.m.Te.Moii лля по,тьзова-геля, че.м выяс-пигь э-то при поставке.

о Тщательно тестируйте приложения перед пооавко!!. Загрузите больше данных, че.м будет требоваться вашему са.мо.му крупному клиенту, прежде че.м записывать ко.\ишкт-диск с програ.\г\ил. Нети в])е.\!я позволяет, выделите нагрузочное тестпровапие в (И'дельиы]! логнчесюи! шаг и протестируйте приложение - иайганте т-е значения данных, ко.тичества соедипе!ПП1 пользователей, па.мяти и так ла.-iee, которые иpшeлyт к сбою пли которые превышают возлюжностп вашего г1])иложеи11я.



Советы по оптимизации при проектировании баз данных

о Записи и ключи таблицы Д()лжн1л быть как можно короче Ctapairrecb быть рациональным, но не скупым. Уменьшив запись lui один баи г, вы .много пе сэконо.мите, если у вас есть всего несколько записей, и хуже всего, если ва.м все же понадобится этот один байт. Причина использования коротких запнсей очевидна - че.м меньше работы до.чжен выполнить сервер для выполнения запроса, те.м быстрее запрос закончит выно;н1яться, При.мененпс более коротких записей позволяет размещать больше записей па странице и больше данных в одном и том же пространстве кэша. Это утверждение справедливо и для стра1нщ индексов - короткие ключи позволяют хранить больше записей на странице, чем длинные.

О Создание макси.мально коротких кластерных индексов позволяет уменьшить размер некластерных индексов, поскольку теперь они ссылаются на кластерный индекс (если такой существует), а не на пря.мую на таблицу.

О Нормализуйте все ваши базы данных по крайней мере до третьей нормальной формы. Денормалнзацию, если таковая понадобится, вы сможете осуществить и позже. Смотрите раздел Денормализация д;1лее в это11 главе для более подробной инфор.мацни.

О Когда это возможно, используйте ограничещш декларативной ссылочно!! целостности (Declarative Referential Integrity constraints), чтобы гарантировать . ссылочную целостность, так как чаще всего это 6i)icTpee, че.м триггеры или храни.мые процедуры. DRI-ограннчения peaj 30BaHbr в виде тщателыю оптимизированного машинного кода, который находится внутри SQL Server. Триггеры же и хранимые процедуры состоят из псевдосколптлированного кода на Transact-SQL. При прочих равных условиях машинный код будет выполняться быстрее.

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

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

О Рассмотрите возмож1юсть задействовать файловые группы для распределения больших таблиц по нескольким диска.м и для отделения индексов от данных. Если это возможно, раз.мещайте журна.! транзакцп! на отдельно.м диске или дисках и разносите по отдельности основ1гые таблицы. Особенно это касается очень больших баз данных.

О Если первичный ключ таблицы является послсдовательны.м (напри.мер, если это identity-столбец), сделайте его некластериым первичны.м ключо.м. ICiacrep-ный индекс по .монотонно возрастающему ключу менее опти.мален, посколь-



1 ... 31 32 33 34 35 36 37 ... 55
© 2004-2025 AVTK.RU. Поддержка сайта: +7 495 7950139 в тональном режиме 271761
Копирование материалов разрешено при условии активной ссылки.
Яндекс.Метрика