titbasoft
شنبه 03 اردیبهشت 1384, 13:48 عصر
کدامیک از دو query زیر رو پیشنهاد می کنید.
SELECT fname,1 status FROM t1 WHERE t1.cx IN (select t2.cx from t2 where t2.c1='1') AND t1.cy='v1'
UNION
SELECT fname,2 status FROM t1 WHERE t1.cx IN (select t3.cx from t3 where t3.c1='1') AND t1.cy='v2'
SELECT fname,status =
(case
when t1.cx IN (select t2.cx from t2 where t2.c1='1') AND t1.cy='v1' then 1
when t1.cx IN (select t3.cx from t3 where t3.c1='1') AND t1.cy='v2' then 2
end
) from t1
البته حالتهای شرطی ما خیلی بیشتره به عبارت دیگر در قسمت case حالتهای زیادی رو باید بررسی کنیم که بعضی هاشون نیازمند scan کردن یک جدول دیگه هم هست. علت اصلی شک من هم برای گزینه اول اینه که در گزینه دوم درسته که در query اصلی (جدول t1) یکبار scan انجام میشه اما در داخل قسمت case تعداد زیادی scan انجام میشه که مطمئن هستیم بهشون نیازی نیست. توجه کنید که در query اولی ابتدا رکورد ها محدود شده اند و بعد مثلا به تعداد نصف رکوردهای جدول t1 جدول t2 اسکن میشه و بعد باز هم به اندازه نصف رکوردهای t1 جدول t3 اسکن میشه ، این در حالی است که در query دومی به اندازه کل رکوردهای t1 جداول t2 و t3 اسکن میشن.
SELECT fname,1 status FROM t1 WHERE t1.cx IN (select t2.cx from t2 where t2.c1='1') AND t1.cy='v1'
UNION
SELECT fname,2 status FROM t1 WHERE t1.cx IN (select t3.cx from t3 where t3.c1='1') AND t1.cy='v2'
SELECT fname,status =
(case
when t1.cx IN (select t2.cx from t2 where t2.c1='1') AND t1.cy='v1' then 1
when t1.cx IN (select t3.cx from t3 where t3.c1='1') AND t1.cy='v2' then 2
end
) from t1
البته حالتهای شرطی ما خیلی بیشتره به عبارت دیگر در قسمت case حالتهای زیادی رو باید بررسی کنیم که بعضی هاشون نیازمند scan کردن یک جدول دیگه هم هست. علت اصلی شک من هم برای گزینه اول اینه که در گزینه دوم درسته که در query اصلی (جدول t1) یکبار scan انجام میشه اما در داخل قسمت case تعداد زیادی scan انجام میشه که مطمئن هستیم بهشون نیازی نیست. توجه کنید که در query اولی ابتدا رکورد ها محدود شده اند و بعد مثلا به تعداد نصف رکوردهای جدول t1 جدول t2 اسکن میشه و بعد باز هم به اندازه نصف رکوردهای t1 جدول t3 اسکن میشه ، این در حالی است که در query دومی به اندازه کل رکوردهای t1 جداول t2 و t3 اسکن میشن.