MS sql indekslari. Sql server - Microsoft SQL da qoplama indeksini yaratishda buyurtma muhimmi? Doimiy hisoblangan ustunlar

--Indeks - bu jadval yoki ko'rinish bilan bog'langan va jadval yoki ko'rinishdan satrlarni qidirishni tezlashtiradigan diskdagi tuzilma. Indeks jadval yoki ko'rinishdagi bir yoki bir nechta ustunlardan tuzilgan kalitlarni o'z ichiga oladi. Ushbu kalitlar SQL Serverdagi asosiy qiymatlari bo'yicha satrlarni tezkor qidirishni qo'llab-quvvatlaydigan muvozanatli daraxt tuzilishida saqlanadi.

--Klasterli indekslar ma'lumotlar qatorlarini asosiy qiymatlari asosida jadvallar yoki ko'rinishlarda saralaydi va saqlaydi. Ushbu qiymatlar indeks ta'rifiga kiritilgan ustunlardir. Jadvalda faqat bitta klasterli indeks mavjud, chunki ma'lumotlar qatorlarini faqat bitta tartibda saralash mumkin.
--Jadvaldagi ma'lumotlar qatorlari faqat jadvalda klasterlangan indeks mavjud bo'lsa, tartiblash tartibida saqlanadi. Agar jadval klasterli indeksga ega bo'lsa, u holda jadval klasterli deb ataladi. Agar jadvalda klasterli indeks bo'lmasa, ma'lumotlar satrlari to'p deb ataladigan tartibsiz tuzilmada saqlanadi.

--Klastersiz indeks klasterli indeks bilan aynan bir xil tuzilishga ega, lekin ikkita muhim farqga ega:
--klasterli bo'lmagan indeks jadvaldagi satrlarning jismoniy tartibini o'zgartirmaydi va klastersiz indeksdagi barg sahifalari indeks kalitlari va xatcho'plardan iborat.

--Klasterli indekslar klasterlanmagan indekslarga qaraganda tezroq ma'lumotlarni olish imkonini beradi. Odatda ular yangilanish paytida ham tezroq bo'ladi, lekin munosabatlarning o'rtasida bir joyda ko'p yangilanishlar sodir bo'lganda emas.

--Ba'zi sabablarga ko'ra, klasterli indeks klasterlanmagan indeksga qaraganda tezroq ishlaydi. Tizim klasterli indeksni skanerlaganda, ma'lumotlar sahifalarini skanerlash uchun B-daraxt strukturasini tark etishning hojati yo'q, chunki bunday sahifalar allaqachon daraxtning barglari darajasida mavjud.

--Klaster bo'lmagan indeks, shuningdek, tegishli klasterli indeksga qaraganda ko'proq kiritish/chiqarish operatsiyalarini talab qiladi.

--Klaster bo'lmagan indeks B-daraxtni skanerdan o'tkazgandan so'ng ma'lumotlar sahifalarini o'qishi kerak yoki agar jadvalning boshqa ustun(lar)ida klasterlangan indeks mavjud bo'lsa, klasterli bo'lmagan indeks klasterlangan indeksning B daraxti tuzilishini o'qishi kerak. .

--Shunday qilib, klasterli indeks jadvalni skanerlashdan ko'ra sezilarli darajada tezroq bo'ladi, hatto uning tanlanganligi juda yomon bo'lsa ham (so'rov juda ko'p qatorlarni qaytaradi)

tsql.dbo.NI JADVAL YARATING
ID int NO NULL,
T char(8) NULL
);

JADVAL YARATING tsql.dbo.NCI
ID int NO NULL,
T char(8) NULL
);

--Klasterlangan indeks yaratish

IX_1 KLASTERLI INDEKSI YARATING
ON tsql.dbo.NCI(ID);

--Jadvalda klastersiz indeks yaratish

KLASTER BO'LMAGAN INDEKSI IX_2 YARATING
ON tsql.dbo.NCI(T);

--Test ma'lumotlarini qo'shing
DECLARE @i INT = 100000;
DECLARE @t CHAR(1) = "T";

WHILE @i > 0
BOSHLANISHI
tsql.dbo.NI qiymatlariga kiriting (@i, @t + CAST(@i AS char(6)));
tsql.dbo.NCI qiymatlariga kiriting (@i, @t + CAST(@i AS char(6)));
SET @i -= 1;
OXIRI

--Indeksli jadvaldagi so'rovlar
TSQL.dbo.NCI DAN TANLASH ID, T
ID BO‘YICHA BUYURTMA, T

TSQl.dbo.NCI dan C AS identifikatorini, COUNT(*) ni tanlang
ID BO‘YICHA GURUHLASH, T

TSQL.dbo.NCI DAN TANLASH ID, T
WHERE ID > 4000 VA ID< 55000 AND T LIKE "T%"

--Har ikkala indeks yordamida so'rov
tsql dan foydalanish;
TANLASH (VARCHAR ASKI Dbo.NCI.ID)
dbo.NCI dan
dbo.NCI.ID BO'YICHA GURUHLASH
HAMMA ittifoq
SELECT dbo.NCI.T
dbo.NCI dan
dbo.NCI.T tomonidan GURUHLASH

--Indekslar haqida ma'lumot
Indeks_turi_dec, indeks_chuqurligi, indeks_darajasini SELECT,
sahifa_hisobi, rekord_hisob
FROM sys.dm_db_index_physical_stats
(DB_ID(N"tsql"), OBJECT_ID(N"dbo.NCI"), NULL, NULL , "DETAILED");

--Indekslarni o'chirish
AGAR MAVJUD BO'LSA (nomni sys.indexes dan tanlang
WHERE nomi = N"IX_1")
IX_1 INDEKSINI tsql.dbo.NCI BO'YICHA QILISH;

AGAR MAVJUD BO'LSA (nomni sys.indexes dan tanlang
WHERE nomi = N"IX_2")
IX_2 INDEKSINI tsql.dbo.NCI BO'YICHA QILISH;

Oldingi maqolada biz relyatsion ma'lumotlar bazalarini optimallashtirish usullarini taqdim etdik va ma'lumotlar bazasi so'rovlarini bajarish vaqtini optimallashtirish kontekstida klasterli va klasterli bo'lmagan indekslar qanday ishlashini muhokama qildik. Endi MS SQL ma'lumotlar bazasi uchun optimallashtirish indekslarini yaratishni o'rganish orqali ushbu bilimlarni amalda qo'llash vaqti keldi.

Sizga biz ishlaydigan xodimlar jadvali sxemasining ta'rifini eslatib o'taman:

Xodimlar jadvali

Aytaylik, biz xodimlar jadvali uchun klasterli bo'lmagan indeks yaratishimiz kerak, bu quyidagi so'rovni optimallashtiradi:

Maoshi > 1000 VA FOTO BO'LGAN BO'LMAGAN NARSALARDAN ID, ism, ishni tanlang

Indeks kaliti ISHLAB CHIQISH va Fotosurat ustunlari bo'ladi, chunki tanlov ushbu maydonlar bo'yicha filtrlanadi. Va Id, Ism va Ish ustunlari indeksga kiritilgan ustunlar bo'ladi.

Umumiy buyruq sintaksisi quyidagicha:

FOYDALANISH BOSH

KLASTER BO'LGAN INDEKS YARATING ON (ASC -- indeks kalit ustunlari)

QO'SHLASH ( -- kiritilgan ustunlar) GO

Bizning holatda, so'rov quyidagicha ko'rinadi:

(Ish haqi, rasm) QO'SHLASH (Id, Ism, Lavozim) KETISH

Biz klasterli bo'lmagan indeks yaratdik. To'g'rirog'i, klasterli bo'lmagan qoplama indeksi. Bu shuni anglatadiki, indeks so'rovni bajarish uchun zarur bo'lgan barcha maydonlarni o'z ichiga oladi va so'rovni bajarishda SQL Server asosiy jadvalga kira olmaydi.

Agar bizning kodimiz shunday bo'lsa:

IDX_StaffsSearch ON INDEKSINI YARATING.

(Ish haqi, rasm) QO'SHLASH (Id) KETISH

Bunday holda, indeks so'rovda ishlatiladigan barcha ustunlarni o'z ichiga olmagani uchun qoplovchi indeks bo'lishni to'xtatadi. Optimallashtiruvchi so'rovni bajarishda hali ham ushbu indeksdan foydalanadi, lekin uning samaradorligi kattalik darajasiga kamayadi, chunki u asosiy jadvalga kirishni talab qiladi.

Klasterlangan indeks quyidagi buyruq yordamida yaratiladi:

KLASTERLI INDEKSINI YARATING IDX_Stsffsid ON (Id)

Bu erda jadvalning asosiy kaliti (Id ustuni) asosida noyob klasterli indeks yaratilgan.

Haqiqiy misol

Keling, indekslardan foydalanganda samaradorlikni oshirish darajasini real baholashimiz mumkin bo'lgan stsenariyni ishlab chiqaylik.

Keling, yangi ma'lumotlar bazasini yarataylik:

TestDB ma'lumotlar bazasini yaratish;

Va to'rtta ustundan iborat bo'lgan yagona mijozlar jadvali:

JADVAL YARAT .(

NO NULL, NULL, NULL, NULL) GO

Endi jadvalimizni tasodifiy ma'lumotlar bilan to'ldiramiz. Id ustuni tsiklda ko'paytiriladi va jadvalning qolgan uchta ustuni tasodifiy funktsiyaning o'ziga xos versiyasidan foydalangan holda tasodifiy raqamlar bilan to'ldiriladi:

E'lon qiling @i int = 0;

WHILE (@i< 500000) BEGIN INSERT INTO Customers(Id, Num1, Num2, Num3) VALUES(

@i, abs(nazorat summasi(yangi())), abs(nazorat summasi(yangi())), abs(nazorat summasi(yangi())) SET @i = @i + 1; OXIRI

Ushbu skript jadvalga yarim million yozuvni qo'shadi, shuning uchun sabrli bo'ling, skript kamida 3 daqiqa ishlaydi.

Sinovga hamma narsa tayyor. Biz so'rovning ishlash xususiyatlarini baholaymiz. So'rovni bajarish vaqti aniq mashinaga bog'liq bo'lishi mumkinligi sababli, biz mustaqilroq ko'rsatkichni - mantiqiy o'qishlar sonini tahlil qilamiz.

Statistikani yig'ish rejimini yoqish uchun siz quyidagi buyruqni bajarishingiz kerak:

Endi, har bir so'rovni bajargandan so'ng, "Xabarlar" yorlig'ida biz quyida ko'rsatilganidek, ushbu so'rovning bajarilishi bo'yicha statistik ma'lumotlarga kirish imkoniyatiga ega bo'lamiz:

Bizni faqat mantiqiy o'qish parametrining qiymati qiziqtiradi.

Shunday qilib, bizning jadvalimizda hali indekslar yo'q. Keling, quyidagi uchta so'rovni bajaramiz va har bir so'rov uchun mantiqiy o'qishlar sonini quyidagi natijalar jadvaliga yozamiz:

1) Id = 2000 bo'lgan mijozlardan Id, Num1, Num2 ni tanlang

