You are on page 1of 27

Индекси.

Типови индекси.
Сoздавање и бришење на индекс

Употреба на SQL за извлекување на


податоци од табели

Лабораториски вежби 4
Содржина
• Намена и структура на индексите
• Видови индекси
• Креирање на индекс
• Бришење на индекс
• Примери

• Задача

• Конструкцијата SELECT
• Условен оператор WHERE
• Користење на операторите IS NULL, BETWEEN, IN, LIKE
• Клучниот збор DISTINCT
• Користење на ORDER BY

• Задачи
Намена и структура на индексите

• Покрај табелите други важни структури со податоци кој се дефинирани


од корисникот, се индексите. Индекс овозможува брз пристап до
податоци, кога тие се пребаруваат преку вредноста која преставува
индексен клуч.
• SQL Server поддржува кластерирани и некластерирани индекси. И
двата типа користат стандардни B-дрва.
▫ B-дрво преставува структура на податоци која е наменета за зачувување
на податоците на надворешни/секундарни мемории (пр. хард диск) поради
малиот број на пристапи кон дискот. Оваа структура најчесто се користи
за имлементација на база на податоци и датотечни системи.
▫ B-дрвата ја чуват балансираноста на тој начин што сите листови се
наоѓаат на иста висина (разликата во длабочината на произволен пар
листови не надминува единица).
▫ Нивната структура овозможува брз пристап до податоците со пребарување
по вредноста на клучот во индексот. Бидејќи дрвјата се избалансирани,
изнаоѓање на произволно ред бара речиси исто количество ресурси а и
брзината на пребарување.
Видови индекси
I. Кластерирани индекси
• Листовото ниво на кластерираниот индекс содржи страници со податоци, а не индексни
клучеви. Кога индексот ќе биде прегледан до нивото на листовите јазли, ќе се најдат самите
податоци. Кластерираниот индекс определува физичко подредување на податоците во
табелата. Бидејќи податоците можат да бидат физички подредени по само еден начин,
табелата може да има само еден кластериран индекс.
• Кластерираниот индекс е ефективен и при пребарување на одреден ред, кога индексот има
уникална вредност.
II. Некластерирани индекси
• Кај некластерианите индекси нивото на листовите јазли содржи маркер, кој укажува на SQL
Server каде да ги бара редовите со податоци кои одговараат на вредностите на индексот.
• Присуството или отсуството на некластериран индекс не влијае на начинот на кој се
организирани страниците со податоци, така што во една табела може да има повеќе од еден
некластериран индекс.
• Некластериранит индекс е корисен само ако е високо селективен, т.е. треба да може да
елиминира од разгледување голем процент од редовите. Тоа значи дека треба да биде
составен од колона или колони, кои обезбедуваат голема разновидност на вредностите.
• Колоните, кој имаат надворешни клучеви, речиси секогаш се погодни за создавање на
некластерирани индекси, бидејќи тие често се користат за обединување на табели. На овој
начин се подобрува исполнување на упити (Query) со кои се извикуваат редови од најмалку
две табели.
Создавање на индекс

Создавањето на индекс се обавува со командата CREATE INDEX, која го


има следниот синтаксис:

CREATE [UNIQUE] [CLUSTERED | NONCLUSTERED]


   INDEX index_name
   ON table_name
    ( column_name1 [, column_name2 [,…, column_name16]] )
[WITH
      [PAD_INDEX]
      [[,] FILLFACTOR = fillfactor]
      [[,] IGNORE_DUP_KEY]
      [[,] DROP_EXISTING]
      [[,] STATISTICS_NORECOMPUTE]
]
[ON filegroup_name]
• Колоните од тип ntext, image, text и bit не можат да се индексираат.

• При уникален индекс може да се користи опцијата IGNORE_DUP_KEY, со што


грешките во уникалността под командата INSERT (со помош на оваа команда се
внесуваат податоци на ниво на редови) за множество редови не предизвикува
отфрлање на целата конструкција. Редот кој не е уникален, ќе биде отстранет а
сите други ќе бидат внесени.

• Опцијата FILLFACTOR (коефициент на пополнување) се поставува во проценти


и определува колку слободно место треба да се задржи на страниците на ниво на
листо на индексот. Оваа вредност по подразбирање е 0, при што преставува
опција за оптимизирање на SQL Server, т.е. страници на индексите се
пополнуваат колку што е возможно. За да се постави процент на пополнување,
се користи цел број помеѓу 1 и 100. При одредување на соодветна вредност на
овој параметар, треба да се има предвид дека поставувате премногу висок
коефициент на пополнување води до забавување на извршувањето на
конструкциите за менување, модифицирање и ажурирање на податоците во
табелата; поставувате премногу низок коефициент влијае на продуктивноста при
извлекување на податоци од табелата.
• Со опцијата PAD_INDEX се утврдува зачувување на слободно место
на страниците на меѓу нивоата на индексот. Опцијата се применува
само ако е поставено коефициент на пополнување преку
FILLFACTOR, бидејќи се користи оваа процентна вредност.

