Sql-da indekslardan foydalanish. Ma'lumotlar bazasini indeksatsiya qilish 1) Indeks tushunchasi Indeks Bir yoki bir nechta ustunlarning qiymatlari asosida jadval satrlariga tezkor kirishni ta'minlaydigan vositadir. Ushbu operatorda juda ko'p xilma-xillik mavjud, chunki u standartlashtirilmagan, chunki standartlar ishlash muammolariga murojaat qilmaydi. 2) Indekslarni yaratish INDEX yarating ON () 3) Indekslarni o'zgartirish va yo'q qilish Indeks faolligini boshqarish uchun quyidagi operator ishlatiladi: INDEX ALTER Indeksni o'chirish uchun operatordan foydalaning: INDEXNI DROP a) Jadvalni tanlash qoidalari 1. Jadvallarning 5 foizidan ko'p bo'lmagan jadvallarni indekslash tavsiya etiladi. 2. TANLANG bayonotining Qaerda aytilgan nusxasida nusxasi bo'lmagan indeks jadvallari. 3. Tez-tez yangilanadigan jadvallarni indeksatsiya qilish mantiqiy emas. 4. Ikki sahifadan oshmaydigan jadvallarni indekslash mantiqiy emas (Oracle uchun bu 300 satrdan kam), chunki uni to'liq ko'rib chiqish uzoq davom etmaydi. b) Ustunlarni tanlash qoidalari 1. Boshlang'ich va xorijiy tugmachalar ko'pincha jadvallarga qo'shilish, ma'lumotlarni olish va qidirish uchun ishlatiladi. Bu har doim maksimal foyda bilan noyob indekslardir 2. Ma'lumotlarning yaxlitlik parametrlaridan foydalanganda har doim FK-da indeks talab qilinadi. 3. Ko'pincha ma'lumotlarni saralash va / yoki guruhlash amalga oshiriladigan ustunlar. 4. TANLANISh bayonotining Qaerda qayerda qidirib topilgan ustunlar. 5. Uzun tavsifli ustunlarda indekslarni yaratmang. v) Murakkab indekslarni yaratish printsiplari 1. Agar individual ustunlar bir nechta noyob qiymatlarga ega bo'lsa, kompozit indekslar yaxshi bo'ladi va kompozit indeks yanada o'ziga xoslikni ta'minlaydi. 2. Agar SELECT ko'rsatmasi bilan tanlangan barcha qiymatlar kompozit indeksga tegishli bo'lsa, u holda qiymatlar indeksdan olinadi. 3. Agar WHERE gapida AND va operator bilan birlashtirilgan ikkita yoki undan ko'p qiymat ishlatilsa, kompozit indeks yarating. d) yaratish tavsiya etilmaydi Ustunlarda, shu jumladan kompozit indekslarni yaratish tavsiya etilmaydi: 1. Kamdan-kam hollarda so'rov natijalarini qidirish, birlashtirish va saralash uchun ishlatiladi. 2. Ular tez-tez o'zgarib turadigan qiymatlarni o'z ichiga oladi, bu esa indeksni tez-tez yangilab turishni talab qiladi, bu ma'lumotlar bazasi ishini sekinlashtiradi. 3. Kam miqdordagi noyob qiymatlarni (10% m / f dan kam) yoki bitta yoki ikkita qiymatga ega bo'lgan chiziqlar ustunligini o'z ichiga oling (etkazib beruvchining yashash joyi - Moskva). 4. Funktsiya yoki ibora WHERE so'zida ularga qo'llaniladi va indeks ishlamaydi. e) unutmang Siz indekslar sonini kamaytirishga harakat qilishingiz kerak, chunki ularning ko'pi ma'lumotlar yangilanish tezligini pasaytiradi. Shuning uchun MS SQL Server har bir jadvalga 16 tadan ko'p bo'lmagan indeks yaratishni tavsiya qiladi. Odatda, so'rovlar va ma'lumotlarning yaxlitligi uchun indekslar tuziladi. Agar indeks so'rovlar uchun ishlatilmasa, u o'chirilishi kerak va mos yozuvlar yaxlitligi triggerlardan foydalangan holda amalga oshirilishi kerak. Indekslar Oracle DBMS jadvalining satrlariga tezkor kirishni ta'minlash uchun ishlatiladi. Indekslar jadval satrlarining nisbatan kam sonini tanlash kerak bo'lganda operatsiyalar davomida ma'lumotlarga tezkor kirishni ta'minlaydi. Oracle jadvalda cheksiz sonli indekslarni berishga imkon beradi, indekslar faqat so'rovlarni tezlashtirish uchun ishlatilganda foydalidir. Aks holda, ular indekslangan ustunlarni yangilashda faqat joy egallaydi va server ish faoliyatini sekinlashtiradi. Sizning so'rovlaringizda indekslar qanday ishlatilishini aniqlash uchun BIZNING REJA (Rejalashtirish rejasi va statistika) xususiyatidan foydalanishingiz kerak. Ba'zan, indeks sukut bo'yicha ishlatilmasa, indeksdan foydalanish to'g'risida so'rovlarga murojaat qilishingiz mumkin. Jadval ma'lumotlarini kiritgandan so'ng indekslarni yarating Odatda indekslarni yaratmasdan oldin jadvalga ma'lumotlarni kiritasiz yoki yuklaysiz. Aks holda, indekslarni yangilashning qo'shimcha qiymati kiritish yoki yuklash operatsiyalarini sekinlashtiradi. Ushbu qoidadan faqat istisno - bu klasterli kalit indeksidir. U faqat bo'sh klaster uchun yaratilishi mumkin. Indekslarni yaratishda bo'sh joy muammosiga duch kelmaslik uchun vaqtinchalik jadval maydoniga o'ting Indeksni allaqachon o'z ichiga olgan jadvalda indeks yaratishda, Oracle tartiblash uchun qo'shimcha joy talab qiladi. Bunda indeks yaratuvchisiga ajratilgan xotira maydonlaridan foydalaniladi (har bir foydalanuvchi uchun ajratilgan miqdor SORT_AREA_SIZE boshlang'ich parametri bilan belgilanadi), bundan tashqari, Oracle server indeks yaratish paytida ajratilgan vaqtinchalik segmentlardan ma'lumotlarni tozalashi va o'zgartirishi kerak. Agar indeks juda katta bo'lsa, unda quyidagilarni bajarish tavsiya etiladi. CREATE TABLESPACE buyrug'idan foydalanib, yangi vaqtinchalik jadvallar jadvalini yarating. Ushbu yangi vaqtinchalik bo'sh joyni ALTER USER bayonotining TEMPORARY TABLESPACE parametrida ko'rsating. CREATE INDEX bayoni bilan indeks yarating. Ushbu jadval maydonini DROP TABLESPACE buyrug'i bilan yo'q qiling. Keyin asl jadval maydonini vaqtincha tiklash uchun ALTER USER buyrug'idan foydalaning. Indekslash uchun to'g'ri jadval va ustunlarni tanlang Indeks qachon yaratilishini aniqlash uchun quyidagi ko'rsatmalardan foydalaning. Agar siz katta jadvalda nisbatan kichik (15% dan kam) qatorlarni tez-tez tanlasangiz indeks yarating. Bu foiz jadvalni ko'rish tezligining nisbiy tezligiga va indeks tugmachasidagi satr ma'lumotlarini qay darajada taqsimlashga bog'liq. Ko'rish tezligi qanchalik yuqori bo'lsa, foiz past bo'ladi, qator ma'lumotlari qanchalik ko'p bo'lsa, foiz shuncha yuqori bo'ladi. Bir nechta jadvallarga qo'shilish samaradorligini oshirish uchun birlashmalarda qo'llaniladigan indeks ustunlari. Indekslar avtomatik ravishda birlamchi va noyob kalit asosida yaratiladi. Kichik jadvallarni indekslash kerak emas. Agar siz so'rovni bajarish vaqti sezilarli darajada oshganini ko'rsangiz, u katta ehtimollik bilan amalga oshirildi. Ba'zi ustunlar indekslash uchun aniq nomzodlardir. Ular quyidagi xususiyatlarga ega: ustunlardagi qiymatlar nisbatan noyobdir; qiymatlarning katta diapazoni (umumiy indekslar uchun mos); qiymatlarning kichik diapazoni (bit indekslari uchun mos); juda siyrak ustunlar (ko'plab aniqlanmagan, "bo'sh" qiymatlar), ammo so'rovlar asosan mazmunli qatorlar haqida. Bunday holda, barcha nolga teng keladigan taqqoslash afzal ko'riladi: Qaerda emas COL_X\u003e -9.99 * quvvat (10, 125) Qaerda COL_X YO'Q BO'LMAYDI Bu, chunki COL_X indeksidan foydalanadi (COL_X raqamli ustun deb faraz qilsangiz). Har bir jadval uchun indekslar sonini cheklang Indekslar qancha ko'p bo'lsa, jadvalni o'zgartirish uchun qo'shimcha xarajatlar shunchalik yuqori bo'ladi. Qator qo'shilganda yoki o'chirilganda, jadvaldagi barcha ko'rsatkichlar yangilanadi. Agar ustun yangilangan bo'lsa, unda qatnashadigan barcha indekslar ham yangilanishi kerak. Indekslar holatida, yangilanishlar paytida ishlashning pasayishi bilan solishtirganda, so'rovlar samaradorligini oshirishni muvozanatlashingiz kerak. Masalan, jadval birinchi navbatda o'qilishi mumkin bo'lsa, indekslardan keng foydalanish mumkin; ammo, agar jadval tez-tez yangilanadigan bo'lsa, indekslardan foydalanish minimal darajada saqlanishi kerak. Kompozit indekslarda ustun tartibini tanlang Garchi ustunlar CREATE INDEX bayonida istalgan tartibda ko'rsatilishi mumkin bo'lsa-da, CREATE INDEX bayonidagi ustunlar tartibi so'rovlarning bajarilishiga ta'sir qilishi mumkin. Umuman olganda, ishlatilishi mumkin bo'lgan ustunlar birinchi navbatda indeksda keltirilgan. Siz kompozit indeksni yaratishingiz mumkin (bir nechta ustunlardan foydalangan holda), bunday indeks ushbu indeksning barcha ustunlariga yoki faqat ayrimlariga so'rov qilish uchun ishlatilishi mumkin. Indeksdan to'g'ri foydalanish uchun statistikani to'plang Agar ma'lumotlar bazasi so'rovlarda ishlatiladigan jadvallar statistikasini to'plasa va saqlasa, indekslardan samaraliroq foydalanish mumkin. Siz CREATE INDEX bayonotidagi COMPUTE STATISTICS kalit so'zini ko'rsatib indeks yaratish paytida statistik ma'lumotlarni to'plashingiz mumkin. Ma'lumotlar doimiy ravishda yangilanib turishi va qiymatlarning taqsimlanishi o'zgarishi sababli, statistika DBMS_STATS.GATHER_TABLE_STATISTICS va DBMS_STATS.GATHER_SCHEMA_STATISTICS protseduralaridan foydalanib, vaqti-vaqti bilan yangilab turilishi kerak. Keraksiz indekslarni yo'q qiling Quyidagi hollarda indeks o'chiriladi: agar indeksdan foydalanish so'rovlar samaradorligini oshirmasa. Ushbu holat jadval juda kichik bo'lsa yoki jadvalda juda ko'p satrlar bo'lsa, lekin ular orasida faqat bir nechtasi indeks elementlari bo'lsa; agar sizning so'rovlaringizda indeks ishlatilmasa; agar indeks qayta tiklanishdan oldin tushsa. Indeks tushganda, indeks segmentining barcha qoldiqlari tegishli bo'lgan jadval maydoniga qaytariladi va ushbu jadval maydonidagi boshqa ob'ektlarga taqdim etiladi. Indekslar, ular qurilgan jadval yo'q qilinganida avtomatik ravishda tushiriladi. Yuqori mahsuldorlikka erishishning muhim usullaridan biri SQL Server indekslardan foydalanish hisoblanadi. Indeks jadvaldagi ma'lumotlar qatorlariga tez kirishni ta'minlab, so'rov jarayonini tezlashtiradi, xuddi kitobdagi indeks sizga kerakli ma'lumotlarni tezda topishga yordam beradi. Ushbu maqolada men ichidagi 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 jadvallar va ko'rinishlardagi ustunlarda yaratiladi. Indekslar ushbu ustunlardagi qiymatlarga asoslanib ma'lumotlarni tezda topish usulini ta'minlaydi. Masalan, agar siz birlamchi kalitda indeks yaratib, keyin birlamchi kalit qiymatlaridan foydalangan holda ma'lumot qatorini qidirsangiz SQL Server avval indeks qiymatini topadi va keyin butun ma'lumotlar qatorini tezda topish uchun indeksdan foydalanadi. Indekssiz, jadvaldagi barcha satrlarni to'liq skanerlash (ko'rish) amalga oshiriladi, bu esa ishlashga sezilarli ta'sir ko'rsatishi mumkin. Siz jadval yoki ko'rinishning ko'p ustunlarida indeks yaratishingiz mumkin. Istisno asosan katta ob'ektlarni saqlash uchun ma'lumotlar turlari bo'lgan ustunlardir ( LOB), kabi rasm, matnyoki varchar (maksimal)... Bundan tashqari, ma'lumotlarni formatda saqlash uchun mo'ljallangan ustunlarda indekslarni yaratishingiz mumkin XML, ammo bu indekslar odatdagidan biroz farq qiladi va ularni ko'rib chiqish ushbu maqola doirasiga kirmaydi. Bundan tashqari, maqola berilmaydi ustun do'koniko'rsatkichlar. Buning o'rniga men ma'lumotlar bazalarida eng ko'p ishlatiladigan indekslarga e'tibor qarataman. SQL Server. Indeks tarkibiy qismda tashkil etilgan sahifalar, indeks tugunlari to'plamidan iborat - muvozanatli daraxt... Ushbu struktura tabiatda ierarxik bo'lib, rasmda ko'rsatilgandek, ierarxiyaning yuqori qismida va barg tugunlaridan boshlanadi: Indekslangan ustunni so'rasangiz, so'rov mexanizmi ildiz tugunining yuqorisidan boshlanadi va oraliq tugunlardan asta-sekin pastga siljiydi, bunda o'rta darajadagi har bir qatlamda ma'lumotlar to'g'risida batafsil ma'lumotlar mavjud. So'rov mexanizmi indeks tugunlari bo'ylab indeks barglari bilan eng past darajaga tushguncha harakatlanishni davom ettiradi. Masalan, indekslangan ustunda 123 qiymatini izlayotgan bo'lsangiz, so'rov mexanizmi birinchi darajani birinchi darajadagi ildiz darajasida aniqlaydi. Bunday holda, birinchi sahifa 1 dan 100 gacha, ikkinchisi 101 dan 200 gacha bo'lgan qiymatga ishora qiladi, shuning uchun so'rov mexanizmi ushbu oraliq darajaning ikkinchi sahifasiga murojaat qiladi. Bundan tashqari, keyingi oraliq darajadagi uchinchi sahifaga murojaat qilishingiz kerakligi aniqlanadi. Bu erdan, so'rov mexanizmi indeksning qiymatini pastroq darajada o'qiydi. Indeks barglari indeks turiga qarab jadval ma'lumotlarini o'zi yoki jadvaldagi ma'lumotlar qatoriga ko'rsatgichni o'z ichiga olishi mumkin: klasterli indeks yoki klasterlanmagan indeks. Klasterli indeks Kümelenmiş indeks ma'lumotlarning haqiqiy qatorlarini indeksning barglarida saqlaydi. Oldingi misolga qaytadigan bo'lsak, 123 kalit qiymati bilan bog'liq ma'lumotlar qatori indeksning o'zida saqlanishini anglatadi. Klasterlangan indeksning muhim xususiyati shundaki, barcha qiymatlar ko'tarilib yoki kamayib boruvchi ma'lum tartibda tartiblangan. Shunday qilib, jadval yoki ko'rinishda faqat bitta klasterli indeks 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 uyum deyiladi. Yig'ilmagan indeks Klasterlangan indeksdan farqli o'laroq, tartibsiz indeksning barglari faqat shu ustunlarni o'z ichiga oladi ( kalit), ushbu indeks aniqlanadigan jadvalda haqiqiy ma'lumotlarga ega bo'lgan satrlarga ko'rsatgichni o'z ichiga oladi. Bu shuni anglatadiki, quyi so'rov tizimi kerakli ma'lumotlarni topish va olish uchun qo'shimcha operatsiyalarni talab qiladi. Ma'lumotlar uchun ko'rsatgichning tarkibi ma'lumotlar klasterli jadvalda yoki uyumda saqlanganligiga bog'liq. Agar ko'rsatgich klasterli jadvalga ishora qilsa, u haqiqiy ma'lumotni topish uchun ishlatilishi mumkin bo'lgan klasterlangan indeksga olib keladi. Agar ko'rsatgich uyumga ishora qilsa, u holda ma'lumotlar qatorining ma'lum bir identifikatoriga olib keladi. Klassifikatsiyalangan indekslarni saralash mumkin emas, klasterlanganlardan farqli o'laroq, lekin jadvalda yoki ko'rinishda 999 tagacha bittadan ko'p bo'lmagan indekslar yaratishingiz mumkin. Bu sizning iloji boricha ko'p indekslar yaratishingiz kerak degani emas. Indekslar tizim ish faoliyatini yaxshilaydi va yomonlashtiradi. Bir nechta ajratilmagan indekslarni yaratish imkoniyatiga qo'shimcha ravishda siz qo'shimcha ustunlarni ham qo'shishingiz mumkin ( kiritilgan ustun) o'z indeksiga: indeks barglari nafaqat indekslangan ustunlarning qiymatlarini, balki indekslanmagan qo'shimcha ustunlarning qiymatlarini ham saqlaydi. Ushbu yondashuv indeksdagi ba'zi cheklovlar atrofida ishlashga imkon beradi. Masalan, siz indekslanmaydigan ustunni qo'shishingiz yoki indeks uzunligi chegarasini chetlab o'tishingiz mumkin (ko'p hollarda 900 bayt).
Indeks turlari Klasterlangan yoki klasterlanmagan indeksdan tashqari uni ixtiyoriy ravishda kompozit indeks, noyob indeks yoki qoplama indeksi sifatida sozlash mumkin. Kompozit indeks Bunday indeksda bir nechta ustun bo'lishi mumkin. Siz indeksga 16 tagacha ustunlarni kiritishingiz mumkin, ammo ularning umumiy uzunligi 900 bayt bilan cheklangan. Ikkala klasterli va klasterlanmagan indekslar ham kompozit bo'lishi mumkin. Noyob indeks Ushbu indeks indekslangan ustunning har bir qiymati noyob bo'lishini ta'minlaydi. Agar indeks kompozit bo'lsa, unda noyoblik indeksning barcha ustunlariga qo'llaniladi, lekin har bir ustunga emas. Masalan, agar siz ustunlarda noyob indeks yaratsangiz NAMEva FAMILIYA, keyin to'liq ism noyob bo'lishi kerak, lekin familiya va familiyada alohida nusxalar olish mumkin. Ustun cheklovlarini aniqlaganingizda noyob indeks avtomatik ravishda yaratiladi: asosiy kalit yoki qiymatlarning o'ziga xosligi cheklanishi: Birlamchi kalit Bir yoki bir nechta ustunlarda asosiy kalit cheklovini aniqlaganingizda SQL Server Agar klasterlangan indeks ilgari yaratilmagan bo'lsa, avtomatik ravishda noyob klasterlangan indeksni yaratadi (bu holda, asosiy kalit tomonidan noyob klasterlanmagan indeks yaratiladi) Qadriyatlarning o'ziga xosligi Agar siz qadriyatlarning o'ziga xosligini cheklashni aniqlasangiz, unda SQL Server avtomatik ravishda noyob guruhlanmagan indeksni yaratadi. Agar jadvalda biron bir klasterlangan indeks yaratilmagan bo'lsa, noyob klasterlangan indeks yaratilishini belgilashingiz mumkin Qoplama indeksi Bunday indeks ma'lum bir so'rovga jadvalning yozuvlariga qo'shimcha qo'ng'iroqlarsiz zaxiradagi barcha kerakli ma'lumotlarni darhol olish imkonini beradi. Indeks dizayni Indekslar qanchalik foydali bo'lsa, ular ehtiyotkorlik bilan ishlab chiqilishi kerak. Indekslar diskdagi katta joyni egallashi mumkin, shuning uchun kerak bo'lgandan ko'ra ko'proq indekslar yaratishni xohlamaysiz. Bundan tashqari, ma'lumotlar qatorining o'zi yangilanganda, indekslar avtomatik ravishda yangilanadi, bu qo'shimcha resurslarning ortiqcha sarflanishiga va ishlashning yomonlashishiga olib kelishi mumkin. Indekslarni loyihalashda e'tiborga olish kerak bo'lgan bir nechta ma'lumotlar bazasi va so'rovlarni hisobga olish kerak. Malumotlar bazasi Yuqorida ta'kidlab o'tilganidek, indekslar tizim ish faoliyatini yaxshilashi mumkin ular ma'lumot qidirish uchun tezkor tizim bilan so'rov tizimiga yordam beradi. Shu bilan birga, siz ma'lumotlarni qancha vaqt kiritish, yangilash yoki yo'q qilish haqida o'ylashingiz kerak. Ma'lumotni o'zgartirganda, tizimning ish faoliyatini sezilarli darajada yomonlashtiradigan ma'lumotlarning tegishli harakatlarini aks ettirish uchun indekslarni o'zgartirish kerak. Indekslash strategiyangizni rejalashtirishda quyidagi ko'rsatmalarga e'tibor bering. Tez-tez yangilanadigan jadvallar uchun iloji boricha kamroq indekslardan foydalaning. Agar jadvalda katta miqdordagi ma'lumotlar bo'lsa, lekin ularning o'zgarishlari ahamiyatsiz bo'lsa, so'rovlaringizni yaxshilash uchun kerak bo'lganda indekslardan foydalaning. Biroq, kichik jadvallarda indekslarni ishlatishdan oldin yaxshilab o'ylab ko'ring. balki indeks qidirishdan foydalanish butun satrlarni ko'rib chiqishga qaraganda ko'proq vaqt talab qilishi mumkin. Klasterli indekslar uchun iloji boricha qisqa maydonlardan foydalanishga harakat qiling. Noyob qiymatlarga ega va NULL qiymatiga ega bo'lmagan ustunlarda klasterli indeksdan foydalanish yaxshidir. 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 yomonlashadi. Boshqa tomondan, noyob qadriyatlar qanchalik ko'p bo'lsa, indeksning salomatligi yaxshi bo'ladi. Iloji bo'lsa, noyob indeksdan foydalaning. Kompozit indeks uchun indeksdagi ustunlar tartibini hisobga oling. Ifodalarda ishlatiladigan ustunlar Qaerda(masalan, Qaerda Ismi \u003d "Charli") indeksda birinchi bo'lishi kerak. Keyingi ustunlar ularning noyobligi asosida ro'yxatlanishi kerak (eng ko'p noyob qiymatlarga ega ustunlar birinchi navbatda turadi). Bundan tashqari, agar ular ba'zi talablarga javob bersa, hisoblangan ustunlarda indeksni belgilashingiz mumkin. Masalan, ustun qiymatini olish uchun ishlatiladigan ifoda deterministik bo'lishi kerak (berilgan parametrlar to'plami uchun har doim bir xil natijani qaytaring). Ma'lumotlar bazasidagi so'rovlar Indekslarni loyihalashda yodda tutish kerak bo'lgan yana bir narsa bu ma'lumotlar bazasiga so'rovlar berishdir. Yuqorida aytib o'tilganidek, ma'lumotlar qanchalik tez-tez o'zgarib turishini o'ylab ko'rishingiz kerak. Bundan tashqari, quyidagi printsiplardan foydalanish kerak: Bitta so'rovda emas, balki bitta so'rovda iloji boricha ko'proq qatorlarni qo'shishga yoki o'zgartirishga harakat qiling. Qidiruv so'zlari sifatida tez-tez ishlatiladigan ustunlar bo'yicha ajratilmagan indeks yarating Qaerdava ulanishlar QO'SHING. Mos keladigan qiymatlarni aniqlash uchun qidiruv so'rovlarida ishlatiladigan indekslangan ustunlarni ko'rib chiqing. Va endi, aslida: SQL Server indekslari haqida so'rashga juda uyatchan 14 savol Nega jadvalda ikkita klasterli indeks bo'lishi mumkin emas? Qisqa javob bering Klasterli indeks - bu jadval. Jadvalda klasterlangan indeksni yaratganingizda, saqlash mexanizmi jadvalning barcha satrlarini indeks ta'rifiga ko'ra ko'tarilish yoki kamayish tartibida tartiblaydi. Klasterlangan indeks boshqa indekslar kabi alohida ob'ekt emas, lekin jadvalda ma'lumotlarni saralash va ma'lumotlar qatorlariga tez kirishni osonlashtiradigan mexanizm. Aytaylik, sizda savdo bitimlari tarixi ko'rsatilgan jadval mavjud. Savdo jadvaliga buyurtma identifikatori, buyurtmadagi buyum holati, buyum raqami, mahsulot miqdori, buyurtma raqami va sanasi va boshqalar kabi ma'lumotlar kiradi. Siz ustunlar ustida klasterlangan indeks yaratmoqdasiz Buyurtma kodiva LineIDquyidagicha ko'rsatilgan tartibda ko'tarilish tartibida tartiblangan T-SQL kod: Dbo.Sales (buyruq kodi, chiziq kodi) ga INDEX ix_oriderid_lineidni UNIQUE UNIQUE yarating; Ushbu skriptni ishga tushirganda, jadvaldagi barcha satrlar avval tartibID ustuni va keyin LineID tomonidan tartiblangan bo'ladi, lekin ma'lumotlar o'zi jadvalda bitta mantiqiy blokda qoladi. Shuning uchun, siz ikkita klasterli indeks yaratolmaysiz. Bitta ma'lumotga ega bo'lgan bitta jadval bo'lishi mumkin va ushbu jadvalni faqat ma'lum tartibda bir marta tartiblash mumkin. Agar klasterli jadval ko'p foyda keltirsa, nega uyumdan foydalanish kerak? Siz haqsiz. Klasterli jadvallar juda yaxshi va sizning ko'p so'rovlaringiz klasterli indeksga ega jadvallarda yaxshiroq ishlaydi. Ammo ba'zi hollarda siz jadvallarni tabiiy, toza holatda qoldirishingizni xohlashingiz mumkin, ya'ni. to'plangan va faqat so'rovlaringizni sog'lom saqlash uchun ajratilmagan indekslarni yarating. To'p, esingizdami, ma'lumotlarni tasodifiy tartibda saqlaydi. Odatda, saqlash pastki tizimi ma'lumotlar joylashtirilgan tartibda jadvalga ma'lumotlarni qo'shadi, ammo quyi tizim yanada samarali saqlash uchun qatorlarni siljitishni yaxshi ko'radi. Natijada, ma'lumotlar qanday tartibda saqlanishini oldindan taxmin qilish imkoniyati yo'q. Agar so'rov mexanizmi ma'lumotlarga ajratilmagan indeksning afzalliklarisiz kerak bo'lsa, u kerakli satrlarni qidirish uchun jadvalni to'laligicha ko'rib chiqadi. Juda kichkina stollarda, odatda, bu muammo emas, lekin uyum kattalashgani sayin, unumdorlik tezda pasayadi. Albatta, ajratilmagan indeks ma'lumotlar saqlanadigan faylga, sahifaga va satrga ko'rsatgich yordamida yordam berishi mumkin - odatda jadvallarni skanerlash uchun yanada yaxshi alternativa. Shunday bo'lsa ham, so'rovlar bajarilishini ko'rib chiqishda klasterlangan indeksning afzalliklarini taqqoslash qiyin. Biroq, to'plangan to'p muayyan holatlarda ish faoliyatini yaxshilashga yordam beradi. Ko'plab qo'shimchalar kiritilgan, ammo kamdan-kam yangilanadigan yoki ma'lumotlarni o'chirib tashlaydigan jadvalni ko'rib chiqing. Masalan, jurnalni saqlaydigan jadval birinchi navbatda arxivlanmaguncha qiymatlarni kiritish uchun ishlatiladi. To'plangan sahifada siz klasterli indeks bilan bo'lgani kabi, peyjing va ma'lumotlarning parchalanishini ko'rmaysiz, chunki satrlar shunchaki uyum oxiriga qo'shilgan. Sahifalarni juda ko'p ajratish unumdorlikka sezilarli darajada ta'sir qilishi mumkin. Umuman olganda, uyum ma'lumotni nisbatan og'riqsiz kiritishga imkon beradi va siz klasterli indeks bilan bo'lgani kabi saqlash va saqlash xarajatlari bilan kurashishingiz shart emas. Ammo ma'lumotlarni yangilash va yo'q qilishning yagona sababi deb hisoblamaslik kerak. Ma'lumotlarning tanlab olinishi ham muhim omil hisoblanadi. Masalan, agar siz tez-tez ma'lumotlarning oralig'ini so'rasangiz yoki so'ralgan ma'lumotlarni tez-tez saralash yoki guruhlarga ajratish kerak bo'lsa, uyumdan foydalanmasligingiz kerak. Bularning barchasi shuni anglatadiki, siz juda kichik jadvallar bilan ishlayotganda, uyumdan foydalanish haqida o'ylashingiz kerak, yoki jadval bilan o'zaro aloqangiz ma'lumot kiritish bilan cheklangan va sizning so'rovlaringiz juda oddiy (va siz baribir indekslangan indekslardan foydalanyapsiz). Aks holda, odatda kengaytiriladigan ustun kabi, oddiy ko'tariladigan kalit maydonida aniqlangan yaxshi ishlab chiqilgan klasterli indeksga yopishib oling. Identifikatsiya. Indeks uchun standart to'ldirish koeffitsientini qanday o'zgartiraman? Indeksning standart to'ldirish omilini o'zgartirish bitta narsadir. Odatiy nisbat qanday ishlashini tushunish boshqacha. Birinchidan, bir necha qadam orqaga. Indeksni to'ldirish koeffitsienti yangi sahifani to'ldirishni boshlashdan oldin indeksni pastki darajada (varaq darajasi) saqlash uchun sahifadagi bo'sh joy miqdorini aniqlaydi. Masalan, agar koeffitsient 90 ga o'rnatilgan bo'lsa, unda o'sish bilan indeks sahifada 90% ni tashkil qiladi va keyingi sahifaga o'ting. Odatiy bo'lib, indeksning to'ldirish koeffitsienti qiymati SQL Server100 ga teng bo'lgan 0 ga teng. Natijada, agar siz kodda tizim uchun standart qiymatdan farq qiladigan qiymatni aniq ko'rsatmasangiz yoki odatiy holatni o'zgartirmasangiz, barcha yangi indekslar ushbu sozlamani avtomatik ravishda meros qilib oladi. Siz foydalanishingiz mumkin SQL Server boshqarish studiyasi standart qiymatni to'g'rilash yoki tizimda saqlangan protsedurani ishga tushirish uchun sp_configure... Masalan, quyidagi to'plam T-SQL buyruqlar koeffitsient qiymatini 90 ga o'rnatadi (avval kengaytirilgan sozlash rejimiga o'tishingiz kerak): EXEC sp_configure "kengaytirilgan variantlarni ko'rsatish", 1; QAYTA TEKShIRING; GO EXEC sp_configure "to'ldirish faktori", 90; YO'Q QO'YING; GO Indeksni to'ldirish omilining qiymatini o'zgartirgandan so'ng, siz xizmatni qayta boshlashingiz kerak SQL Server... Endi sp_configure-ni ishga tushirish orqali belgilangan qiymatni tekshirib ko'rishingiz mumkin: EXEC sp_config "to'ldirish faktori" GO Ushbu buyruq 90 qiymatini qaytarishi kerak. Natijada, yangi yaratilgan barcha indekslar ushbu qiymatdan foydalanadilar. Buni indeks yaratish va to'ldirish faktori qiymatini so'rash orqali tekshirishingiz mumkin: AdventureWorks2012-dan FOYDALANING; - ma'lumotlar bazangiz GO CREATE NONCLUSTERED INDEX ix_people_lastname ON Person.Person (LastName); TO SELECT plaginini to'ldiruvchi_faktor FROM sys.indexes WHERE object_id \u003d object_id ("Person.Person") VA name \u003d "ix_people_lastname"; Ushbu misolda biz jadvalda klastersiz indeks yaratdik Shaxsma'lumotlar bazasida AdventureWorks2012... Indeksni yaratgandan so'ng, biz sys.indexes tizim jadvallaridan to'ldirish omilining qiymatini olamiz. So'rov 90 raqamini qaytarishi kerak. Ammo, indeksni o'chirib, uni qayta yaratamiz deylik, lekin hozir biz to'ldirish faktorining ma'lum qiymatini belgilab qo'ydik: NONCLUSTERED INDEX yarating ix_people_lastname ON person.Person (Familiya) BILAN (fillfaktor \u003d 80); TO SELECT plaginini to'ldiruvchi_faktor FROM sys.indexes WHERE object_id \u003d object_id ("Person.Person") VA name \u003d "ix_people_lastname"; Bu safar biz ko'rsatmalarni qo'shdik BILANva variant filfaktorbizning indeks yaratishimiz uchun INDEX yarating va qiymatini ko'rsatdi 80. Operator TANLASHendi mos qiymatni qaytaradi. Hozircha hamma narsa juda oddiy edi. Agar siz ushbu qiymatni bilsangiz, standart koeffitsient qiymatidan foydalanib indeks yaratganingizda butun jarayon davomida chindan ham chigallashadigan narsadir. Masalan, kimdir server sozlamalariga beparvo qaraydi va u shu qadar ayyorki, indeksning to'ldirish koeffitsienti qiymatini 20 ga tenglashtiradi. Shu vaqt ichida siz standart qiymatni 0 deb qabul qilgan holda indekslarni yaratishda davom etasiz. Afsuski, oldin koeffitsient qiymatini topa olmaysiz. Agar indeks yaratmasangiz va bizning misollarimizdagi kabi qiymatni tekshirsangiz. Aks holda, siz so'rov bajarilishi shunchalik tushib ketganda, biror narsadan shubhalanishni boshlagan paytni kutishingiz kerak bo'ladi. Yodda tutish kerak bo'lgan yana bir muammo - indeksni qayta tiklash. Indeksni yaratishda bo'lgani kabi, uni qayta yaratishda indeksning to'ldirish omilini ko'rsatishingiz mumkin. Ammo, indeks yaratish buyrug'idan farqli o'laroq, qayta qurish, ko'rinadigan ko'rinishga qaramay, standart server sozlamalaridan foydalanmaydi. Bundan tashqari, agar siz indeksni to'ldirish omilining qiymatini aniq ko'rsatmasangiz, unda SQL Server qayta tuzilishidan oldin ushbu indeks mavjud bo'lgan koeffitsient qiymatidan foydalanadi. Masalan, quyidagi operatsiya INDEX ALTER biz hozirgina yaratgan indeksni qayta tiklaydi: ALTER INDEX ix_people_lastname ON person.Person REBUILD; TO SELECT plaginini to'ldiruvchi_faktor FROM sys.indexes WHERE object_id \u003d object_id ("Person.Person") VA name \u003d "ix_people_lastname"; To'ldirish koeffitsienti qiymatini tekshirganda biz 80 qiymatini olamiz, chunki indeksni oxirgi marta yaratganimizda aynan shu narsani aniqlaganmiz. Odatiy hisobga olinmaydi. Ko'rib turganingizdek, indeksning to'ldirish koeffitsienti qiymatini o'zgartirish unchalik qiyin emas. Joriy qiymatni bilish va uni qachon qo'llashni tushunish ancha qiyin. Agar siz har doim indekslarni yaratish va qayta tiklashda aniq nisbatni aniqlasangiz, unda siz har doim aniq natijani bilasiz. Agar boshqa birov sizning server sozlamalaringizni qayta ishlamasligiga ishonch hosil