2) Id >= 0 VA ID bo'lgan mijozlardan Id, Num1, Num2 ni tanlang< 1000

3) Id >= 0 VA ID bo'lgan mijozlardan Id, Num1, Num2 ni tanlang< 5000

Ushbu so'rovlar mos ravishda 1 qator, 1000 qator va 5000 qatorni qaytaradi. Indekslarsiz, barcha so'rovlar uchun ishlash ko'rsatkichi (mantiqiy o'qishlar soni) bir xil va 1621 ga teng. Keling, natijalar jadvaliga ma'lumotlarni kiritamiz:

Biz ikkinchi va uchinchi so'rovlar uchun juda ko'p qatorlar qaytarilganda, biz yaratgan indeks ishlashni yaxshilamaganini ko'ramiz. Biroq, bitta qatorni qaytaradigan so'rov uchun tezlik juda katta edi. Shunday qilib, bitta natijani qaytaradigan so'rovlarni optimallashtirishda qamrab olinmaydigan indekslarni yaratish mantiqiy degan xulosaga kelishimiz mumkin.

Keling, qoplama indeksini yarataylik va shu bilan maksimal ishlashga erishamiz.

Birinchidan, oldingi indeksni o'chirib tashlaymiz:

TestDB GO DROP INDEX Customers.TestIndex1 dan foydalaning

Va keling, yangi indeks yaratamiz:

dbo.Customers(Id) ON KLASTER BO'LMAGAN INDEKS YARATING TestIndex2 (Num1, Num2);

Endi so'rovlarimizni uchinchi marta bajaramiz va natijalarni jadvalga yozamiz:

Indekslar yo'q

Qoplamaydigan indeks

Qoplash indeksi

Ishlashning o'sishi juda katta ekanligini ko'rish oson. Shunday qilib, biz so'rovlarni bajarish tezligini o'nlab marta oshirdik. Millionlab satrlarni saqlaydigan ma'lumotlar bazasini ishga tushirganda, bu unumdorlik sezilarli darajada sezilarli bo'ladi.

Ushbu maqolada biz indekslarni yaratish orqali ma'lumotlar bazasini optimallashtirish misolini ko'rib chiqdik. Shuni ta'kidlash kerakki, indekslarni yaratish har bir so'rov uchun mutlaqo individual jarayondir. So'rovlar unumdorligini chinakamiga optimallashtiradigan indeks yaratish uchun so'rovning o'zini va uni bajarish rejasini diqqat bilan tahlil qilishingiz kerak.

Samarali indeks yaratish ma'lumotlar bazasi ilovasi ish faoliyatini yaxshilashning eng yaxshi usullaridan biridir. Indekslardan foydalanmasdan, SQL Server har bir sahifaga qarab kitobdagi so'zni topishga urinayotgan o'quvchiga o'xshaydi. Agar kitobda mavzu ko'rsatkichi (indeks) bo'lsa, o'quvchi kerakli ma'lumotlarni ancha tezroq qidirishi mumkin.

Indeks bo'lmasa, SQL server jadvaldan ma'lumotlarni olishda butun jadvalni skanerlaydi va so'rov mezonlari bajarilganligini tekshirish uchun har bir qatorni tekshiradi. Bunday to'liq skanerlash butun tizimning ishlashi uchun halokatli bo'lishi mumkin, ayniqsa jadvallarda juda ko'p ma'lumotlar mavjud bo'lsa.

Ma'lumotlar bazasi bilan ishlashda eng muhim vazifalardan biri tizim ish faoliyatini yaxshilash uchun optimal indeksni yaratishdir. Aksariyat asosiy ma'lumotlar bazalari so'rovlarni bajarish rejasini ko'rish va indekslarni sozlash va optimallashtirish uchun vositalarni taqdim etadi. Ushbu maqola ma'lumotlar bazasida indekslarni yaratish yoki o'zgartirishda qo'llaniladigan bir nechta yaxshi qoidalarni ta'kidlaydi. Birinchidan, indekslash ish faoliyatini yaxshilaydigan va indeksatsiya zarar etkazishi mumkin bo'lgan vaziyatlarni ko'rib chiqaylik.

Foydali indekslar

Shunday qilib, jadvalni indekslash qaerda ifodasi yordamida jadvaldagi ma'lum bir yozuvni qidirishda foydali bo'ladi. Bunday so'rovlarga, masalan, qiymatlar oralig'ini qidiradigan so'rovlar, aniq qiymatga aniq qiymat mos keladigan so'rovlar va ikkita jadvalni birlashtiruvchi so'rovlar kiradi.

Masalan, Northwind ma'lumotlar bazasiga qarshi quyidagi so'rovlar UnitPrice ustunida indeks yaratishda samaraliroq ishlaydi.

UnitPrice=1 boʻlgan mahsulotlardan oʻchirish
Birlik narxi 14 dan 16 gacha bo'lgan mahsulotlardan * ni tanlang

Indeks elementlari tartiblangan holda saqlanganligi sababli, indekslash band bo'yicha tartib yordamida so'rovni yaratishda ham foydalidir. Indekssiz, so'rov bajarilayotganda yozuvlar yuklanadi va tartiblanadi. UnitPrice-ga asoslangan indeks sizga oddiygina indeksni skanerlash va keyingi so'rovni qayta ishlashda mos yozuvlar bo'yicha qatorlarni olish imkonini beradi. Agar siz satrlarni kamayish tartibida tartiblashni xohlasangiz, indeksni teskari tartibda skanerlashingiz mumkin.

* UnitPrice ASC bo'yicha mahsulotlar buyurtmasidan tanlang

Guruh bo‘yicha bayonot yordamida yozuvni guruhlash ham ko‘pincha tartiblashni talab qiladi, shuning uchun UnitPrice ustunida indeks yaratish har bir aniq narx bo‘yicha mahsulot birliklari sonini hisoblaydigan keyingi so‘rov uchun ham foydali bo‘ladi.

Mahsulotlar guruhidan birlik narxini (*), UnitPrice bo'yicha tanlang

Indekslar ustun uchun noyob qiymatni saqlash uchun foydalidir, chunki DBMS qiymat allaqachon mavjud yoki yo'qligini ko'rish uchun indeksni osongina ko'rishi mumkin. Shu sababli, asosiy kalitlar har doim indekslanadi.

Indekslashning kamchiliklari

Rekord o'zgarishlari paytida indekslar tizim ish faoliyatini pasaytiradi. Jadvaldagi ma'lumotlarni o'zgartirish uchun har qanday so'rov bajarilganda, indeks ham o'zgarishi kerak. Indekslarning maqbul sonini tanlash uchun siz ma'lumotlar bazasini sinab ko'rishingiz va uning ishlashini kuzatishingiz kerak. Ma'lumotlar bazalari asosan ma'lumotlarni qidirish uchun, masalan, hisobot berish uchun ishlatiladigan statik tizimlar faqat o'qish uchun so'rovlarni qo'llab-quvvatlash uchun ko'proq indekslarni o'z ichiga olishi mumkin. Ma'lumotlarni o'zgartirish uchun ko'p miqdordagi tranzaktsiyalarga ega bo'lgan ma'lumotlar bazalari yuqori o'tkazuvchanlikni ta'minlash uchun oz sonli indekslarni talab qiladi.

Indekslar diskda va operativ xotirada qo'shimcha joy egallaydi. Aniq o'lcham jadvaldagi yozuvlar soniga, shuningdek indeksdagi ustunlar soni va hajmiga bog'liq bo'ladi. Ko'pgina hollarda, bu katta muammo emas, chunki diskdagi bo'sh joyni yaxshiroq ishlash uchun qurbon qilish oson.

Optimal indeksni yaratish

Oddiy indeks

Oddiy indeks - bu jadvaldagi bitta maydonning qiymatlaridan foydalanadigan indeks. Oddiy indeksdan foydalanish ikki sababga ko'ra foydalidir. Birinchidan, ma'lumotlar bazasini ishga tushirish sizning qattiq diskingizga katta stress qo'yadi. Katta indeksli kalitlar ma'lumotlar bazasini ko'proq kiritish-chiqarish operatsiyalarini bajarishga majbur qiladi, bu esa ishlashni cheklaydi.

Ikkinchidan, indeks elementlari ko'pincha taqqoslashda ishtirok etganligi sababli, kichikroq indekslarni solishtirish osonroq. Ushbu ikki sababga ko'ra, bitta butun son ustuni yaxshiroq indeksdir, chunki u kichik va solishtirish oson. Boshqa tomondan, belgilar satrlari belgilarni har bir belgi bilan taqqoslashni va parametrlarni boshqarishga e'tibor berishni talab qiladi.

Tanlangan indeks

Eng samarali indekslar ikki nusxadagi qiymatlarning past foiziga ega bo'lgan indekslardir. Misol uchun, deyarli hamma Smit familiyasiga ega bo'lgan shaharning telefon ma'lumotnomasi, agar undagi yozuvlar familiya bo'yicha tartiblangan bo'lsa, unchalik foydali bo'lmaydi.

Noyob qiymatlarning yuqori foiziga ega bo'lgan indeks selektiv indeks deb ham ataladi. Shubhasiz, noyob indeks eng katta selektivlikka ega, chunki unda takroriy qiymatlar mavjud emas. Ko'pgina DBMSlar har bir indeks bo'yicha statistik ma'lumotlarni kuzatishi va har bir indeksning qancha takrorlanmaydigan qiymatlarni o'z ichiga olganligini aniqlashi mumkin. Ushbu statistika so'rovni bajarish rejasini yaratishda ishlatiladi.

Qoplama indekslari