• Опцијата DROP_EXISTING дозволува веќе формиран индекс да се


создаде повторно, т.е. Индекс се брише и се востановува повторно.
Некластерираните индекси користат кластериран индекс, за да
добијат пристап до редови во табелата, кога кластерираниот индекс
се создава наново, некластерираниот индекс исто така се ресоздава.

• Со опцијата STATISTICS_NORECOMPUTE се укажува да не се


автоматски ажурира статистика за индексот. Ова ќе се одрази на
работата на оптимизаторот на SQL Server, така што одржувањето на
статистичката информација за содржината на табелата во базата на
податоци (број на редови, број различни вредности и др.) дозволува
ефикасно да се оптимизира пристапот до податоците. За да се врати
автоматско ажурирање на статистиката треба да се исполни
опцијата UPDATE STATISTICS.
Бришење на индекс
• Индексит кој не се користат во често
променуваните таблици би требало да бидат
избришани. Во спротивен случај SQL Server ќе
оделува непотребни ресурси за пресметки
подржка на индексите кој не ги користиме.

• Бришењето на индекс се извршува со командата


DROP INDEX, која го има следниот вид:

DROP INDEX table_name.index_name


Креирање на табели кој ќе се кристат понатаму во вежбите за демонстрирање на
примерите:
CREATE TABLE MyDatabase..Customers
( CustomerID int NOT NULL IDENTITY PRIMARY KEY ,
CompanyName varchar(30) NOT NULL,
ContactName varchar(30) NOT NULL,
ContactTitle varchar(30)NOT NULL,
Addressa varchar(30) NOT NULL,
City varchar(30) NULL,
PostalCode varchar(30) NOT NULL,
PhoneNumber varchar(30) NOT NULL)

CREATE TABLE MyDatabase..Employees


( EmployeeID int NOT NULL IDENTITY PRIMARY KEY ,
FirstName varchar(30) NOT NULL,
LastName varchar(30) NOT NULL,
Title varchar(30)NOT NULL,
EMB varchar(30) NOT NULL,
StoreID int NOT NULL,
HireDate datetime NOT NULL,
TerminationDate datetime NULL,
ManagerEmpID int NOT NULL,
City varchar(30) NOT NULL)
Пример некластерирани индекси, кој можат да бидат создадени во
предходно создадените табели :
• во табела Customers
CREATE UNIQUE INDEX CompanyName ON Customers ( CompanyName )
CREATE INDEX City ON Customers ( City )
CREATE INDEX PostalCode ON Customers ( PostalCode )

• во табела Employees
CREATE INDEX Name ON Employees ( FirstName, LastName )
CREATE UNIQUE INDEX UniqueMB ON Employees ( EMB) WITH
IGNORE_DUP_KEY
CREATE INDEX StoreID ON Employees ( StoreID )
CREATE INDEX Emp_mgrID ON Employees ( ManagerEmpID )

• во табела Products
CREATE INDEX CategoryID ON Products ( CategoryID )
CREATE UNIQUE INDEX ProductName ON Products ( ProductName )
CREATE INDEX SupplierID ON Products ( SupplierID )
• Индекс може да се создаде и избрише и од прозорецот Design (сл.1)во
Enterprise Manager. При што се отвора прозорец од каде може да ја
променуваме таблицата. По што со десен клик на некоја колона (сл.2)
избираме Indexes/Key ни се излиза прозорец (сл.3) преку кој менаџираме и
создаваме и бришеме индекси.

Сл.1 Сл.2

Сл.3
• Друг начин за создавање на индеки е со десен клик на
Indexes (сл.4) на дрвото на некоја табела од каде избираме
New Indexes по што се отвара прозор (сл.5) кој го
пополнуваме соодветно за нашите потреби.

Сл.4

Сл.5
Пример: Mодифицирање на индекса CompanyName, кој го
создадовме предходно, ограничување за уникатност, при што се
игнорират дуплите вредости, може да се искористи следната T-
SQL конструкција:

USE MyDatabase
CREATE UNIQUE INDEX CompanyName Индексот

ON Customers ( CompanyName ) Колоната од табелата


