PDA

View Full Version : بهترین روش چک کردن وجود یک کد در 10 جدول



rezaei manesh
شنبه 09 تیر 1386, 12:21 عصر
سلام
من یک ID رو در حدود 10 جدول کوچک و بزرگ ذخیره می کنم حالا نیاز به این دارم که بدون آیا اصلا id مثلا 10 آیا تویه یکی از این جدوال استفاده شده است یا نه ؟
یک روش اینه که من برای هر جدول یک count جدا گانه بگیرم و..
یک روش اینه که همه جداول رو با هم بر اساس همین کد ارتباط بدم (دو طرفه) بعد count بگیرم که بدترین روش هست که اگه جدول بزرگ باشه ، فاتحه و...
آیا روش استانداردی برای این کار وجود داره
من بهتیرن روش که الان به ذهنم می رسه اینه که تو یه sp تک تک count بگیرم به اولین مقدار که رسیدم خارج بشم حالا می تونم از جداولی که امکان وجود id در اون بیشتر هست شروع کنم و..

حمیدرضاصادقیان
شنبه 09 تیر 1386, 19:17 عصر
فکر نمیکنم نیازی اصلا به count باشه .شما جداولت رو براساس فقط فیلد همون id انتخاب کن و باهم join کن و در شرطت هم شماره id رو بده بعید میدونم از این ساده تر بشه. هم سریع هست هم فقط شما یک فیلد رو داری انتخاب میکنی.هم نیازی به اسکن کل جدولت نیست.

mzjahromi
شنبه 09 تیر 1386, 19:54 عصر
اگه اشتباه نکنم منظورتون اینه


Select * From Table1 T1 where ID In(Select ID From Table2 T2 where T1.ID=T2.ID)

البته با Join هم میشه

rezaei manesh
یک شنبه 10 تیر 1386, 08:00 صبح
سلام
من اول از همین روش join استفاده کردم البته full join اما اگه دقت کنید هم رکورد های همه جداول در سلکت می آیند که خیلی بزرگ می شه و Time out می ده و...
اگه بگین چرا full join که می گم که چون امکان داره این id در بعضی از جدوال وجود نداشته باشه
اکه جوین کنم اگه حتی تو یکی از جداول وجود نداشته باشه کانت برابر صفر می شه که من اینو نمی خوام می می خوام بدونم که ایا این id اصلا استفاده شده یا نه و...
روش جناب مدیر هم مثل join عمل می کنه فکر کنم و..
با تشکر از توجه تان

ab_ba
یک شنبه 10 تیر 1386, 08:55 صبح
select count(*) from tabel1 where id = K
union
select count(*) from tabel2 where id = K
union
select count(*) from tabel3 where id = K
.
.
.
بعد در فیلدهایی که عدد هست و صفر نیست Table مربوطه حاوی عدد مورد نظر شماست

rezaei manesh
یک شنبه 10 تیر 1386, 09:11 صبح
این جوری باز از روش های بالا خیلی بهتره
حالا چطوری یک مقدار در خروجی داشته باشم
می شه sum گرفت مثلا


select sum(cnt) from (select count(*) as cnt from tbla where id=k
union
....
)

FirstLine
یک شنبه 10 تیر 1386, 11:12 صبح
با سلام
اگر عبارت

count(*)
با عبارت مثلا

count(id)
عوض بشود ایا در سرعت تاثیری دارد یا خیر؟
با تشکر

rezaei manesh
یک شنبه 10 تیر 1386, 11:20 صبح
من یه جایی شندیدم که (*)count یکمی از(نام یک فیلد)count بهتر است

reza_rad
یک شنبه 10 تیر 1386, 11:30 صبح
به این نکته هم توجه کنید:


Count vs. Exists
Do not use the count aggregate in a subquery to do an existence check:

select *
from tab
where 0 < (select count(*) from tab2 where ...)
Instead, use exists (or in):

select *
from tab
where exists (select * from tab2 where ...)
Using count to do an existence check is slower than using exists.

When you use count, SQL Server does not know that you are doing an existence check. It counts all matching values, either by doing a table scan or by scanning the smallest nonclustered index.

When you use exists, SQL Server knows you are doing an existence check. When it finds the first matching value, it returns TRUE and stops looking. The same applies to using count instead of in or any.



http://www.lcard.ru/~nail/sybase/perf/18295.htm

حمیدرضاصادقیان
یک شنبه 10 تیر 1386, 11:52 صبح
Count(*) به دلیل اینکه یکبار کل جدول رو Scan میکنه خیلی روی سرعت تاثیر میگذاره.خوب از outer join هم نمیتونی استفاده کنی. از full outer join استفاده کنید در هرکدوم هم نبود مقدار null بر میگردونه.و در select هم نیازی نیست همه فیلدهارو انتخاب کنید فقط نام فیلدid رو ذکر کنید بعد هم در where براساس شماره فیلد میتونی فیلترش کنی که سرعتت خیلی میره بالا.

rezaei manesh
یک شنبه 10 تیر 1386, 12:17 عصر
آقای صادقیان من اولین بار از همین روش استفاده کردم اما بدترین روش ممکن هست و سیستم رو به time out می ببره و...

جناب راد من قبلا می خواستم در این چنین مواقع ای ای exits استفاده کنم اما نمی تونستم فقط در sp از این روش استفاده می کنم چطوری من با استفاده از روش شما فقط یک عدد برگردونم ؟
این خط رو چطور تغییر بدم ؟
select * from tab

reza_rad
یک شنبه 10 تیر 1386, 13:08 عصر
جناب راد من قبلا می خواستم در این چنین مواقع ای ای exits استفاده کنم اما نمی تونستم فقط در sp از این روش استفاده می کنم چطوری من با استفاده از روش شما فقط یک عدد برگردونم ؟
این خط رو چطور تغییر بدم ؟
select * from tab
با استفاده از چند سلکت تو در تو...
اینجوری مثلا:


select * from table1
where exists
(

select * from table2
where exists
(

select * from table3
where exists
(
...
)
and table3.id='k'
)
and table2.id='k'
)
and table1.id='k'


و حالا هر وقت خروجی داشتید یعنی این id در تمام جدولها هست.

rezaei manesh
یک شنبه 10 تیر 1386, 13:21 عصر
من نمی خوام در همه جدول ها باشه من می خوام بدونم در حداقل دریکی از جدول ها هست یا نه؟

reza_rad
یک شنبه 10 تیر 1386, 13:28 عصر
من نمی خوام در همه جدول ها باشه من می خوام بدونم در حداقل دریکی از جدول ها هست یا نه؟
پس اینجوری میشه:



select * from tableX
where exists

(
select * from table1
where id='k'
)
or exists

(
select * from table2
where id='k'
)
or exists
...

AminSobati
یک شنبه 10 تیر 1386, 23:53 عصر
روش بالا خوبه فقط یادتون باشه حتما روی همه جداولی که چک میکنین، این ایندکس رو داشته باشین:


create nonclustered index ix1 on table1(id)
go
create nonclustered index ix1 on table2(id)
go
create nonclustered index ix1 on table3(id)
...