Indekslar indeksning o'zi qurilgan ma'lumotlar ustunidan va tegishli qatorga ko'rsatgichdan iborat. Bu kitob indeksiga o'xshaydi: u faqat kalit so'zlarni va qo'shimcha ma'lumot olish uchun o'tishingiz mumkin bo'lgan sahifaga havolani o'z ichiga oladi. Odatda DBMS so'rov uchun zarur bo'lgan barcha ma'lumotlarni to'plash uchun indeksdan bir qatorga ko'rsatgichlarni kuzatib boradi. Biroq, agar indeks so'rovda zarur bo'lgan barcha ustunlarni o'z ichiga olsa, ma'lumotni jadvalning o'ziga kirmasdan olish mumkin.

Keling, yuqorida aytib o'tilgan UnitPrice ustunidagi indeksni ko'rib chiqaylik. DBMS keyingi so'rovni bajarish uchun faqat indeks elementlaridan foydalanishi mumkin.

Mahsulotlar guruhidan Count(*), UnitPrice boʻyicha birlik narxini tanlang

Ushbu turdagi so'rovlar qoplovchi so'rov deb ataladi, chunki so'ralgan barcha ustunlar bitta indeksdan olinishi mumkin. Eng muhim so'rovlar uchun siz eng yaxshi ishlash uchun qoplama indeksini yaratish haqida o'ylashingiz mumkin. Bunday indekslar kompozit bo'lishi mumkin (bir nechta ustunlar yordamida), bu birinchi tamoyilga qarama-qarshidir: oddiy indekslarni yaratish. Shubhasiz, indeksdagi ustunlarning optimal sonini tanlash faqat turli vaziyatlarda ma'lumotlar bazasining ishlashini sinovdan o'tkazish va monitoring qilish orqali baholanishi mumkin.

Klaster indeksi

Ko'pgina ma'lumotlar bazalarida jadvalda bitta maxsus indeks mavjud bo'lib, unda qatordagi barcha ma'lumotlar indeksda joylashgan. SQL Serverda bunday indeks klasterli indeks deb ataladi. Klasterli indeksni telefon ma'lumotnomasi bilan solishtirish mumkin, chunki har bir indeks elementi barcha kerakli ma'lumotlarni o'z ichiga oladi va qo'shimcha ma'lumotlarni olish uchun havolalarni o'z ichiga olmaydi.

Umumiy qoida bor - har bir ahamiyatsiz jadval klasterlangan indeksga ega bo'lishi kerak. Agar jadvalda faqat bitta indeks yaratish mumkin bo'lsa, uni klasterli qiling. SQL Serverda birlamchi kalit yaratilganda, indekslash kaliti sifatida asosiy kalit ustunidan foydalanib, avtomatik ravishda klasterli indeks yaratiladi (agar u allaqachon mavjud bo'lmasa). Klasterlangan indeks eng samarali indeks hisoblanadi (agar foydalanilsa, u butun so'rovni qamrab oladi) va ko'pgina DBMSlarda bunday indeks jadvallarni saqlash uchun so'ralgan joyni samarali boshqarishga yordam beradi, chunki aks holda (klasterlangan indeks yaratmasdan) jadval qatorlari saqlanadi. tartibsiz tuzilma bo'lib, u to'p deb ataladi.

Klasterlangan indeks uchun ustunlarni tanlashda ehtiyot bo'ling. Agar siz yozuvni o'zgartirsangiz va klasterli indeksdagi ustun qiymatini o'zgartirsangiz, ma'lumotlar bazasi indeks elementlarini qayta tiklashga majbur bo'ladi (ularni tartiblangan tartibda saqlash uchun). Esda tutingki, klasterli indeks uchun indeks elementlari barcha ustun qiymatlarini o'z ichiga oladi, shuning uchun ustun qiymatini o'zgartirishni Delete iborasidan keyin Insert amalini bajarish bilan solishtirish mumkin, bu tez-tez bajarilsa, ishlashda muammolarga olib kelishi aniq. Shu sababli, klasterli indekslar ko'pincha asosiy kalit va tashqi kalit ustunidan iborat. Agar asosiy qiymatlar o'zgarsa, ular juda kam o'zgaradi.

Xulosa

Ma'lumotlar bazasida foydalanish uchun to'g'ri indekslarni aniqlash tizimni sinchkovlik bilan tahlil qilish va sinovdan o'tkazishni talab qiladi. Ushbu maqolada keltirilgan amaliyotlar indekslarni yaratish uchun yaxshi qoidalardir. Ushbu usullarni qo'llaganingizdan so'ng, siz o'zingizning maxsus uskunangiz, xotirangiz va operatsion sharoitlaringiz ostida maxsus ilovangizni qayta sinovdan o'tkazishingiz kerak bo'ladi.

Yuqori mahsuldorlikka erishishning eng muhim usullaridan biri SQL Server indekslardan foydalanish hisoblanadi. Kitobdagi indeks sizga kerakli ma'lumotlarni tezda topishga yordam bergani kabi, indeks jadvaldagi ma'lumotlar qatorlariga tezkor kirishni ta'minlash orqali so'rov jarayonini tezlashtiradi. Ushbu maqolada men indekslar haqida qisqacha ma'lumot beraman SQL Server va ular ma'lumotlar bazasida qanday tashkil etilganligini va ma'lumotlar bazasi so'rovlarini tezlashtirishga qanday yordam berishini tushuntiring.

Indekslar jadval va ko'rish ustunlarida yaratiladi. Indekslar ushbu ustunlardagi qiymatlar asosida ma'lumotlarni tezda qidirish usulini ta'minlaydi. Misol uchun, agar siz birlamchi kalitda indeks yaratsangiz va keyin asosiy kalit qiymatlari yordamida ma'lumotlar qatorini qidirsangiz, u holda SQL Server avval indeks qiymatini topadi, so'ngra ma'lumotlarning butun qatorini tezda topish uchun indeksdan foydalanadi. Indekssiz, jadvaldagi barcha qatorlarni to'liq skanerlash amalga oshiriladi, bu esa ishlashga sezilarli ta'sir ko'rsatishi mumkin.
Jadval yoki ko'rinishdagi ko'pgina ustunlar bo'yicha indeks yaratishingiz mumkin. Istisno asosan katta ob'ektlarni saqlash uchun ma'lumotlar turlariga ega ustunlardir ( LOB), kabi tasvir, matn yoki varchar (maksimal). Bundan tashqari, ma'lumotlarni formatda saqlash uchun mo'ljallangan ustunlar bo'yicha indekslarni yaratishingiz mumkin XML, lekin bu indekslar standartlardan bir oz boshqacha tuzilgan va ularni ko'rib chiqish ushbu maqola doirasidan tashqarida. Bundan tashqari, maqola muhokama qilinmaydi ustunlar do'koni indekslar. Buning o'rniga, men ma'lumotlar bazalarida eng ko'p ishlatiladigan indekslarga e'tibor qarataman SQL Server.
Indeks daraxt tuzilishida tashkil etilgan sahifalar to'plamidan, indeks tugunlaridan iborat - muvozanatli daraxt. Ushbu struktura tabiatan ierarxik bo'lib, rasmda ko'rsatilganidek, ierarxiyaning yuqori qismidagi ildiz tugunidan va barg tugunlaridan, pastki qismidagi barglardan boshlanadi:


Indekslangan ustunni so'raganingizda, so'rov mexanizmi ildiz tugunining yuqori qismidan boshlanadi va oraliq tugunlar bo'ylab pastga tushadi, har bir oraliq qatlam ma'lumotlar haqida batafsil ma'lumotni o'z ichiga oladi. So'rov mexanizmi indeks barglari bilan pastki darajaga yetguncha indeks tugunlari bo'ylab harakatlanishni davom ettiradi. Misol uchun, agar siz indekslangan ustunda 123 qiymatini izlayotgan bo'lsangiz, so'rovlar tizimi avval sahifani ildiz darajasida birinchi oraliq darajada aniqlaydi. Bunday holda, birinchi sahifa 1 dan 100 gacha, ikkinchisi esa 101 dan 200 gacha bo'lgan qiymatga ishora qiladi, shuning uchun so'rovlar mexanizmi ushbu oraliq darajadagi ikkinchi sahifaga kirishadi. Keyin siz keyingi o'rta darajadagi uchinchi sahifaga o'tishingiz kerakligini ko'rasiz. Bu yerdan so'rovlar quyi tizimi indeksning qiymatini pastroq darajada o'qiydi. Indeks barglari indeks turiga qarab jadval ma'lumotlarining o'zini yoki oddiygina jadvaldagi ma'lumotlarga ega qatorlarga ko'rsatgichni o'z ichiga olishi mumkin: klasterli indeks yoki klastersiz indeks.

Klasterli indeks
Klasterli indeks indeks barglaridagi haqiqiy ma'lumotlar qatorlarini saqlaydi. Oldingi misolga qaytsak, bu 123 kalit qiymati bilan bog'liq bo'lgan ma'lumotlar qatori indeksning o'zida saqlanishini anglatadi. Klasterlangan indeksning muhim xususiyati shundaki, barcha qiymatlar ma'lum bir tartibda, o'sish yoki pasayish bo'yicha tartiblangan. Shuning uchun jadval yoki ko'rinish faqat bitta klasterli indeksga ega bo'lishi mumkin. Bundan tashqari, shuni ta'kidlash kerakki, jadvaldagi ma'lumotlar faqat ushbu jadvalda klasterlangan indeks yaratilgan bo'lsa, tartiblangan shaklda saqlanadi.
Klasterlangan indeksga ega bo'lmagan jadvalga to'p deyiladi.
Klasterli bo'lmagan indeks
Klasterlangan indeksdan farqli o'laroq, klasterli bo'lmagan indeks barglari faqat o'sha ustunlarni o'z ichiga oladi ( kalit) bu indeks aniqlanadi, shuningdek, jadvaldagi haqiqiy ma'lumotlarga ega qatorlarga ko'rsatgichni o'z ichiga oladi. Bu shuni anglatadiki, quyi so'rovlar tizimi kerakli ma'lumotlarni topish va olish uchun qo'shimcha operatsiyani talab qiladi. Ma'lumotlar ko'rsatgichining mazmuni ma'lumotlarning qanday saqlanishiga bog'liq: klasterlangan jadval yoki yig'ma. Agar ko'rsatgich klasterlangan jadvalga ishora qilsa, u haqiqiy ma'lumotlarni topish uchun ishlatilishi mumkin bo'lgan klasterli indeksga ishora qiladi. Agar ko'rsatgich to'pga ishora qilsa, u ma'lum bir ma'lumotlar qatori identifikatoriga ishora qiladi. Klasterlanmagan indekslarni klasterli indekslar kabi saralab bo'lmaydi, lekin siz jadval yoki ko'rinishda 999 gacha bo'lgan bir nechta klastersiz indeks yaratishingiz mumkin. Bu imkon qadar ko'proq indeks yaratishingiz kerak degani emas. Indekslar tizim ish faoliyatini yaxshilashi yoki yomonlashishi mumkin. Bir nechta klasterli bo'lmagan indekslarni yaratishga qo'shimcha ravishda siz qo'shimcha ustunlarni ham kiritishingiz mumkin ( kiritilgan ustun) indeksiga: indeks barglari nafaqat indekslangan ustunlarning qiymatini, balki ushbu indekslanmagan qo'shimcha ustunlarning qiymatlarini ham saqlaydi. Ushbu yondashuv sizga indeksga qo'yilgan ba'zi cheklovlarni chetlab o'tishga imkon beradi. Misol uchun, siz indekslanmaydigan ustunni qo'shishingiz yoki indeks uzunligi chegarasini chetlab o'tishingiz mumkin (ko'p hollarda 900 bayt).

