PDA

View Full Version : سوال: نوشتن اسامی ستونها بهتر است یا*



Iran58
جمعه 22 مرداد 1389, 12:10 عصر
سلام
نوشتن کدام حالت بهتراست
الف)اسامی همه ستونها را بنویسیم

select Name,Famliy,tel from tbl1ب)

select * from tbl1لطفا علت را هم بیان فرمایید
باتشکر

sia_2007
جمعه 22 مرداد 1389, 12:12 عصر
نوشتن اسم تمامی ستونها

محمد سلیم آبادی
جمعه 22 مرداد 1389, 12:31 عصر
نوشتن اسم تمامی ستونها

ذکر کردن نام تمام ستون ها بطور صریح چه مزیتی نسبت به استفاده از * می تونه داشته باشه؟

pezhvakco
جمعه 22 مرداد 1389, 12:41 عصر
درود :
هنگامی که همه ستون رو می خواییم در خروجی داشته باشیم، نوشتن نام همه اون ها یعنی استفاده نکردن از امکانات .

بدرود .

m.hamidreza
جمعه 22 مرداد 1389, 12:58 عصر
نوشتن اسامی فیلدها بهتر از * هست. کاربردش آینده نگری برای Replication هست.
موفق باشید.

pezhvakco
جمعه 22 مرداد 1389, 13:24 عصر
کاربردش آینده نگری برای Replication هست.
میشه یکم بیش تر توضیح بدین (آینده چه کار رو نمیشه با * انجام داد با بهتره انجام نداد )؟

sohrab o
جمعه 22 مرداد 1389, 14:33 عصر
به نظر من هیچ فرقی نداره

MOJTABAATEFEH
جمعه 22 مرداد 1389, 14:42 عصر
اینجوری من شنیدم نوشتن نام ستونها به خاطر تشخیص بهتر سرور سرعت بالاتری رو فرمان میدن


موفق باشید

sia_2007
جمعه 22 مرداد 1389, 15:03 عصر
فرض کنید؛ یک SP دارید؛ که محتوای یک جدول ( جدول شماره یک ) با 7 ستون را میخواند؛ و پس از قرار دهی رکوردهای خوانده شده؛ و انجام محاسبات بر روی Temp Table در 70 الی 80 خط کد؛ آنرا در یک جدول دیگر میریزد.
خب اگر جدول شماره یک؛ یک ستون بهش اظافه بشه چی میشه ؟
در این 70 خط کد چندین جا؛ مستعد برای خطا هستند چون ما Select * کرده ایم.
و جالب این جاست که این SP یکی از 3 SP تایید پرداخت الکترونیکی بوده؛ و به علت این اشتباه 8 نفر در لحظاتی کوتاه دچار ابطال خرید شده اند؛ در سیستم ما؛ در حالی که از پولشون کم شده.
من دارم در مورد یک سیستم حرف میزنم که نه SP نه Table و نه Fun هاش رو نمیشه با Object Explorer دید؛ و باید از Object Explorer Detail استفاده کنیم.
در این سیستم خیلی خیلی بزرگ یک نفر در جایی به جدول شماره یک ؛ یه ستون اظافه کرده؛ و در SP ای در یک زیر سیستم دیگه مشکل پیش اومده.
نمیدونم چطور اینها رو با هم یکی میدونید؛ Select با نام تمامی ستونها؛ یعنی تمام ستونها در لحظه ای که کوئری نوشته میشه؛ و فقط و فقط در همون لحظه؛ اگه بعدن به جدول یه ستون اظافه بشه؛ باز هم همون 7 تاست؛ در حالی که Select * یعنی تمام ستون ها برای همیشه.
مطمئن باشید؛ SELECT * استفاده از امکانات نیست؛ بلکه این همه کتاب و فیلم آموزشی زبان اصلی و رایگان که در اختیار ما هستش؛ امکانات نام داره؛ تا ما فکر نکنیم SQL Server ؛ به اسم ستونها برای سرعت بیشتر نیاز داره؛ اون اسمها برای برنامه نویس و آدمی هستند و از نظر کامپیوتر بی معنی هستند و در لحظه اجرا ؛ اصلا اسامی وجود ندارند؛ خوندن قسمتهایی از کتاب SQL Server 2008 Internals رو به شما دوست عزیز پیشنهاد میکنم؛
این رو بعد از 4 ساعت تلاش برای این که بفهمیم از کجا داریم ضربه میخوریم نوشتم
شما به کار بگیرید؛ من خودم همیشه به کار میگیرم؛ چون واقعا فرق دارن؛ اما وقتی یکی این رو نمیدونه این طوری به اطرافیاش ضربه میزنه
موفق باشید