WITH IGNORE_DUP_KEY, DROP_EXISTING
Оваа констукција ја вклучува
опцијата Ignore duplicate values
(сл.6)

Сл.6
• За добивање на информација за индексите во
дадена таблица се користат системните процедури
sp_helpindex и sp_statistics.

Пример:

USE MyDatabase име на базата


EXEC sp_helpindex Customers име на табелата
 
USE MyDatabase
EXEC sp_statistics Customers
Задача 1: Да се дефинират соодветни индекси во
таблиците кој ги создадовте во задачите 1 и 2 од
втората лабораториска вежба - Искористување на
SQL за дефинирање на податоци
Конструкцијата SELECT
• SQL (Structured Query Language - јазик за структурирани упити) е стандарден јазик, кој се
користи за дефинирање, манипулирање и извлекување на податоци од релациона бази на
податоци. Името на јазикот потекнува од фактот дека упитите (Query ) се најчесто користен
елемент од SQL. Упитот е конструкција во системот за управување на бази на податоци, која
бара одредена информација од базата. Сите упити (Query ) во SQL се состојат од конструкцијата
SELECT, т.е. конструкцијата SELECT се користи за извлекување на информации од една или
повеќе табели. Резултатот е збир на податоци (во табличен вид), се состои од колони и редови.
Нај простиот вид на командата SELECT е:

SELECT column_list FROM table_name


каде column_list е список од имиња на колони од табелата table_name, и се разделуваат со
запирка.

Пример: SELECT FirstName, Lastname, PhoneNumber


FROM Employees

• Со симболот* се укажува на сите полиња од табелата.


Пример: SELECT * FROM Customers

• Со изборниот клучов збор AS се поставува ново име пред некој израз.


Пример: SELECT CompanyName AS [Name of Supplier], Address
FROM Suppliers
Условен оператор WHERE

• Додавањето на WHERE дозволува да се постави


услов, преку кој ќе се добијат не сите редови, а
само оние кои ги задоволуваат дадениот услов.
Општиод вид на командата во овој случај е:

SELECT column_list FROM table_name


WHERE search_condition
Користење на операторите IS NULL, BETWEEN, IN, LIKE

Критериумите за избор може да вклучуваат стандардни оператори +, –,


*, / , % (остаток при делење), >, <, >=, <=, =, <>, како и некои
специјални SQL оператори:
• IS NULL проверува дали во некое поле е зададена вредност. За
проверка дали вредноста не е NULL се користи column_name IS NOT
NULL. Кога некоја вредност во колоната е NULL, тоа значи дека
програмата за управување на базата на податоци специјално е
обележана колон која не поседува никаква вредност за соодветен ред.
Поради употребата на вредност NULL, булевите изрази во SQL освен
TRUE или FALSE, можат да бидат и UNKNOWN. По што SQL
користи тризначната логика (-three valued logic - 3VL) наместо
традиционалната двузначна логика. Најлесниот начин за помнење на
правилата за искористување на операторите AND, OR и NOT под
3VL се, ако TRUE се смета како 1, а FALSE - како 0 и UNKNOWN -
како ½. Тогаш резултатот на операцијата x AND y е min (x, y);
резултатот на x OR y е max (x, y); резултатот на NOT x е 1-x.
• Табелата на вистинитоста за операторот NOT во тризначната
логика: Израз Логички вредност на
изразот
NOT TRUE FALSE
NOT FALSE TRUE
NOT UNKNOWN UNKNOWN

• Табелата на вистинитоста за операторот OR во тризначната


логика: OR TRUE FALSE UNKNOWN
TRUE TRUE TRUE TRUE
FALSE TRUE FALSE UNKNOWN
UNKNOWN TRUE UNKNOWN UNKNOWN

• Табела вистинитоста за операторот AND во тризначната


логика: AND TRUE FALSE UNKNOWN
TRUE TRUE FALSE UNKNOWN
FALSE FALSE FALSE FALSE
UNKNOWN UNKNOWN FALSE UNKNOWN
Пример во резултатот на изполнување на
упитот
SELECT * FROM Customers
WHERE City <> ‘Stip'
• Редовите со вредности NULL нема да се изведат,
така што WHERE враќа само редови, за кој
условието има вредност TRUE, а споредбата
NULL <> ' Stip' враќа вредност UNKNOWN. За да
се врнат редови со вредност NULL, треба да се
користи следниот упит:
SELECT * FROM Customers
WHERE City <> ' Stip' OR City IS NULL
• BETWEEN min_value AND max_value проверува
дали вредноста е во даден интервал.
Пример следниот упит ги избира сите клиенти, чии
имиња се во азбучниот интервал A÷F:
SELECT * FROM Customers
WHERE CompanyName BETWEEN 'A' AND 'F'