Indeks turlari

Klasterli yoki klastersiz indeks bo'lishdan tashqari, u kompozit indeks, noyob indeks yoki qoplovchi indeks sifatida sozlanishi mumkin.
Kompozit indeks
Bunday indeks bir nechta ustunni o'z ichiga olishi mumkin. Indeksga 16 tagacha ustunni kiritishingiz mumkin, ammo ularning umumiy uzunligi 900 bayt bilan cheklangan. Ham klasterli, ham klasterli bo'lmagan indekslar kompozit bo'lishi mumkin.
Noyob indeks
Ushbu indeks indekslangan ustundagi har bir qiymat noyob bo'lishini ta'minlaydi. Agar indeks kompozit bo'lsa, unda noyoblik indeksning barcha ustunlariga tegishli bo'ladi, lekin har bir alohida ustunga emas. Misol uchun, agar siz ustunlarda noyob indeks yaratsangiz NAME Va FAMILIYA, keyin to'liq ism noyob bo'lishi kerak, lekin ism yoki familiyani takrorlash mumkin.
Ustun cheklovini belgilashda noyob indeks avtomatik ravishda yaratiladi: asosiy kalit yoki noyob qiymat cheklovi:
  • Asosiy kalit
    Bir yoki bir nechta ustunlarda asosiy kalit cheklovini aniqlaganingizda SQL Server Agar klasterli indeks ilgari yaratilmagan bo'lsa, avtomatik ravishda noyob klasterli indeksni yaratadi (bu holda, birlamchi kalitda noyob klasterli bo'lmagan indeks yaratiladi)
  • Qadriyatlarning o'ziga xosligi
    Qachonki siz qadriyatlarning o'ziga xosligi bo'yicha cheklovni aniqlasangiz SQL Server avtomatik ravishda noyob klasterli bo'lmagan indeksni yaratadi. Agar jadvalda hali hech qanday klasterli indeks yaratilmagan bo'lsa, noyob klasterli indeks yaratilishini belgilashingiz mumkin.
Qoplash indeksi
Bunday indeks ma'lum bir so'rovga jadvalning o'zi yozuvlariga qo'shimcha ruxsatsiz indeks barglaridan barcha kerakli ma'lumotlarni darhol olish imkonini beradi.

Indekslarni loyihalash

Indekslar qanchalik foydali bo'lishidan qat'iy nazar, ular ehtiyotkorlik bilan ishlab chiqilishi kerak. Indekslar katta disk maydonini egallashi mumkinligi sababli, keraklidan ko'proq indeks yaratishni xohlamaysiz. Bundan tashqari, ma'lumotlar qatorining o'zi yangilanganda indekslar avtomatik ravishda yangilanadi, bu esa qo'shimcha resurs yuki va ishlashning pasayishiga olib kelishi mumkin. Indekslarni loyihalashda ma'lumotlar bazasi va unga qarshi so'rovlar bilan bog'liq bir nechta fikrlarni hisobga olish kerak.
Malumotlar bazasi
Yuqorida aytib o'tilganidek, indekslar tizim ish faoliyatini yaxshilashi mumkin, chunki ular so'rovlar mexanizmini ma'lumotlarni topishning tezkor usuli bilan ta'minlaydi. Shu bilan birga, siz qanchalik tez-tez ma'lumotlarni kiritish, yangilash yoki o'chirishni rejalashtirayotganingizni ham hisobga olishingiz kerak. Ma'lumotlarni o'zgartirganda, indekslar ham ma'lumotlardagi tegishli harakatlarni aks ettirish uchun o'zgartirilishi kerak, bu tizim ish faoliyatini sezilarli darajada kamaytirishi mumkin. Indekslash strategiyangizni rejalashtirishda quyidagi ko'rsatmalarni ko'rib chiqing:
  • Tez-tez yangilanadigan jadvallar uchun iloji boricha kamroq indekslardan foydalaning.
  • Agar jadvalda katta hajmdagi maʼlumotlar boʻlsa, lekin oʻzgarishlar unchalik katta boʻlmasa, soʻrovlaringiz samaradorligini oshirish uchun kerak boʻlganda koʻproq indekslardan foydalaning. Biroq, indekslarni kichik jadvallarda ishlatishdan oldin yaxshilab o'ylab ko'ring, chunki... Ehtimol, indeksli qidiruvdan foydalanish barcha qatorlarni skanerlashdan ko'ra ko'proq vaqt talab qilishi mumkin.
  • Klasterlangan indekslar uchun maydonlarni iloji boricha qisqa tutishga harakat qiling. Eng yaxshi yondashuv - noyob qiymatlarga ega bo'lgan va NULLga ruxsat bermaydigan ustunlarda klasterli indeksdan foydalanish. Shuning uchun asosiy kalit ko'pincha klasterli indeks sifatida ishlatiladi.
  • Ustundagi qiymatlarning o'ziga xosligi indeksning ishlashiga ta'sir qiladi. Umuman olganda, ustunda qancha ko'p nusxalar bo'lsa, indeks shunchalik yomon ishlaydi. Boshqa tomondan, qanchalik noyob qiymatlar mavjud bo'lsa, indeksning ishlashi shunchalik yaxshi bo'ladi. Iloji boricha noyob indeksdan foydalaning.
  • Kompozit indeks uchun indeksdagi ustunlar tartibini hisobga oling. Ifodalarda ishlatiladigan ustunlar QAYERDA(masalan, WHERE Ismi = "Charli") indeksda birinchi bo'lishi kerak. Keyingi ustunlar qiymatlarining o'ziga xosligi asosida ro'yxatga olinishi kerak (eng ko'p noyob qiymatlarga ega ustunlar birinchi o'rinda turadi).
  • Agar ular ma'lum talablarga javob bersa, hisoblangan ustunlar bo'yicha indeksni ham belgilashingiz mumkin. Masalan, ustunning qiymatini olish uchun ishlatiladigan ifodalar deterministik bo'lishi kerak (ma'lum bir kirish parametrlari to'plami uchun har doim bir xil natijani qaytaring).
Ma'lumotlar bazasi so'rovlari
Indekslarni loyihalashda e'tiborga olinadigan yana bir narsa bu ma'lumotlar bazasiga qarshi qanday so'rovlar bajarilishi. Yuqorida aytib o'tilganidek, ma'lumotlar qanchalik tez-tez o'zgarishini hisobga olishingiz kerak. Bundan tashqari, quyidagi printsiplardan foydalanish kerak:
  • Bir nechta so'rovlarda emas, balki bitta so'rovda iloji boricha ko'proq qator qo'shishga yoki o'zgartirishga harakat qiling.
  • So'rovlaringizda qidiruv so'zlari sifatida tez-tez ishlatiladigan ustunlar bo'yicha klasterli bo'lmagan indeks yarating. QAYERDA va ulanishlar QO'SHILING.
  • To'liq qiymat mosliklari uchun qatorlarni qidirish so'rovlarida ishlatiladigan indekslash ustunlarini ko'rib chiqing.

Va endi, aslida:

Siz so'rashga xijolat bo'lgan SQL Serverdagi indekslar haqida 14 ta savol

Nima uchun jadvalda ikkita klasterli indeks bo'lishi mumkin emas?

Qisqa javobni xohlaysizmi? Klasterlangan indeks - bu jadval. Jadvalda klasterli indeks yaratganingizda, saqlash mexanizmi indeks ta'rifiga ko'ra jadvaldagi barcha qatorlarni o'sish yoki kamayish tartibida tartiblaydi. Klasterli indeks boshqa indekslar kabi alohida ob'ekt emas, balki jadvaldagi ma'lumotlarni saralash va ma'lumotlar qatorlariga tezkor kirishni osonlashtiradigan mexanizmdir.
Tasavvur qilaylik, sizda savdo operatsiyalari tarixini o'z ichiga olgan jadval mavjud. Savdo jadvali buyurtma identifikatori, buyurtmadagi mahsulot pozitsiyasi, mahsulot raqami, mahsulot miqdori, buyurtma raqami va sanasi va boshqalar kabi ma'lumotlarni o'z ichiga oladi. Ustunlarda klasterli indeks yaratasiz Buyurtma identifikatori Va LineID, quyida ko'rsatilganidek, o'sish tartibida tartiblangan T-SQL kod:
dbo.Sales (OrderID, LineID);
Ushbu skriptni ishga tushirganingizda, jadvaldagi barcha satrlar birinchi navbatda OrderID ustuni, so'ngra LineID bo'yicha jismonan tartiblanadi, lekin ma'lumotlarning o'zi bitta mantiqiy blokda, jadvalda qoladi. Shu sababli siz ikkita klasterli indeks yarata olmaysiz. Bitta ma'lumotga ega bo'lgan faqat bitta jadval bo'lishi mumkin va bu jadval faqat bir marta ma'lum tartibda saralanishi mumkin.

Agar klasterli jadval ko'p afzalliklarni ta'minlasa, nega to'pdan foydalanish kerak?