sia_2007
جمعه 22 مرداد 1389, 15:11 عصر
البته گاهی ما همه ستونها رو به علاوه اونهایی که بعدن اظافه میشن رو میخواهیم, بدیهی است که در این صورت تنها راه حل مناسب SELECT * است

sohrab o
جمعه 22 مرداد 1389, 15:27 عصر
فرض کنید؛ یک SP دارید؛ که محتوای یک جدول ( جدول شماره یک ) با 7 ستون را میخواند؛ و پس از قرار دهی رکوردهای خوانده شده؛ و انجام محاسبات بر روی Temp Table در 70 الی 80 خط کد؛ آنرا در یک جدول دیگر میریزد.
خب اگر جدول شماره یک؛ یک ستون بهش اظافه بشه چی میشه ؟
در این 70 خط کد چندین جا؛ مستعد برای خطا هستند چون ما Select * کرده ایم.
و جالب این جاست که این SP یکی از 3 SP تایید پرداخت الکترونیکی بوده؛ و به علت این اشتباه 8 نفر در لحظاتی کوتاه دچار ابطال خرید شده اند؛ در سیستم ما؛ در حالی که از پولشون کم شده.
من دارم در مورد یک سیستم حرف میزنم که نه SP نه Table و نه Fun هاش رو نمیشه با Object Explorer دید؛ و باید از Object Explorer Detail استفاده کنیم.
در این سیستم خیلی خیلی بزرگ یک نفر در جایی به جدول شماره یک ؛ یه ستون اظافه کرده؛ و در SP ای در یک زیر سیستم دیگه مشکل پیش اومده.
نمیدونم چطور اینها رو با هم یکی میدونید؛ Select با نام تمامی ستونها؛ یعنی تمام ستونها در لحظه ای که کوئری نوشته میشه؛ و فقط و فقط در همون لحظه؛ اگه بعدن به جدول یه ستون اظافه بشه؛ باز هم همون 7 تاست؛ در حالی که Select * یعنی تمام ستون ها برای همیشه.
مطمئن باشید؛ SELECT * استفاده از امکانات نیست؛ بلکه این همه کتاب و فیلم آموزشی زبان اصلی و رایگان که در اختیار ما هستش؛ امکانات نام داره؛ تا ما فکر نکنیم SQL Server ؛ به اسم ستونها برای سرعت بیشتر نیاز داره؛ اون اسمها برای برنامه نویس و آدمی هستند و از نظر کامپیوتر بی معنی هستند و در لحظه اجرا ؛ اصلا اسامی وجود ندارند؛ خوندن قسمتهایی از کتاب SQL Server 2008 Internals رو به شما دوست عزیز پیشنهاد میکنم؛
این رو بعد از 4 ساعت تلاش برای این که بفهمیم از کجا داریم ضربه میخوریم نوشتم
شما به کار بگیرید؛ من خودم همیشه به کار میگیرم؛ چون واقعا فرق دارن؛ اما وقتی یکی این رو نمیدونه این طوری به اطرافیاش ضربه میزنه
موفق باشید

اما بازم در شرایط عادی که قرار نیست فیلدی اضافه بشه بهتره نام فیلد ها ذکر بکنیم؟

sia_2007
جمعه 22 مرداد 1389, 16:07 عصر
اگر تحلیل ما رو به این مرحله برسونه که ما از 7 تا ستون؛ 7 تاش رو میخواهیم و نه بقیه رو که بعدا اظافه میشوند؛ باید به صورت نوشتن تمامی ستونها عمل کنیم.
عدم رعایت این نکته؛ در 2 مرحله به ما ضربه میزنه؛ یکی این که کوئری خودمون رو به ساختار جدول وابسته کردیم؛ و بعدا در تغییر جدول باید کوئری رو که ممکنه در یه SP باشه؛ یا Fun رو هم باید عوض کنیم.
و اگر متن کوئری تو DLL های کلاینت باشه؛ باید DLL رو عوض کنیم.
و یا ممکنه تغییر رو بدیم ؛ و بعدا خطا دریافت کنیم.
در سیستمهای بزرگ شدت ضربه بیشتر هستش؛ چون اشکال یابی بسیار سخت تر هست.
اما در هر سیستمی این ضربات رو وارد میکنه؛ دقیقا به همین دلیل هستش که ما میآییم و از Abstraction Layer بین ساختار و کوئریهایمان استفاده میکنیم.