• IN (value1, value2, …, valueN) враќа TRUE, ако


вредноста е во даден список од вредности.
Пример следниот упит ги избира сите клиенти, чии
идентификатори се 1, 10, или 87:
SELECT * FROM Customers
WHERE CustomerID IN (1, 10, 87)
• LIKE шаблон за симболен низ споредува симболни низови
со дадениот шаблон и враќа TRUE ако стрингот одговара на
шаблонот. За формирање на шаблон се користат следниве
симболи:
▫ Симболот долна црта (_) означува еден произволен симбол;
▫ Симболот процент (%) значи последователност од произволни
симболи (вклучувајќи 0 на број);
▫ []Означува еден знак, кој се наоѓа во укажана област (пример
[a-f]) или укажано множество(пример [acegxz] или [87m-py-]
означува меѓу симболите 8, 7, m ÷ p, y, -);
▫ [^] Означува еден знак се наоѓа надвор од укажана област
(пример [^ a-f]) или надвор укажаното множество([^ acegxz]);
▫ За пребарување на низ, во кој има% или _ треба да се
дефинира симбол кој ќе управува (escape character).
Управувачкиот симбол се користи непосредно пред карактери
% или _ и значи дека знакот % или _ мора да се интерпретира
буквално - како обичен симбол.
Пример:
1) извеждане на сите клиенти, кој содржат во името симбол_.
SELECT * FROM Customers
WHERE CompanyName LIKE '%/_%' ESCAPE '/'
2) извеждане на редовете од table_name, кој содржат во колоната
column_name низа '87%'.
SELECT * FROM table_name
WHERE column_name LIKE '%87!%%' ESCAPE '!'
• Можно е да се огради специјален симбол во [], за да се користи
како обичен симбол.
Пример, за да се барат низови, кој започнуваат со '4080_59':
SELECT * FROM table_name
WHERE column_name LIKE '4080!_59%' ESCAPE '!‘

или
SELECT * FROM table_name
WHERE column_name LIKE '4080[_]59%'
Клучниот збор DISTINCT

• Клучниот збор DISTINCT преставува начин за


ограничување на излезните податоци само до
уникатните вредности. DISTINCT се прибавува во
конструкцијата SELECT.

Пример:

SELECT DISTINCT City FROM Customers

Го отстранува редовите кој се повтараат од крајниот


резултат и враќа само различни градови во кои има
клиенти.
Користење на ORDER BY

• Сортирањето информациите добиени со SELECT се врши со помош на изразот


ORDER BY кој укажува на една или повеќе колони. Синтаксата на изразот е:

ORDER BY (column_name [sort_order]) [...]

• Укажувањето на ред за сортирање не е задолжително и се врши преку


клучните зборови ASC или DESC за сортирање во ред кој се зголемува или
намалува. По принцип редовите се сортират во ред на зголемување по што
ASC може да се пропушти.

Пример:
1) Упитот кој избира колони од табелата за вработените и изведува во резултат
сет на редови, сортирани по азбучен ред.

SELECT FirstName, LastName, PhoneNumber,


       HireDate, TerminationDate
FROM Employees
ORDER BY FirstName ASC, LastName ASC
2) За разлика од претходниот пример овој упит ги
избира редовите од табелата за вработените, кои не
отпуштени (немаат внесена дата на отпуштање
TerminationDate) и ги сортира резултатотниот
набор од редови по датум на почнување со работа
во ред кој се намалува; редови со иста дата на
почнување со работа HireDate се подредуваат по
азбучен ред.

SELECT FirstName, LastName, PhoneNumber,


       HireDate, TerminationDate
FROM Employees
WHERE TerminationDate IS NULL
ORDER BY HireDate DESC, FirstName ASC, LastName ASC
Задача 1. Какви ќе бидат изходните податоци од следниве
упити:

1.1. SELECT * FROM Employees


WHERE TerminationDate IS NOT NULL
  AND LastName LIKE 'A%‘

1.2. SELECT * FROM Sales


WHERE (TotalForSale >= 100 OR TotalForsale <=10)
  AND SaleDate BETWEEN '01/01/2003' AND '02/01/2003‘

1.3. SELECT DISTINCT EmployeeID


FROM Sales
WHERE CustomerID IN (5, 10, 18, 87)

1.4. SELECT * FROM Stores


WHERE City IN ('Veliko Tarnovo', 'Sofia', 'Varna')
   OR City LIKE 'G%a'
ORDER BY StoreName

You might also like