PDA

View Full Version : توقف کوئری بعد از اولین نتنیجه



behzadkhan
چهارشنبه 06 خرداد 1394, 12:07 عصر
با سلام


دوستان عزیز


فرض کنید ما در یک جدول صد هزار تا رکورد داریم و فقط دنبال یک رکورد هستیم و می دانیم که آن رکورد در یک سوم ابتدای جدول وجود دارد.


وقتی با دستور select این کار را انجام می دهیم با هر شرطی هم که براش گذاشته باشیم تمام آن یکصد هزار رکورد را بررسی می کند و در آخر نتیجه را به ما بر می گرداند.


به این شکل باعث ایجاد یک وقفه در حین اجرای برنامه می شویم حالا فرض کنید که تعداد رکورد های خیلی بیشتر از این ها باشد.


می خواهم بدانم آیا راهی هست که وقتی کوئری به اولین نتیجه رسید آنرا برگرداند و دیگر بقیه رکورد ها را بررسی نکند و کارش همانجا خاتمه یابد یعنی بجای بررسی یکصد هزار رکورد فقط یک سوم اول را بررسی کند.


البته اینکه گفتم رکورد مورد نظر در یک سوم ابتدای جدول بود فقط یک مثال بود و می تواند در هر جای جدول باشد.


البته می دانم که می توان در دستور select از TOP و یا LIMIT استفاده کرد. اما مطمئن نیستم مثلا با دستور


SELECT TOP 1 * FROM table_name WHERE ID = 1


بعد از پیدا کردن اولین نتیجه کار کوئری به پایان می رسد یا نه.


همچنین


علاوه بر کوئری با دستور select


می خواهم بدانم راهکار برای دستورهای UPDATE و DELETE هم به چه شکلی می باشد.


نمی دانم چرا دستور TOP برای دستور UPDATE و DELETE کار نمی کند.


================================================== ====================


در صورتی که منظورم را درست متوجه نشدید یا جایی از آن ابهام دارد اعلام کنید تا بیشتر توضیح دهم.


================================================== =============


از هر گونه راهنمایی مشتاقانه استقبال می نمایم.






با تشکر

pezhvakco
چهارشنبه 06 خرداد 1394, 16:50 عصر
اهی هست که وقتی کوئری به اولین نتیجه رسید آنرا برگرداند و دیگر بقیه رکورد ها را بررسی نکند و کارش همانجا خاتمه یابد یعنی بجای بررسی یکصد هزار رکورد فقط یک سوم اول را بررسی کند.
برای دستور Select نیازی به این کار نیست

مگر شما ردیف های جدول را پیمایش می کنید (حلقه ها) که نیاز به این کار دارید.


SELECT TOP 1 * FROM table_name WHERE ID = 1

اگه ایندکس گذاری درست انجام شده باشد SQL بهترین روش را برای بدست آوردن دارد.

میتونید درباره پارتیشن بندی هم بخونید و کار کنید.

behzadkhan
چهارشنبه 06 خرداد 1394, 17:06 عصر
برای دستور Select نیازی به این کار نیست

مگر شما ردیف های جدول را پیمایش می کنید (حلقه ها) که نیاز به این کار دارید.


SELECT TOP 1 * FROM table_name WHERE ID = 1

اگه ایندکس گذاری درست انجام شده باشد SQL بهترین روش را برای بدست آوردن دارد.

میتونید درباره پارتیشن بندی هم بخونید و کار کنید.

با سلام

دوست عزیز

الان این کوئری که شما نوشتید وقتی به اولین نتیجه می رسد ادامه بررسی سطر ها متوقف شده و کار کوئری خاتمه می یابد.

حالا برای UPDATE و DELETE چگونه هست.

با تشکر

pezhvakco
چهارشنبه 06 خرداد 1394, 18:43 عصر
حالا برای UPDATE و DELETE چگونه هست.
برای این کار هم ابتدا ردیف های خواسته شده برگزیده و سپس کار انجام میشود.

این جور نیست که پیمایش ردیف ها از ابتدا تا آخر انجام شود <=> ایندکس گذاری درست باشد.

behzadkhan
چهارشنبه 06 خرداد 1394, 20:06 عصر
برای این کار هم ابتدا ردیف های خواسته شده برگزیده و سپس کار انجام میشود.

این جور نیست که پیمایش ردیف ها از ابتدا تا آخر انجام شود <=> ایندکس گذاری درست باشد.

با سلام

دوست عزیز