Modifier
جمعه 22 مرداد 1389, 16:20 عصر
دقیقا به همین دلیل هستش که ما میآییم و از Abstraction Layer بین ساختار و کوئریهایمان استفاده میکنیم.

توی طراحی دیتا بیس هم از لایه استفاده میکنیم؟؟
Abstraction Layer چی هست؟

ممنون.
یاعلی.

sia_2007
جمعه 22 مرداد 1389, 21:22 عصر
در مورد پیاده سازی Abstraction Layer ؛ یک کتاب عالی وجود داره.
Abstraction Layer لایه ای هستش که از تغییر Data Access Layer به خاطر تغییر در دیتابیس جلوگیری میکنه.
برای مثال فرض کنید؛ اطلاعات یکی از جداول مورد نیاز ما تو Remote Server هستش؛ و خب باید برای دسترسی بهش از Linked Server استفاده کنیم؛ خب بعد مدتی تصمیم میگیریم اون جدول رو هم بیاریم تو دیتابیس خودمون
برای این کار ما رو تحت تاثیر قرار نده؛ از لایه Abstract استفاده میکنیم.
حال یا View و یا Synonym و یا فایل XML خود OR/Mapper مون و ...
البته این مسئله تو Server هندل بشه بهتره.
در کل باید هر چه میتونیم از Synonym به جای نام جداول استفاده کنیم؛ مخصوصا اونها که در معرض تغییر هستند.
این فقط یه مثال ساده بود؛ در کل مسئله یک مقدار فراتر از این حرفهاست

meysam_pro
جمعه 22 مرداد 1389, 21:48 عصر
# SELECT * FROM Production.TransactionHistoryArchive
# WHERE ReferenceOrderID < 100
#
# SELECT ReferenceOrderLineID FROM Production.TransactionHistoryArchive
# WHERE ReferenceOrderID < 100
http://vahid.nasiri.googlepages.com/explan.png

البته سر این حرف اختلاف نظر هم هست به طور مثال (http://sql-server-performance.com/Community/forums/p/2430/13904.aspx)
اطلاعات بیشتر رو اینجا بخونید. (http://vahidnasiri.blogspot.com/2008/11/select.html)

sia_2007
شنبه 23 مرداد 1389, 08:37 صبح
در اولی کل ستونها فراخونی شده؛ و تو دومی فقط یکی ؛ که از قضا روش ایندکس هم بوده؛
این نتیجه کاملا قابل پیش بینی هستش.
ایشون از زاویه دیگه ای معایب SELECT * رو نشون دادند

meysam_pro
شنبه 23 مرداد 1389, 13:42 عصر
در اولی کل ستونها فراخونی شده؛ و تو دومی فقط یکی ؛ که از قضا روش ایندکس هم بوده؛
این نتیجه کاملا قابل پیش بینی هستش.

خب پس مشکل چیه؟
دوستان لطفا به لینکها توجه بکنن.

محمد سلیم آبادی
شنبه 23 مرداد 1389, 18:14 عصر
خب پس مشکل چیه؟
دوستان لطفا به لینکها توجه بکنن.

مساله این هست که اگر جدول ما 3 ستون داره برای نمایش دادن مقادیر تمام ستونها بهتر هست بطور صریح نام هر سه را ذکر کنیم یا از کاراکتر ستاره کمک بگیریم.

sia_2007
شنبه 23 مرداد 1389, 18:54 عصر
هیچ مشکلی وجود نداره؛ در اصل خواسته شده تا کمی به نحوه ی اجرای کوئری در SQL Server پرداخته بشه.
در اولی یک ستون و در دومی کل ستونها فراخونی شده اند.
مسئله همینی هست که Salim جان میفرمایند.
جدول ما سه تا ستون داره؛ اسم هر 3 تاش رو بنویسیم؛ یا * بذاریم ؟
من نظرم روی نوشتن تمامی نام ها هستش؛ دلایلم رو هم عرض کردم.
در صورتی * رو مینویسیم که بخواهیم اگر این 3 تا ستون شد 4 تا؛ بخواهیم ستون چهارم هم به صورت خودکار خونده بشه.