Siz haqsiz. Klasterli jadvallar ajoyib va ​​sizning so'rovlaringizning aksariyati klasterli indeksga ega jadvallarda yaxshiroq ishlaydi. Ammo ba'zi hollarda siz jadvallarni tabiiy, toza holatda qoldirishni xohlashingiz mumkin, ya'ni. to'p shaklida va so'rovlaringizni davom ettirish uchun faqat klasterli bo'lmagan indekslarni yarating.
Uyma, siz eslaganingizdek, ma'lumotlarni tasodifiy tartibda saqlaydi. Odatda, saqlash quyi tizimi ma'lumotlarni jadvalga kiritilgan tartibda qo'shadi, ammo saqlash quyi tizimi yanada samaraliroq saqlash uchun qatorlarni ko'chirishni ham yaxshi ko'radi. Natijada, ma'lumotlar qanday tartibda saqlanishini taxmin qilish imkoniyati yo'q.
Agar so'rovlar tizimi klasterlanmagan indeksdan foydalanmasdan ma'lumotlarni topishi kerak bo'lsa, u kerakli qatorlarni topish uchun jadvalni to'liq skanerdan o'tkazadi. Juda kichik stollarda bu odatda muammo emas, lekin to'plam hajmi oshgani sayin, unumdorlik tezda pasayadi. Albatta, klasterli bo'lmagan indeks kerakli ma'lumotlar saqlanadigan fayl, sahifa va qatorga ko'rsatgich yordamida yordam berishi mumkin - bu odatda jadvalni skanerlash uchun ancha yaxshi alternativ. Shunga qaramay, so'rovlar samaradorligini ko'rib chiqishda klasterli indeksning afzalliklarini solishtirish qiyin.
Biroq, to'p muayyan vaziyatlarda ishlashni yaxshilashga yordam beradi. Ko'p qo'shimchalar, lekin bir nechta yangilanishlar yoki o'chirishlar mavjud jadvalni ko'rib chiqing. Masalan, jurnalni saqlaydigan jadval, birinchi navbatda, arxivlanmaguncha qiymatlarni kiritish uchun ishlatiladi. Uyumda siz klasterli indeksdagi kabi paging va ma'lumotlarning parchalanishini ko'rmaysiz, chunki satrlar oddiygina uyum oxiriga qo'shiladi. Sahifalarni juda ko'p bo'lish unumdorlikka sezilarli ta'sir ko'rsatishi mumkin, lekin yaxshi emas. Umuman olganda, to'p sizga ma'lumotlarni nisbatan og'riqsiz kiritish imkonini beradi va siz klasterli indeks bilan bo'lgani kabi saqlash va texnik xizmat ko'rsatish xarajatlari bilan shug'ullanmaysiz.
Ammo ma'lumotlarni yangilash va o'chirishning etishmasligi yagona sabab deb hisoblanmasligi kerak. Ma'lumotlardan namuna olish usuli ham muhim omil hisoblanadi. Misol uchun, agar siz tez-tez ma'lumotlar diapazonini so'rasangiz yoki so'ragan ma'lumotlarni saralash yoki guruhlash kerak bo'lsa, siz yig'ishdan foydalanmasligingiz kerak.
Buning ma'nosi shundaki, siz faqat juda kichik jadvallar bilan ishlayotganingizda to'pdan foydalanishni o'ylab ko'rishingiz kerak yoki jadval bilan barcha o'zaro ta'siringiz ma'lumotlarni kiritish bilan cheklangan va sizning so'rovlaringiz juda oddiy (va siz klasterli bo'lmagan indekslardan foydalanmoqdasiz). nima bo'lganda ham). Aks holda, keng qoʻllaniladigan ustun kabi oddiy oʻsuvchi kalit maydonida aniqlangan kabi yaxshi moʻljallangan klasterli indeksni qoʻllang. Identifikatsiya.

Standart indeksni to'ldirish faktorini qanday o'zgartirish mumkin?

Standart indeksni to'ldirish omilini o'zgartirish bir narsadir. Standart nisbat qanday ishlashini tushunish boshqa masala. Lekin birinchi navbatda, bir necha qadam orqaga qayting. Indeksni to'ldirish omili yangi sahifani to'ldirishni boshlashdan oldin indeksni pastki darajada (barg darajasida) saqlash uchun sahifadagi bo'sh joy miqdorini aniqlaydi. Misol uchun, agar koeffitsient 90 ga o'rnatilgan bo'lsa, unda indeks o'sganda, u sahifaning 90% ni egallaydi va keyin keyingi sahifaga o'tadi.
Odatiy bo'lib, indeksni to'ldirish omili qiymati o'rnatilgan SQL Server 0, bu 100 bilan bir xil. Natijada, kodingizda tizim standart qiymatidan farqli qiymatni aniq belgilamaguningizcha yoki standart xatti-harakatni o'zgartirmasangiz, barcha yangi indekslar avtomatik ravishda ushbu sozlamani meros qilib oladi. foydalanishingiz mumkin SQL Server boshqaruv studiyasi standart qiymatni sozlash yoki tizimda saqlangan protsedurani ishga tushirish sp_configure. Masalan, quyidagi to'plam T-SQL buyrug'i koeffitsient qiymatini 90 ga o'rnatadi (avval siz kengaytirilgan sozlamalar rejimiga o'tishingiz kerak):
EXEC sp_configure "kengaytirilgan variantlarni ko'rsatish", 1; QAYTA SOZLASHGA O'TISH; GO EXEC sp_configure "to'ldirish omili", 90; QAYTA SOZLASHGA O'TISH; BOSH
Indeksni to'ldirish omili qiymatini o'zgartirgandan so'ng, xizmatni qayta ishga tushirishingiz kerak SQL Server. Endi siz sp_configure-ni ko'rsatilgan ikkinchi argumentsiz ishga tushirish orqali o'rnatilgan qiymatni tekshirishingiz mumkin:
EXEC sp_configure "to'ldirish omili" GO
Bu buyruq 90 qiymatini qaytarishi kerak. Natijada, barcha yangi yaratilgan indekslar ushbu qiymatdan foydalanadi. Buni indeks yaratish va to'ldirish omili qiymatini so'rash orqali sinab ko'rishingiz mumkin:
AdventureWorks2012 dan foydalaning; -- ma'lumotlar bazangiz KLASLI BO'LMAYDIGAN INDEKSI YARATING ix_people_lastname ON Person.Person(LastName); sys.indexes FROM fill_factor TANLOVGA O'TING QERDA object_id = object_id("Person.Person") AND name="ix_people_lastname";
Ushbu misolda biz jadvalda klasterli bo'lmagan indeks yaratdik Shaxs ma'lumotlar bazasida AdventureWorks 2012. Indeksni yaratgandan so'ng, biz sys.indexes tizim jadvallaridan to'ldirish omili qiymatini olishimiz mumkin. So'rov 90 ni qaytarishi kerak.
Tasavvur qilaylik, biz indeksni o'chirib tashladik va uni qayta yaratdik, ammo endi biz to'ldirish omilining aniq qiymatini belgilab oldik:
Shaxs.Shaxs(Familiya) BILAN (fillfactor=80); sys.indexes FROM fill_factor TANLOVGA O'TING QERDA object_id = object_id("Person.Person") AND name="ix_people_lastname";
Bu safar biz ko'rsatmalarni qo'shdik BILAN va variant to'ldiruvchi indeks yaratish operatsiyamiz uchun INDEKS YARATING va qiymatni ko'rsatdi 80. Operator TANLASH endi tegishli qiymatni qaytaradi.
Hozirgacha hamma narsa juda oddiy edi. Agar siz ushbu qiymatni bilsangiz, standart koeffitsient qiymatidan foydalanadigan indeks yaratsangiz, bu jarayonda chindan ham kuyishingiz mumkin. Misol uchun, kimdir server sozlamalari bilan shug'ullanadi va shunchalik o'jarlik qiladiki, ular indeksni to'ldirish koeffitsientini 20 ga qo'yishadi. Shu bilan birga, siz standart qiymat 0 deb hisoblab, indekslarni yaratishda davom etasiz. Afsuski, to'ldirishni bilishning iloji yo'q. indeks yaratmaguningizcha faktorni qo'ying va keyin misollarimizda bo'lgani kabi qiymatni tekshiring. Aks holda, so'rovlar unumdorligi shunchalik pasaygan vaqtni kutishingiz kerak bo'ladi, shunda siz biror narsadan shubhalana boshlaysiz.
Siz bilishingiz kerak bo'lgan yana bir muammo - indekslarni qayta tiklash. Indeks yaratishda bo'lgani kabi, uni qayta tiklashda indeksni to'ldirish omili qiymatini belgilashingiz mumkin. Biroq, indeks yaratish buyrug'idan farqli o'laroq, rebuild qanday ko'rinishiga qaramay, serverning standart sozlamalaridan foydalanmaydi. Bundan ham ko'proq, agar siz indeksni to'ldirish omili qiymatini aniq belgilamasangiz, unda SQL Server ushbu indeks uni qayta tuzishdan oldin mavjud bo'lgan koeffitsient qiymatidan foydalanadi. Masalan, quyidagi operatsiya ALTER INDEX biz yaratgan indeksni qayta tiklaydi:
ALTER INDEX ix_people_lastname ON Person.Person QAYTA QILISh; sys.indexes FROM fill_factor TANLOVGA O'TING QERDA object_id = object_id("Person.Person") AND name="ix_people_lastname";
To'ldirish omili qiymatini tekshirganimizda, biz 80 qiymatiga ega bo'lamiz, chunki biz indeksni oxirgi marta yaratganimizda shuni ko'rsatdik. Standart qiymat e'tiborga olinmaydi.
Ko'rib turganingizdek, indeksni to'ldirish omili qiymatini o'zgartirish unchalik qiyin emas. Joriy qiymatni bilish va qachon qo'llanilishini tushunish ancha qiyin. Agar siz indekslarni yaratish va qayta tiklashda har doim koeffitsientni aniq belgilab qo'ysangiz, unda siz har doim aniq natijani bilasiz. Agar boshqa birov server sozlamalarini qayta buzmasligiga ishonch hosil qilish haqida tashvishlanmasangiz, bu barcha indekslarni kulgili darajada past indeksni to'ldirish omili bilan qayta tiklashga olib keladi.

Dublikatlarni o'z ichiga olgan ustunda klasterli indeks yaratish mumkinmi?