اگر راهکار استفاده از ایندکس گذاری هست.

لطفا آنرا توضیح دهید.

با تشکر

pezhvakco
چهارشنبه 06 خرداد 1394, 20:10 عصر
ابتدا کمی جستجو نمایید (در همین سایت و دیگران) و اگر زودتر به پاسخ نرسیدیند
=>
یک تایپیک دیگر بنویسید.

behzadkhan
چهارشنبه 06 خرداد 1394, 20:30 عصر
با سلام

دوست عزیز

ممنون از پاسختان.
======================

البته پایگاه داده من اکسس می باشد.

و مجبور شدم که در تالار اس کیو ال سرور بپرسم.

اگر درباره اکسس جوابی دارید خوشحال می شوم در تاپیک زیر جواب دهید:

http://barnamenevis.org/showthread.php?496453-%D8%AA%D9%88%D9%82%D9%81-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C-%D8%AF%D8%B1-%D8%A7%D9%88%D9%84%DB%8C%D9%86-%D9%86%D8%AA%DB%8C%D8%AC%D9%87

با تشکر

behzadkhan
پنج شنبه 07 خرداد 1394, 19:25 عصر
با سلام

دوستان عزیز

لطفا مرا درباره راه کار برای سوالم در این تاپیک راهنمایی نمایید.

با تشکر

behzadkhan
سه شنبه 12 خرداد 1394, 21:58 عصر
با سلام

دوستان عزیز

درسته که پایگاه داده های هدف من اکسس می باشد.

اما

اگر در اس کیو ال سرور هم راهی برای این کار وجود دارد خوشحال می شوم که راهنماییم کنید.

موفق و پیروز باشید.

با تشکر

pezhvakco
جمعه 15 خرداد 1394, 21:01 عصر
درسته که پایگاه داده های هدف من اکسس می باشد.

اما

اگر در اس کیو ال سرور هم راهی برای این کار وجود دارد خوشحال می شوم که راهنماییم کنید.

برای چی راه کار می خواهید

behzadkhan
شنبه 16 خرداد 1394, 12:08 عصر
با سلام

کاربران عزیز

من سوالم را از سایت http://nikamooz.com/ پرسیدم و این جواب را دریافت کردم:

" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "
سلام دوست عزیز

پاسخ سوال شما به شرح زیر است :




به این مثال توجه کنید

SET STATISTICS IO ON
SET ROWCOUNT 1
SELECT * FROM TestTB


این مثال در sql sERVER است
در ضمن گذاشتن ایندکس مناسب و بهینه مشکلات شما را حل می کند



با تشکر و احترام
" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "" " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " " "


در دوستان عزیز لطفا نظرتان را در باره این پاسخ ارسال کنید.


همچنین

قبلا هم یکی از دوستان گفته بود که از ایندکس گذاری استفاده کنم.

لطفا در اینباره هم توضیح دهید.

با تشکر

behzadkhan
شنبه 16 خرداد 1394, 12:19 عصر
برای چی راه کار می خواهید

با سلام

دوست عزیز

اگر منظورتون اینه که هدف من از این پست چه چیزی هست که در پست اول توضیح دادم.

در کل می خواهم سرعت و کارائی کوئری را بالا ببرم. (یا همان Performance)

اگر

هم منظورتان چیز دیگری هست که لطفا بیشتر توضیح دهید.

موفق و پیروز باشید

با تشکر

pezhvakco
شنبه 16 خرداد 1394, 17:06 عصر
اون کد هایی که شما نوشتید

SET STATISTICS IO ON
SET ROWCOUNT 1



مربوط به SP هستند و برای تعریف ساختار اون ها هستند.

در کل می خواهم سرعت و کارائی کوئری را بالا ببرم. (یا همان Performance)
اگر ساختار جدول های تون در بهینه ترین حالت ممکن باشه اون خواسته شما رو خود SQL مدیریت میکنه .

ایندکس ها دو حالت اصلی Clustered و NonClustered دارند که در هنگام جستجو ها بکار می آیند.
http://barnamenevis.org/showthread.php?9498-Search-%D8%A8%D8%B3%DB%8C%D8%A7%D8%B1-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%AF%D8%B1-SQL%28%D9%81%D9%88%D8%B1%DB%8C%29

http://barnamenevis.org/showthread.php?37664-Index-%D9%87%D8%A7

behzadkhan
شنبه 16 خرداد 1394, 20:37 عصر
اون کد هایی که شما نوشتید

SET STATISTICS IO ON
SET ROWCOUNT 1



