PDA

View Full Version : نحوه دسترسی به دیتا با توجه به ایندکس



tdkhakpur
سه شنبه 05 مرداد 1389, 19:30 عصر
سلام به همگی
یک کوئری به این صورت لازم دارم داخل جدول دو ایندکس یکی برای name و id و دومی برای fam و id در نظر گرفته شده که id یونیک هست به شکل زیر


create table MyTable(id bigint primary key, name char(32), fam char (32));
create index name_Idx on MtTable(id, name)
create index fam_Idx on MtTable(id, fam)

حالا سوال این هست که با چه کوئری میتوانم یک رکورد را بر اساس یک ایندکس بدست بیارم یعنی همه فیلدهای رکورد بدست بیاد
مثلا
وقتی وارد میکنم


select name from mytable

خرجی یک ستون از سطرهاست کوئری فوق را به چه شکل تغییر بدم که بتوانم با انتخاب ایندکس - این درخواست را به sql ارسال کنم و همچنین کل سطر به جای تک ستون name به نمایش در بیاید.
یا یه چیزی تو این مایه ها؟

tdkhakpur
چهارشنبه 06 مرداد 1389, 00:22 صبح
دوستان نظری ندارند؟

محمد سلیم آبادی
چهارشنبه 06 مرداد 1389, 13:39 عصر
سوالتون برام مفهوم نیست.
فکر میکنم منظورتون این باشه Optimizer نسبت به کوئری یک Index مناسب را برای خواندن اطلاعات استفاده کنه.
و احتمالا هم نسخه ی 2000 دارین.
وقتی کوئری به شکل زیر می نویسید کل داده های جدول Scan می شوند و دیگه فرقی نمی کنه روی جدول شاخص هایی ایجاد کردین یا نه:
SELECT name FROM table
ولی وقتی که شرایط کمی تغییر کنه مثلا فیلتر یا sort صورت بگیره ماجرا فرق خواهد کرد از طرفی اگر بخواهین تمام ستون ها نمایش داده بشه باید ایندکستان بتواند تمام ستون های جدول را پوشش بده (Cover).



همچنین کل سطر به جای تک ستون name
در این عبارت نباید کلمه "سطر" به "ستون" تغییر کنه.

tdkhakpur
چهارشنبه 06 مرداد 1389, 14:02 عصر
مثلا فیلتر یا sort صورت بگیره ماجرا فرق خواهد کرد از طرفی اگر بخواهین تمام ستون ها نمایش داده بشه باید ایندکستان بتواند تمام ستون های جدول را پوشش بده (Cover).


درسته ولی راهی نداره؟!
مثلا من با دو فیلد که یکی از انها کلید اصلی هست ایندکس میسازم به اسم name_indx حالا اگر بخوام برای مرتب سازی با توبه به ایندکس فوق select کنم تا همه فیلدهای سطر در خروجی ظاهر شود چه کوئری را ارسال کنم؟

محمد سلیم آبادی
چهارشنبه 06 مرداد 1389, 14:15 عصر
شما می تونید ایندکس مورد نظرتون را به SQL تحمیل کنید. به مبحث زیر مراجعه کنید:
SQL Server Table Hints (http://www.sql-server-performance.com/tips/hints_table_p1.aspx)

tdkhakpur
پنج شنبه 07 مرداد 1389, 00:51 صبح
یه سوال فرعی هم دارم اینکه من یک سطر را select شده دارم برای next و یا prev کردن به سطرهای بعدی یا قبلی چه کوئری ارسال کنم.

محمد سلیم آبادی
پنج شنبه 07 مرداد 1389, 02:54 صبح
نتیجه ی یک دستور SELECT دو چیز می تونه باشه Set و Cursor. اگر سطرها بر اساس یک مقداری مرتب شده باشه آن وقت Cursor هست. در این حالت سطر بعدی و قبلی معنا پیدا می کنه. برای اینکار می تونید به کرسر رجوع کنید. یا اینکه به هر سطر از جدول یک شماره بدین (با کمک ROW_NUMBER) و هر سطری را که خواستین انتخاب کنید.

tdkhakpur
پنج شنبه 07 مرداد 1389, 12:52 عصر
یا اینکه به هر سطر از جدول یک شماره بدین (با کمک ROW_NUMBER) و هر سطری را که خواستین انتخاب کنید

درسته ولی من این کار را برای دسترسی سریع به سطرها نیاز دارم و میخوام سریعترین راه را در نظر بگیرم.
این کار احتمال دارد برای سرور در یک شبکه LAN باشه یا WAN.
به نظر شما وقتی دیتا بیس باز و یک سطر مشخص انتخاب می شود ایجاد ROW_NUMBER باعث میشود که موتور جستجو از اول شروع به جستجو کند یا اینکه از همان محل چند بایتی به عقب و جلو حرکت خواهد کرد؟
البته من میخوام از همان محل چند بایتی عقب جلو بره امکانش هست یا نه؟

محمد سلیم آبادی
پنج شنبه 07 مرداد 1389, 14:07 عصر
به نظر من روش ROW_NUMBER بدلیل اینکه تنها داده های جدول یکبار scan میشن کم هزینه ترین روشه. با فرض اینکه یک بار کوئری گرفته بشه و در یک جدول داده ها درج بشن و یک ایندکس کلاستری روی ستون شماره سطر بگذاریم، در این حالت برای هر انتخاب تنها یکبار ایندکس پیمایش میشود.
پیمایش sequence داده ها زمانی اتفاق می افتد که بخواهیم کل داده ها را از روی ایندکس کلاستری بخوانیم در این حالت احتمالا اسکیول داده ها را از روی ترتیب فیزیکی دیسک سخت بخواند.