Ha va yo'q. Ha, takroriy qiymatlarni o'z ichiga olgan kalit ustunida klasterli indeks yaratishingiz mumkin. Yo'q, kalit ustunining qiymati noyob bo'lmagan holatda qolishi mumkin emas. Keling, tushuntiraman. Agar siz ustunda noyob bo'lmagan klasterli indeks yaratsangiz, saqlash mexanizmi noyoblikni ta'minlash va shuning uchun klasterlangan jadvaldagi har bir qatorni aniqlay olish uchun takroriy qiymatga birlashtiruvchi qo'shadi.
Misol uchun, siz mijozlar ma'lumotlarini o'z ichiga olgan ustunda klasterli indeks yaratishga qaror qilishingiz mumkin Familiya familiyani saqlash. Ustunda Franklin, Xankok, Vashington va Smit qiymatlari mavjud. Keyin yana Adams, Xankok, Smit va Smit qiymatlarini kiritasiz. Ammo kalit ustunining qiymati noyob bo'lishi kerak, shuning uchun saqlash mexanizmi dublikatlarning qiymatini o'zgartiradi, shunda ular shunday ko'rinadi: Adams, Franklin, Hancock, Hancock1234, Vashington, Smit, Smith4567 va Smith5678.
Bir qarashda, bu yondashuv yaxshi ko'rinadi, ammo butun son kalitning hajmini oshiradi, agar ko'p sonli dublikatlar mavjud bo'lsa, muammo bo'lishi mumkin va bu qiymatlar klasterlanmagan indeks yoki xorijiy indeksning asosi bo'ladi. asosiy havola. Shu sabablarga ko'ra, imkon qadar har doim noyob klasterli indekslarni yaratishga harakat qilishingiz kerak. Agar buning iloji bo'lmasa, hech bo'lmaganda juda yuqori noyob qiymatga ega bo'lgan ustunlardan foydalanishga harakat qiling.

Agar klasterli indeks yaratilmagan bo'lsa, jadval qanday saqlanadi?

SQL Server ikki turdagi jadvallarni qo'llab-quvvatlaydi: klasterli indeksga ega bo'lgan klasterli jadvallar va yig'ma jadvallar yoki shunchaki uyumlar. Klasterlangan jadvallardan farqli o'laroq, to'pdagi ma'lumotlar hech qanday tarzda tartiblanmaydi. Aslida, bu ma'lumotlar to'plamidir. Agar siz bunday jadvalga qator qo'shsangiz, saqlash mexanizmi uni shunchaki sahifaning oxiriga qo'shib qo'yadi. Sahifa ma'lumotlar bilan to'ldirilganda, u yangi sahifaga qo'shiladi. Ko'pgina hollarda, tartiblash va so'rov tezligidan foydalanish uchun jadvalda klasterli indeks yaratishni xohlaysiz (tartiblanmagan manzillar kitobidan telefon raqamini qidirib ko'ring). Biroq, agar siz klasterli indeks yaratmaslikni tanlasangiz, siz baribir uyumda klasterli bo'lmagan indeks yaratishingiz mumkin. Bunday holda, har bir indeks satrida to'p qatoriga ko'rsatgich bo'ladi. Indeks fayl identifikatorini, sahifa raqamini va ma'lumotlar qatori raqamini o'z ichiga oladi.

Qiymatning yagonaligi cheklovlari va jadval indekslari bilan birlamchi kalit o'rtasida qanday bog'liqlik bor?

Birlamchi kalit va noyob cheklov ustundagi qiymatlarning yagona bo'lishini ta'minlaydi. Jadval uchun faqat bitta asosiy kalit yaratishingiz mumkin va u qiymatlarni o'z ichiga olmaydi NULL. Jadval uchun qiymatning o'ziga xosligi bo'yicha bir nechta cheklovlar yaratishingiz mumkin va ularning har biri bitta yozuvga ega bo'lishi mumkin NULL.
Birlamchi kalitni yaratganingizda, agar klasterli indeks hali yaratilmagan bo'lsa, saqlash mexanizmi noyob klasterli indeksni ham yaratadi. Biroq, siz standart xatti-harakatni bekor qilishingiz mumkin va klasterli bo'lmagan indeks yaratiladi. Agar siz asosiy kalitni yaratganingizda klasterli indeks mavjud bo'lsa, noyob klastersiz indeks yaratiladi.
Noyob cheklovni yaratganingizda, saqlash mexanizmi noyob, klastersiz indeks yaratadi. Biroq, agar ilgari yaratilmagan bo'lsa, noyob klasterli indeks yaratishni belgilashingiz mumkin.
Umuman olganda, noyob qiymat cheklovi va noyob indeks bir xil narsadir.

Nima uchun SQL Serverda klasterli va klasterli bo'lmagan indekslar B-daraxt deb ataladi?

SQL Serverdagi klasterli yoki klasterli bo'lmagan asosiy indekslar indeks tugunlari deb ataladigan sahifalar to'plami bo'ylab taqsimlanadi. Ushbu sahifalar muvozanatli daraxt deb ataladigan daraxt tuzilishi bilan ma'lum bir ierarxiyada tashkil etilgan. Yuqori sathda ildiz tugunlari, pastki qismida barg tugunlari joylashgan bo'lib, rasmda ko'rsatilganidek, yuqori va pastki darajalar orasidagi oraliq tugunlar mavjud:


Ildiz tugun indeks orqali ma'lumotlarni olishga urinayotgan so'rovlar uchun asosiy kirish nuqtasini ta'minlaydi. Ushbu tugundan boshlab, so'rovlar mexanizmi ma'lumotlarni o'z ichiga olgan tegishli barg tuguniga ierarxik tuzilma bo'ylab navigatsiyani boshlaydi.
Misol uchun, 82 kalit qiymatini o'z ichiga olgan qatorlarni tanlash uchun so'rov olinganligini tasavvur qiling. So'rovlar quyi tizimi mos oraliq tugunga ishora qiluvchi ildiz tugunidan ishlay boshlaydi, bizning holatlarimizda 1-100. 1-100 oraliq tugundan 51-100 tugunga, u yerdan esa 76-100 yakuniy tugunga o'tish sodir bo'ladi. Agar bu klasterlangan indeks bo'lsa, u holda tugun bargi 82 ga teng kalit bilan bog'langan qator ma'lumotlarini o'z ichiga oladi. Agar bu klasterli bo'lmagan indeks bo'lsa, unda indeks bargi klasterlangan jadvalga ko'rsatgichni yoki ma'lum bir qatorni o'z ichiga oladi. uyum.

Agar siz ushbu indeks tugunlarini kesib o'tishingiz kerak bo'lsa, indeks qanday qilib so'rovlar samaradorligini oshirishi mumkin?

Birinchidan, indekslar har doim ham ishlashni yaxshilamaydi. Juda ko'p noto'g'ri yaratilgan indekslar tizimni botqoqqa aylantiradi va so'rovlar samaradorligini pasaytiradi. Agar indekslar ehtiyotkorlik bilan qo'llanilsa, ular sezilarli samaradorlikni ta'minlashi mumkinligini aytish to'g'riroq.
Ishlashni sozlashga bag'ishlangan ulkan kitobni o'ylab ko'ring SQL Server(qog'oz versiyasi, elektron variant emas). Tasavvur qiling, siz Resurs boshqaruvchisini sozlash haqida ma'lumot topmoqchisiz. Siz barmog'ingizni butun kitob bo'ylab sahifama-sahifa sudrab o'tishingiz yoki mundarijani ochib, siz qidirayotgan ma'lumotlar bilan aniq sahifa raqamini topishingiz mumkin (agar kitob to'g'ri indekslangan bo'lsa va mazmuni to'g'ri indekslarga ega bo'lsa). Bu, albatta, sizga sezilarli vaqtni tejaydi, garchi siz asosiy tuzilmadan (kitobdan) kerakli ma'lumotlarni olish uchun avval butunlay boshqa tuzilmaga (indeksga) kirishingiz kerak bo'lsa ham.
Kitob indeksi, indeks kabi SQL Server jadvaldagi barcha ma'lumotlarni to'liq skanerlash o'rniga kerakli ma'lumotlar bo'yicha aniq so'rovlarni bajarishga imkon beradi. Kichkina jadvallar uchun to'liq skanerlash odatda muammo emas, lekin katta jadvallar ma'lumotlarning ko'p sahifalarini egallaydi, bu esa so'rovlar mexanizmiga ma'lumotlarning to'g'ri joylashuvini darhol olish imkonini beradigan indeks mavjud bo'lmasa, so'rovni bajarish vaqtini sezilarli darajada oshirishi mumkin. Tasavvur qiling-a, yirik megapolis oldidagi ko‘p qavatli yo‘l chorrahasida xaritasiz adashib qolganingizni tasavvur qiling va siz bu fikrni tushunasiz.

Agar indekslar juda zo'r bo'lsa, nega har bir ustunda bittadan yaratmaslik kerak?

Hech bir yaxshilik jazosiz qolmasligi kerak. Hech bo'lmaganda indekslar bilan shunday bo'ladi. Albatta, operator olish so'rovlarini bajarsangiz, indekslar yaxshi ishlaydi TANLASH, lekin operatorlarga tez-tez qo'ng'iroqlar boshlanishi bilanoq KIRITMOQ, YANGILANISH Va OʻCHIRISH, shuning uchun landshaft juda tez o'zgaradi.
Operator tomonidan ma'lumotlar so'rovini boshlaganingizda TANLASH, so'rovlar mexanizmi indeksni topadi, daraxt tuzilishi bo'ylab harakatlanadi va izlayotgan ma'lumotlarni topadi. Nima oddiyroq bo'lishi mumkin? Agar siz kabi o'zgartirish bayonotini boshlasangiz, hamma narsa o'zgaradi YANGILANISH. Ha, bayonotning birinchi qismida so'rovlar tizimi o'zgartirilayotgan qatorni aniqlash uchun yana indeksdan foydalanishi mumkin - bu yaxshi yangilik. Va agar asosiy ustunlardagi o'zgarishlarga ta'sir qilmaydigan ketma-ket ma'lumotlarning oddiy o'zgarishi bo'lsa, unda o'zgartirish jarayoni butunlay og'riqsiz bo'ladi. Ammo agar o'zgarish ma'lumotlarni o'z ichiga olgan sahifalarning bo'linishiga olib kelsa yoki kalit ustunning qiymati o'zgartirilib, uni boshqa indeks tuguniga ko'chirsa nima bo'ladi - bu indeks barcha bog'langan indekslar va operatsiyalarga ta'sir qiladigan qayta tashkil etishni talab qilishi mumkin. , natijada hosildorlikning keng tarqalgan pasayishiga olib keladi.
Operatorga qo'ng'iroq qilishda shunga o'xshash jarayonlar sodir bo'ladi OʻCHIRISH. Indeks o'chirilayotgan ma'lumotlarning joylashishini aniqlashga yordam beradi, ammo ma'lumotlarni o'chirish sahifani o'zgartirishga olib kelishi mumkin. Operator haqida KIRITMOQ, barcha indekslarning asosiy dushmani: siz katta hajmdagi ma'lumotlarni qo'sha boshlaysiz, bu indekslarning o'zgarishiga va ularning qayta tashkil etilishiga olib keladi va hamma azoblanadi.
Shunday qilib, qaysi turdagi indekslarni va qanchasini yaratish haqida o'ylashda ma'lumotlar bazasiga so'rovlar turlarini ko'rib chiqing. Ko'proq yaxshi degani emas. Jadvalga yangi indeks qo'shishdan oldin, nafaqat asosiy so'rovlarning narxini, balki boshqa operatsiyalarda domino effektiga olib kelishi mumkin bo'lgan iste'mol qilingan disk maydoni miqdorini, funksionallikni saqlash xarajatlarini va indekslarni ham hisobga oling. Indeksni loyihalash strategiyangiz amalga oshirishingizning eng muhim jihatlaridan biri bo'lib, indeks o'lchamidan, noyob qiymatlar sonidan indeks qo'llab-quvvatlaydigan so'rovlar turiga qadar ko'plab fikrlarni o'z ichiga olishi kerak.