مربوط به SP هستند و برای تعریف ساختار اون ها هستند.

اگر ساختار جدول های تون در بهینه ترین حالت ممکن باشه اون خواسته شما رو خود SQL مدیریت میکنه .

ایندکس ها دو حالت اصلی Clustered و NonClustered دارند که در هنگام جستجو ها بکار می آیند.
http://barnamenevis.org/showthread.php?9498-Search-%D8%A8%D8%B3%DB%8C%D8%A7%D8%B1-%D8%B3%D8%B1%DB%8C%D8%B9-%D8%AF%D8%B1-SQL%28%D9%81%D9%88%D8%B1%DB%8C%29

http://barnamenevis.org/showthread.php?37664-Index-%D9%87%D8%A7


با سلام

دوست عزیز

از راهنمایی هایتان سپاس گذاری می نمایم.

======================================

الان دید خوبی نسبت به ایندکس گذاری پیدا کردم.

اما این آن چیزی که من می خواستم نبود.


من سوال خودم را در لینک زیر پرسیدم و یک جواب با دلیل پیدا کردم:

http://www.7khatcode.com/7207/%D8%AA%D9%88%D9%82%D9%81-%D8%AF%D8%B1-%D8%AD%DB%8C%D9%86-%D8%A7%D8%AC%D8%B1%D8%A7%DB%8C-%DB%8C%DA%A9-%DA%A9%D9%88%D8%A6%D8%B1%DB%8C-%D8%A8%D8%A7-%D8%AF%D8%B3%D8%AA%D9%88%D8%B1%D8%A7%D8%AA-sql

لطفا آنرا بررسی کنید و در صورت امکان نظرتان را راجع به آن ارسال کنید.

با تشکر

pezhvakco
یک شنبه 17 خرداد 1394, 12:48 عصر
البته می دانم که می توان در دستور select از TOP و یا LIMIT استفاده کرد. اما مطمئن نیستم مثلا با دستور
SELECT TOP 1 * FROM table_name WHERE ID = 1
بعد از پیدا کردن اولین نتیجه کار کوئری به پایان می رسد یا نه.
چند ردیف در جدول داده ستون ID شون برابر 1 است=>
اگر این ستون ID جدول ایندکس باشد (Clustered یا NonClustered) موتور پایگاه داده نمی آید داده ها رو از ابتدا پیمایش کند
بلکه ابتدا در ساختار درختی ایندکس ها جستجو می کند (که این هم با روش ها دودویی است) و سپس دیگر ستون های این ردیف جدول را بر میگرداند.

اون کد دستور " TOP 1 " تاثیری در جستجو ندارد و فقط برای کم کردن تعداد ردیف ها در نمایش و کمتر شدن حجم داده است.

behzadkhan
یک شنبه 17 خرداد 1394, 13:41 عصر
چند ردیف در جدول داده ستون ID شون برابر 1 است=>
اگر این ستون ID جدول ایندکس باشد (Clustered یا NonClustered) موتور پایگاه داده نمی آید داده ها رو از ابتدا پیمایش کند
بلکه ابتدا در ساختار درختی ایندکس ها جستجو می کند (که این هم با روش ها دودویی است) و سپس دیگر ستون های این ردیف جدول را بر میگرداند.

اون کد دستور " TOP 1 " تاثیری در جستجو ندارد و فقط برای کم کردن تعداد ردیف ها در نمایش و کمتر شدن حجم داده است.

با سلام

دوست عزیز

کاربری که در آن لینک پست قبلی در سایت www.7khatcode.com جواب منو دادن.

گفتن که می تونید قبل و بعد دستور SELECT یک تایم بزارید و نتیجه را با دستور TOP و بدون دستور TOP مشاهده کنید.

یعنی اینکه با دستور TOP در جدولی که رکوردهای زیادی دارد تفاوت سرعت قابل لمس هست.

خوب اون دوستمون این دلیل را آورده است.

اما

شما دلیل یا مرجعی برای اثبات نیاورده اید. (البته قصد توهین ندارم. شاید هم حق با شما باشد)

بنابراین

در صورت امکان با دلیل یا مرجع گفته خودتان را اثبات نمایید.

با تشکر

