Информационный сайт

 

Реклама
bulletinsite.net -> Книги на сайте -> Программисту -> Артемов Д.В. -> "Microsoft SQL Server 2000" -> 67

Microsoft SQL Server 2000 - Артемов Д.В.

Артемов Д.В. Microsoft SQL Server 2000 — М.: Издательско-торговый дом «Русская Редакция», 2001. — 576 c.
ISBN 5-7502-0154-6
Скачать (прямая ссылка): artemov.pdf
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 187 >> Следующая


- Включение C0UNT_BIG(*) в состав описания также обязательно CREATE VIEW TestlndexView WITH SCHEMARINBING as

SELECT Productld, Sum(Quantity) AS QTYSum, Sum(UnitPrice * Quantity) AS ExtPriceSum, C0UNT_BIG(«) AS RigCount FROM [dbo], [Order Retails] GROUP -BY ProductIB

go

www.books-shop.com

ГЛАВА 3: Управление базами данных

www.books-shop.com

- Создаем индекс на представление

CREATE UNIQUE CLUSTERED INDEX QTY_Sum_Index on TestlndexView (Productld)

go

Теперь посмотрим на планы исполнения. Если мы воспроизведем окружение, аналогичное тому, что требуется для создания индекса:

- Нам нужно поменять только одну параметр, все остальные Query Analyzer по умолчанию выбирает правильно

SET OUOTED_IDEMTIFIER ON

GO

SELECT * FROM TestlndexView WHERE Productld = 20 GO

План исполнения будет такой, как и ожидалось. Индекс создан не зря:

StmtText

!-Clustered Index Seek (OBJECT:([Northwind].[dbo].[TestlndexView].[QTY_Sum_Index]), SEEK: ([TestlndexView]. [Productld]=20) ORDERED FORWARD)

Теперь «испортим» окружение:

SET QUOTEDIDENTIFIER OFF

GO

SELECT * from TestlndexView WHERE Productld = 20

GO

StmtText

l-Stream Aggregate(DEFlNE:([Exprl004]=Count(*), [Expr1002]=SUM([Order Details]. [Quantity]),

-Clustered Index Scan(0BJECT: ([Northwind]. [dbo]. [Order Details]. [PK_0rder_Details]),

Невесело: получаем, по сути дела сканирование таблицы. Если оценить затраты на исполнение второго запроса, то число чтений больше в 8 раз, а стоимость исполнения — на порядок

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

180

Microsoft SQL Server 2000. Новейшие технологии

только они гарантированно обеспечить «среду обитания» зап-

роса. Согласитесь, практически невозможно гарантировать, любое приложение, которое будет к БД, правильно выставит все а потом Ваши пользователи начнут жаловаться, что их запросы обрабатываются слишком медленно, и заведут старую песню о том, что «если бы мы выбрали Oracle, все работало бы намного быстрее»... А корень зол — в несоблюдении условий.

Но зачем эти мучения? А затем, что мы имеем дело с агрегатами, и возвращаемые результаты при одном и том же входном наборе параметров всегда должны быть одинаковы. Скажем, представление включает конкатенацию двух строк. В общем случае результат сложения двух текстовых полей может быть разным в зависимости от параметра CON-CAT_NULL_YIELDS_NULL. Если не гарантировать одинаковое окружение, то «Text»+Null в одном случае вернет «Text», а в другом — To же относится и к арифметическим выражением. Более того, в состав представления нельзя включать недетерминированные функции, например GETDATE(), которая сейчас возвращает один результат, а через секунду уже другой. Правило такое: формулировка представления и параметры окружения должны быть таковы, что сохраненное физическое представление всегда возвращает одинаковый результат при одних и же входных параметрах. Для проверки столбца таблицы на детерминизм можно использовать здравый смысл или функцию COLUMNPROPERTYc параметром IsDeterministic.

Set Quoted_Identifier ON

go

CREATE VIEW TestView With Schemabinding AS

SELECT Fldl, Fld2 from dbo.Testl GO

CREATE UNIQUE CLUSTERED INDEX Index_View on TestView (Fld1, FId 2) GO

Set Quoted_Identifier OFF GO

INSERT TestView (Fldl, Fld2) Values (13, '13') Go

-INSERT failed because the following SET options have incorrect settings: 'QUOTED_IDENTIFIER',

www.books-shop.com

глава 3: Управление базами данных

18t

www.books-shop.com

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

Хранимые процедуры и триггеры обеспечивают значительную долю той которая обычно связывается с сервером БД. В этом смыс-

ле SQL Server не исключение. Язык программирования Transact SQL позволяет описать очень сложную логику манипулирования и проверки данных, а новые возможности версии 8.0 еще больше расширяют число задач, решение которых по плечу флагманской СУБД Microsoft.

Хранимые процедуры

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

Хранимые процедуры могут быть 4 типов: системные (System), локальные (Local), временные (Temporary) и удаленные (Remote). Эта классификация разделяет процедуры по области видимости — с точки зрения кода, который могут содержать процедуры разных типов, различий нет.
Предыдущая << 1 .. 61 62 63 64 65 66 < 67 > 68 69 70 71 72 73 .. 187 >> Следующая
Реклама
Авторские права © 2009 AdsNet. Все права защищены.
Rambler's Top100