Birlamchi kalitga ega ustunda klasterli indeks yaratish kerakmi?

Kerakli shartlarga javob beradigan har qanday ustunda klasterli indeks yaratishingiz mumkin. To'g'ri, klasterlangan indeks va asosiy kalit cheklovi bir-biri uchun yaratilgan va osmonda yaratilgan moslikdir, shuning uchun birlamchi kalitni yaratganingizda, klasterli indeks avtomatik ravishda yaratilishini tushuning. oldin yaratilgan. Biroq, siz klasterli indeks boshqa joyda yaxshiroq ishlashiga qaror qilishingiz mumkin va ko'pincha qaroringiz oqlanadi.
Klasterlangan indeksning asosiy maqsadi indeksni belgilashda ko'rsatilgan asosiy ustun asosida jadvalingizdagi barcha qatorlarni tartiblashdir. Bu tez qidirish va jadval ma'lumotlariga oson kirish imkonini beradi.
Jadvalning asosiy kaliti yaxshi tanlov bo'lishi mumkin, chunki u qo'shimcha ma'lumotlar qo'shmasdan jadvallardagi har bir qatorni noyob tarzda aniqlaydi. Ba'zi hollarda, eng yaxshi tanlov surrogat asosiy kalit bo'ladi, u nafaqat noyob, balki kichik o'lchamli va qiymatlari ketma-ket o'sib boradi, bu qiymatga asoslangan klastersiz indekslarni yanada samarali qiladi. So'rovlarni optimallashtiruvchi klasterli indeks va asosiy kalitning bu kombinatsiyasini ham yaxshi ko'radi, chunki jadvallarni birlashtirish asosiy kalit va unga bog'langan klasterli indeksdan foydalanmaydigan boshqa usulda qo'shilishdan ko'ra tezroq. Aytganimdek, bu gugurt osmonda qilingan.
Va nihoyat, shuni ta'kidlash joizki, klasterli indeksni yaratishda bir nechta jihatlarni hisobga olish kerak: uning asosida qancha klasterli bo'lmagan indekslar bo'ladi, asosiy indeks ustunining qiymati qanchalik tez-tez o'zgaradi va qanchalik katta. Klasterlangan indeks ustunlaridagi qiymatlar o'zgarganda yoki indeks kutilganidek ishlamasa, jadvaldagi barcha boshqa indekslarga ta'sir qilishi mumkin. Klasterlangan indeks qiymatlari ma'lum bir tartibda ortadi, lekin tasodifiy o'zgarmaydigan eng barqaror ustunga asoslanishi kerak. Indeks jadvalning eng ko'p foydalaniladigan ma'lumotlariga qarshi so'rovlarni qo'llab-quvvatlashi kerak, shuning uchun so'rovlar ma'lumotlarning tartiblanganligi va indeks barglarida ildiz tugunlarida foydalanish mumkinligidan to'liq foydalanadi. Agar asosiy kalit ushbu stsenariyga mos kelsa, undan foydalaning. Agar yo'q bo'lsa, boshqa ustunlar to'plamini tanlang.

Ko'rinishni indekslasangiz nima bo'ladi, u hali ham ko'rinishmi?

Ko'rinish - bu bir yoki bir nechta jadvallardan ma'lumotlarni hosil qiluvchi virtual jadval. Asosan, bu ko'rinishni so'raganingizda asosiy jadvallardan ma'lumotlarni oladigan nomli so'rovdir. Ushbu ko'rinishda klasterli indeks va klasterli bo'lmagan indekslarni yaratish orqali so'rovlar unumdorligini oshirishingiz mumkin, xuddi jadvalda indekslarni yaratish usuliga o'xshash, lekin asosiy ogohlantirish shundaki, siz avval klasterli indeks yaratasiz, keyin esa klastersiz indeks yaratishingiz mumkin.
Indekslangan ko'rinish (materiallashtirilgan ko'rinish) yaratilganda, ko'rinish ta'rifining o'zi alohida ob'ekt bo'lib qoladi. Axir, bu faqat qattiq kodlangan operator TANLASH, ma'lumotlar bazasida saqlanadi. Ammo indeks butunlay boshqacha hikoya. Provayderda klasterli yoki klasterli bo'lmagan indeks yaratganingizda, ma'lumotlar oddiy indeks kabi jismoniy ravishda diskda saqlanadi. Bundan tashqari, asosiy jadvallardagi ma'lumotlar o'zgarganda, ko'rinish indeksi avtomatik ravishda o'zgaradi (bu siz tez-tez o'zgarib turadigan jadvallardagi ko'rinishlarni indekslashdan qochishingiz mumkinligini anglatadi). Qanday bo'lmasin, ko'rinish ko'rinish bo'lib qoladi - jadvallar ko'rinishi, lekin ayni paytda bajarilgan, unga mos keladigan indekslar bilan.
Ko'rinishda indeks yaratishdan oldin u bir nechta cheklovlarga javob berishi kerak. Misol uchun, ko'rinish faqat asosiy jadvallarga murojaat qilishi mumkin, lekin boshqa ko'rinishlarga emas, va bu jadvallar bir xil ma'lumotlar bazasida bo'lishi kerak. Aslida boshqa ko'plab cheklovlar mavjud, shuning uchun hujjatlarni tekshirib ko'ring SQL Server barcha iflos tafsilotlar uchun.

Nima uchun kompozit indeks o'rniga qoplama indeksidan foydalanish kerak?