pezhvakco
یک شنبه 17 خرداد 1394, 17:42 عصر
کاربری که در آن لینک پست قبلی در سایت www.7khatcode.com (http://www.7khatcode.com) جواب منو دادن.
گفتن که می تونید قبل و بعد دستور SELECT یک تایم بزارید و نتیجه را با دستور TOP و بدون دستور TOP مشاهده کنید.
یعنی اینکه با دستور TOP در جدولی که رکوردهای زیادی دارد تفاوت سرعت قابل لمس هست.
خوب اون دوستمون این دلیل را آورده است.

میشه بدونم اون دوست شما چه دلیل و مرجعی اوردن که ثابت میکنه کد دستور
Top 1
در بیشتر شدن سرعت جستجو کارایی داره.

کد دستور " Select Top N " فقط برای محدود کردن ردیف های نمایش است=>
اگر خروجی یک دستور Select باید 5000 ردیف را نمایش دهد با اضافه کردن کد Top 1 به اون فقط یک ردیف را نمایش میدهد و این حجم داده خروجی را کم کرده و
سرعت نمایش
را بیشتر میکند و نه
جستجو.


ما مطمئن نیستم مثلا با دستور
SELECT TOP 1 * FROM table_name WHERE ID = 1
بعد از پیدا کردن اولین نتیجه کار کوئری به پایان می رسد یا نه.
خروجی کد دستور شما چند ردیف داره و آیا خودتون امتحان کرده اید نوشته دوست تون رو تا به بینید چه کارایی داره .
چه کسی به شما گفته روش جستجوی موتور پایگاه داده SQL به صورت پیمایش ردیف ها از ابتدا تا انتها است که شما دنبال توقف جستجو هستید.

اگر روش کار ایندکس ها و کارایی اون در جستجو رو می خوندید=>
جستجوی درختی و دودویی نمی آید همه ردیف ها را پیمایش کند و با بخش کردن ردیف به ردیف مورد نظر می رسد.

***
طبق بررسی‌هایی که کارشناسان مایکروسافت انجام داده‌اند، کارایی یک سیستم بانک اطلاعاتی به پنج عامل مختلف بستگی دارد که به ترتیب اهمیت عبارتند از:
برنامه نوشته شده، پایگاه داده موردنظر، سخت‌افزار سرور یا کلاینت، تنظیمات و نسخه مورد استفاده SQL Server و سیستم‌عامل ویندوز.
***
=>
ساختار پایگاه داده، برای کارایی سیستم، در رتبه دوم اهمیت قرار‌دارد. بنابراین ایجاب می‌کند که در زمان تحلیل و طراحی سیستم، به‌صورت ویژه‌ به بانک اطلاعاتی در‌حال ساخت توجه شود و رابطه بین این بانک و برنامه‌های کاربردی و همچنین رابطه بین اجزای مختلف درون بانک، به بهترین شکل ممکن طراحی و پیاده‌سازی شود.

به طور کلی برای افزایش سرعت یک بانک اطلاعاتی می‌توان به دو روش اقدام کرد.
در واقع پنج عامل مورد اشاره در بالا‌، به دو دسته طولی و عرضی تقسیم‌بندی می‌شوند. در توسعه طولی که در اصطلاح انگلیسی به Scalp up نیز شناخته می‌شود، مدیر سیستم با صرف هزینه‌، به ارتقای سخت‌افزار (مثل پردازنده‌ها یا هارددیسک‌ها) یا به‌طورکلی ایجاد شبکه‌ای سریع‌تر اقدام می‌نماید یا مثلاً سیستم‌عامل خود را به نسخه‌ای جدیدتر و پایدارتر ارتقا می‌دهد. اما در روش عرضی (Scale out) تقریباً با حفظ همان سخت‌افزار و ساختار شبکه، به بهینه‌سازی روابط موجود میان عناصر دخیل در سرعت مثل برنامه‌های کاربردی، بانک اطلاعاتی و سرور اقدام می‌کند.

=>شما بهتره در این مورد ها جستجو نمایید و بخونید تا بهتر بتونید به خواسته خودتون برسید.

behzadkhan
یک شنبه 17 خرداد 1394, 19:30 عصر
میشه بدونم اون دوست شما چه دلیل و مرجعی اوردن که ثابت میکنه کد دستور
Top 1
در بیشتر شدن سرعت جستجو کارایی داره.

کد دستور " Select Top N " فقط برای محدود کردن ردیف های نمایش است=>
اگر خروجی یک دستور Select باید 5000 ردیف را نمایش دهد با اضافه کردن کد Top 1 به اون فقط یک ردیف را نمایش میدهد و این حجم داده خروجی را کم کرده و
سرعت نمایش
را بیشتر میکند و نه
جستجو.


خروجی کد دستور شما چند ردیف داره و آیا خودتون امتحان کرده اید نوشته دوست تون رو تا به بینید چه کارایی داره .
چه کسی به شما گفته روش جستجوی موتور پایگاه داده SQL به صورت پیمایش ردیف ها از ابتدا تا انتها است که شما دنبال توقف جستجو هستید.

اگر روش کار ایندکس ها و کارایی اون در جستجو رو می خوندید=>
جستجوی درختی و دودویی نمی آید همه ردیف ها را پیمایش کند و با بخش کردن ردیف به ردیف مورد نظر می رسد.

***
طبق بررسی‌هایی که کارشناسان مایکروسافت انجام داده‌اند، کارایی یک سیستم بانک اطلاعاتی به پنج عامل مختلف بستگی دارد که به ترتیب اهمیت عبارتند از:
برنامه نوشته شده، پایگاه داده موردنظر، سخت‌افزار سرور یا کلاینت، تنظیمات و نسخه مورد استفاده SQL Server و سیستم‌عامل ویندوز.
***
=>
ساختار پایگاه داده، برای کارایی سیستم، در رتبه دوم اهمیت قرار‌دارد. بنابراین ایجاب می‌کند که در زمان تحلیل و طراحی سیستم، به‌صورت ویژه‌ به بانک اطلاعاتی در‌حال ساخت توجه شود و رابطه بین این بانک و برنامه‌های کاربردی و همچنین رابطه بین اجزای مختلف درون بانک، به بهترین شکل ممکن طراحی و پیاده‌سازی شود.

به طور کلی برای افزایش سرعت یک بانک اطلاعاتی می‌توان به دو روش اقدام کرد.
در واقع پنج عامل مورد اشاره در بالا‌، به دو دسته طولی و عرضی تقسیم‌بندی می‌شوند. در توسعه طولی که در اصطلاح انگلیسی به Scalp up نیز شناخته می‌شود، مدیر سیستم با صرف هزینه‌، به ارتقای سخت‌افزار (مثل پردازنده‌ها یا هارددیسک‌ها) یا به‌طورکلی ایجاد شبکه‌ای سریع‌تر اقدام می‌نماید یا مثلاً سیستم‌عامل خود را به نسخه‌ای جدیدتر و پایدارتر ارتقا می‌دهد. اما در روش عرضی (Scale out) تقریباً با حفظ همان سخت‌افزار و ساختار شبکه، به بهینه‌سازی روابط موجود میان عناصر دخیل در سرعت مثل برنامه‌های کاربردی، بانک اطلاعاتی و سرور اقدام می‌کند.

=>شما بهتره در این مورد ها جستجو نمایید و بخونید تا بهتر بتونید به خواسته خودتون برسید.



با سلام

دوست عزیز

خیلی ممنون (البته یه خورده عصبانی شدید).

الان بهتر شد .

الان موردی که بیشتر نظر منو جلب کرد و به عنوان دلیل قبول کردم. نوشته زیر:


چه کسی به شما گفته روش جستجوی موتور پایگاه داده SQL به صورت پیمایش ردیف ها از ابتدا تا انتها است که شما دنبال توقف جستجو هستید.


بود. این نوشته دید منو بازتر کرد. (یعنی یک جورایی دارم متوجه شدم که چرا شما از اول درباره ایندکس ها اصرار داشتید.)

بنابراین برای درک عمیق تر نیاز به توضیح بیشتری دارم.

شاید ایم موارد برای شما ساده باشد. اما برای من اینطور نمی باشد.

لطفا این مورد را بیشتر توضیح دهید.

همچنین

آن لینک هایی که درباره ایندکس در پست قبلی ارسال کردید ار همان موقع مطالعه کردم.

اون پنج عامل هم که گفتید جالب بود.

در مورد نوشته زیر:



=>شما بهتره در این مورد ها جستجو نمایید و بخونید تا بهتر بتونید به خواسته خودتون برسید.


هم باید بگم که خیلی تحقیق نکردم و وقتی نتونستم به نتیجه بگیرم. در چند جا اونو مطرح کردم و نتیجه را هم که در همین تاپیک گذاشته ام.

بنابراین باز هم از شما خواستارم که بیش از این در این مورد:


چه کسی به شما گفته روش جستجوی موتور پایگاه داده SQL به صورت پیمایش ردیف ها از ابتدا تا انتها است که شما دنبال توقف جستجو هستید.


توضیح دهید.

با تشکر