Birinchidan, keling, ikkalasi orasidagi farqni tushunganimizga ishonch hosil qilaylik. Murakkab indeks oddiy indeks bo'lib, unda bir nechta ustunlar mavjud. Jadvaldagi har bir satr noyob bo'lishini ta'minlash uchun bir nechta kalit ustunlaridan foydalanish mumkin yoki siz asosiy kalit noyob bo'lishini ta'minlash uchun bir nechta ustunlarga ega bo'lishingiz mumkin yoki siz bir nechta ustunlarda tez-tez chaqiriladigan so'rovlarning bajarilishini optimallashtirishga harakat qilayotgan bo'lishingiz mumkin. Umuman olganda, indeks qancha ko'p asosiy ustunlarni o'z ichiga olsa, indeks shunchalik kam samarali bo'ladi, ya'ni kompozit indekslardan oqilona foydalanish kerak.
Yuqorida aytib o'tilganidek, agar barcha kerakli ma'lumotlar indeksning o'zi kabi darhol indeks barglarida joylashgan bo'lsa, so'rov katta foyda keltirishi mumkin. Bu klasterli indeks uchun muammo emas, chunki barcha ma'lumotlar allaqachon mavjud (shuning uchun klasterli indeks yaratishda ehtiyotkorlik bilan o'ylash juda muhim). Lekin barglardagi klasterli bo'lmagan indeks faqat asosiy ustunlarni o'z ichiga oladi. Boshqa barcha ma'lumotlarga kirish uchun so'rovlar optimallashtiruvchisi qo'shimcha qadamlarni talab qiladi, bu esa so'rovlaringizni bajarish uchun katta xarajatlarni qo'shishi mumkin.
Bu erda qoplama indeksi yordamga keladi. Klastersiz indeksni aniqlaganingizda, kalit ustunlaringizga qo'shimcha ustunlarni belgilashingiz mumkin. Masalan, sizning ilovangiz ustun ma'lumotlarini tez-tez so'raydi deylik Buyurtma identifikatori Va Buyurtma sanasi jadvalda Sotish:
Buyurtma identifikatori, Buyurtma sanasini sotuvdan TANGLASH QERDA Buyurtma ID = 12345;
Siz ikkala ustunda klasterli bo'lmagan murakkab indeks yaratishingiz mumkin, ammo OrderDate ustuni, ayniqsa foydali kalit ustuni bo'lmasdan, faqat indeksni saqlash uchun qo'shimcha xarajatlarni qo'shadi. Eng yaxshi yechim kalit ustunida qoplama indeksini yaratish bo'ladi Buyurtma identifikatori va qo'shimcha ravishda kiritilgan ustun Buyurtma sanasi:
IX_orderid ON KLASTER BO'LMAGAN INDEKSINI YARATING. Sotish(Buyurtma identifikatori) QO'SHLASH (Buyurtma sanasi);
Bu so'rovlarni bajarishda ma'lumotlarni barglarda saqlash afzalliklarini saqlab qolgan holda, ortiqcha ustunlarni indekslashning kamchiliklaridan qochadi. Kiritilgan ustun kalitning bir qismi emas, lekin ma'lumotlar barg tugunida, indeks bargida saqlanadi. Bu qo'shimcha xarajatlarsiz so'rovlar samaradorligini oshirishi mumkin. Bundan tashqari, qoplama indeksiga kiritilgan ustunlar indeksning asosiy ustunlariga qaraganda kamroq cheklovlarga ega.

Kalit ustundagi dublikatlar soni muhimmi?

Indeks yaratganingizda, kalit ustunlaringizdagi dublikatlar sonini kamaytirishga harakat qilishingiz kerak. Yoki aniqrog'i: takrorlash tezligini iloji boricha pastroq saqlashga harakat qiling.
Agar siz kompozit indeks bilan ishlayotgan bo'lsangiz, u holda takrorlash butun asosiy ustunlar uchun amal qiladi. Bitta ustun ko'plab takroriy qiymatlarni o'z ichiga olishi mumkin, ammo barcha indeks ustunlari orasida takrorlanish minimal bo'lishi kerak. Misol uchun, siz ustunlarda klastersiz birikma indeks yaratasiz Ism Va Familiya, siz ko'p Jon Doe qiymatlariga va ko'plab Doe qiymatlariga ega bo'lishingiz mumkin, lekin siz Jon Doe qiymatining iloji boricha kamroq yoki faqat bitta Jon Doe qiymatiga ega bo'lishni xohlaysiz.
Kalit ustun qiymatlarining o'ziga xoslik nisbati indeks selektivligi deb ataladi. Qanchalik noyob qiymatlar mavjud bo'lsa, selektivlik shunchalik yuqori bo'ladi: noyob indeks mumkin bo'lgan eng katta selektivlikka ega. So'rovlar mexanizmi yuqori selektivlik qiymatlariga ega ustunlarni juda yaxshi ko'radi, ayniqsa bu ustunlar sizning eng tez-tez bajariladigan so'rovlaringizning WHERE bandlariga kiritilgan bo'lsa. Indeks qanchalik tanlangan bo'lsa, so'rovlar mexanizmi natijada olingan ma'lumotlar to'plamining hajmini tezroq kamaytirishi mumkin. Salbiy tomoni shundaki, nisbatan kam noyob qiymatlarga ega ustunlar kamdan-kam hollarda indeksatsiya uchun yaxshi nomzod bo'ladi.

Klasterli bo'lmagan indeksni faqat asosiy ustun ma'lumotlarining ma'lum bir kichik to'plamida yaratish mumkinmi?

Odatiy bo'lib, klastersiz indeks jadvaldagi har bir satr uchun bitta qatorni o'z ichiga oladi. Albatta, bunday indeksni jadval deb hisoblasak, klasterli indeks haqida ham xuddi shunday deyish mumkin. Ammo klasterli bo'lmagan indeks haqida gap ketganda, birma-bir munosabatlar muhim tushunchadir, chunki versiyadan boshlab SQL Server 2008, sizda unga kiritilgan qatorlarni cheklovchi filtrlanadigan indeks yaratish imkoniyati mavjud. Filtrlangan indeks so'rovlar samaradorligini oshirishi mumkin, chunki... u o'lchami kichikroq va barcha jadvallarga qaraganda filtrlangan, aniqroq statistikani o'z ichiga oladi - bu yaxshilangan ijro rejalarini yaratishga olib keladi. Filtrlangan indeks, shuningdek, kamroq saqlash joyini va kamroq texnik xarajatlarni talab qiladi. Indeks faqat filtrga mos keladigan ma'lumotlar o'zgarganda yangilanadi.
Bundan tashqari, filtrlanadigan indeksni yaratish oson. Operatorda INDEKS YARATING faqat ko'rsatishingiz kerak QAYERDA filtr holati. Masalan, kodda ko'rsatilganidek, indeksdan NULL o'z ichiga olgan barcha qatorlarni filtrlashingiz mumkin:
Sales.SalesOrderDetail (CarrierTrackingNumber) NON KLASTER BO'LMAGAN INDEKSI ix_trackingnumber YARATING.
Biz, aslida, muhim so'rovlarda muhim bo'lmagan har qanday ma'lumotlarni filtrlashimiz mumkin. Ammo ehtiyot bo'ling, chunki ... SQL Server ko'rinishda filtrlanadigan indeks yaratish imkoni yo'qligi kabi filtrlanadigan indekslarga bir nechta cheklovlar qo'yadi, shuning uchun hujjatlarni diqqat bilan o'qing.
Indekslangan ko'rinish yaratish orqali siz shunga o'xshash natijalarga erishishingiz mumkin. Biroq, filtrlangan indeks bir qancha afzalliklarga ega, masalan, texnik xizmat ko'rsatish xarajatlarini kamaytirish va ijro rejalaringiz sifatini yaxshilash. Filtrlangan indekslarni onlayn tarzda qayta tiklash ham mumkin. Buni indekslangan ko'rinish bilan sinab ko'ring.

Va yana bir oz tarjimondan

Ushbu tarjimaning Xabrahabr sahifalarida paydo bo'lishidan maqsad SimpleTalk blogi haqida aytib berish yoki eslatish edi. RedGate.
U ko'plab qiziqarli va qiziqarli postlarni nashr etadi.
Men hech qanday kompaniya mahsulotlariga aloqador emasman RedGate, na ularning savdosi bilan.

Va'da qilinganidek, ko'proq bilishni istaganlar uchun kitoblar
Men o'zimdan uchta juda yaxshi kitobni tavsiya qilaman (havolalar yondirmoq do'kondagi versiyalar Amazon):

Asos sifatida siz oddiy indekslarni ochishingiz mumkin
  • yangi boshlanuvchilar uchun
  • indeks
  • Teglar qo'shing
    Microsoft SQL Server 2012 T-SQL asoslari (ishlab chiquvchi uchun ma'lumotnoma)
    Muallif Itzik Ben-Gan
    Nashr qilingan sana: 2012 yil 15 iyul
    O'z ishining ustasi bo'lgan muallif ma'lumotlar bazalari bilan ishlash bo'yicha asosiy bilimlarni beradi.
    Agar siz hamma narsani unutgan bo'lsangiz yoki hech qachon bilmagan bo'lsangiz, albatta o'qishga arziydi.

    ROWID indekslari jadval ustunidagi barcha qiymatlarni, shuningdek, ustun qiymatlarini o'z ichiga olgan jadvaldagi barcha satrlarning ROWIDlarini ko'rsatishni ta'minlaydigan ma'lumotlar bazasi ob'ektlari.

    ROWID jadvaldagi satr uchun noyob identifikator bo'lgan soxta ustun bo'lib, aslida ushbu qatorning aniq jismoniy joylashuvini tavsiflaydi. Ushbu ma'lumotlarga asoslanib Oracle keyinchalik jadval qatori bilan bog'liq ma'lumotlarni topishi mumkin. Har safar satr ko'chirilganda, eksport qilinganda, import qilinganda yoki uning joylashuvini o'zgartiradigan boshqa har qanday operatsiyada ROWID chiziq, chunki u boshqa jismoniy pozitsiyani egallaydi. Ma'lumotlarni saqlash uchun ROWID 80 bit (10 bayt) talab qilinadi. Identifikatorlar ROWID to'rtta komponentdan iborat: ob'ekt raqami (32 bit), nisbiy fayl raqami (10 bit), blok raqami (22 bit) va qator raqami (16 bit). Ushbu identifikatorlar ma'lumotlar bazasidagi ma'lumotlarning joylashishini ko'rsatadigan 18 ta belgidan iborat ketma-ketliklar sifatida ko'rsatiladi, har bir belgi A-Z, a-z, 0-9, + va / belgilaridan iborat baza-64 formatida ifodalanadi. Birinchi oltita belgi ma'lumotlar obyekti raqami, keyingi uchtasi nisbiy fayl raqami, keyingi oltitasi blok raqami va oxirgi uchtasi qator raqamidir.

    Misol:

    SELECT fam, ROWID Talabadan;

    FAM ROWID

    ——————————————

    IVANOV AAAA3kAAGAAAAGsAAA

    PETROV AAAA3kAAGAAAAGsAAB

    Ma'lumotlar bazasida Oracle indekslar turli maqsadlarda qo'llaniladi: ma'lumotlar bazasidagi qiymatlarning o'ziga xosligini ta'minlash, jadvaldagi yozuvlarni qidirish samaradorligini oshirish va hokazo. Ishlash qidiruv mezonlariga indekslangan ustun yoki ustunlarga havolani kiritish orqali yaxshilanadi. Jadvaldagi ma'lumotlar uchun. IN Oracle indekslar UZUN ustunlardan tashqari har qanday jadval ustunida yaratilishi mumkin. Indekslar tezlikka sezgir bo'lmagan ilovalar va yuqori unumdor ilovalarni, ayniqsa katta jadvallar bilan ishlashda farq qiladi. Biroq, indeks yaratishga qaror qilishdan oldin, tizimning ishlashi bilan bog'liq ijobiy va salbiy tomonlarni tortishingiz kerak. Agar siz indeksni kiritib, uni unutib qo'ysangiz, unumdorlik yaxshilanmaydi.

    Ishlashning eng katta yaxshilanishi barcha qiymatlar noyob bo'lgan ustunda indeks yaratishdan kelib chiqsa-da, takroriy yoki NULL qiymatlarni o'z ichiga olgan ustunlar uchun shunga o'xshash natijalarni olishingiz mumkin. Indeks yaratish uchun ustun qiymatlari noyob bo'lishi shart emas. Standart indeksdan foydalanganda kerakli unumdorlikni oshirishga yordam beradigan ba'zi tavsiyalar, shuningdek, indeks yaratishda unumdorlik va disk maydoni sarfi o'rtasidagi muvozanat bilan bog'liq muammolarni ko'rib chiqamiz.

    Jadvallardagi ma'lumotlarni qidirish uchun indekslardan foydalanish ustunlari indekslanmagan jadvallarni skanerlashda ishlashning sezilarli yaxshilanishini ta'minlaydi. Biroq, to'g'ri indeksni tanlash unchalik oson emas. Albatta, qiymatlari yagona bo'lgan ustun B-daraxt indeksi bilan indekslash uchun afzalroqdir, ammo bu talablarga javob bermaydigan ustun, agar uning satrlarining taxminan 10% bir xil qiymatlarni o'z ichiga olgan bo'lsa, yaxshi nomzoddir. va boshqa emas. “Oʻtish” yoki “bayroq” ustunlari, masalan, shaxsning jinsi haqidagi maʼlumotlarni saqlaydigan ustunlar B-daraxt indekslari uchun mos emas. “Ishonchli qiymatlar”ning oz sonini saqlash uchun ishlatiladigan ustunlar, shuningdek saqlaydigan ustunlar ma'lum qiymatlar ham mos kelmaydi, keyin belgilar, masalan, "ishonchlilik" yoki "ishonchsizlik", "faollik" yoki "harakatsizlik", "ha" yoki "yo'q" va hokazo. Va nihoyat, teskari tugmalari bo'lgan indekslar u o'rnatilgan va ishlaydigan joyda, qoida tariqasida, ishlatiladi Oracle Parallel Server va siz ma'lumotlar bazasidagi parallellik darajasini maksimal darajaga oshirishingiz kerak.