آیا هنوز گیر کردهاید؟
چه کاری انجام دهید وقتی پرسوجوی شما دادههایی که اشتباه به نظر میرسند برمیگرداند.
عیبیابی منطق پرسوجوی SQL
چه کاری انجام دهید وقتی پرسوجوی شما دادههایی که اشتباه به نظر میرسند برمیگرداند.
ترکیب داده میتواند خیلی سریع پیچیده شود (احتمالاً به همین دلیل است که صبورانه SQL مینویسید به جای استفاده از query builder دوستانه). این راهنمای عیبیابی توضیح میدهد چه کاری میتوانید انجام دهید وقتی پرسوجوی شما نتایج غیرمنتظره برمیگرداند.
مراحل عیبیابی
- اگر از جداول پایگاه داده خود استفاده میکنید، schemaها را از مرجع داده دریافت کنید.
- اگر از پرسوجوهای تودرتو مثل زیرپرسوجوها، CTEها، سؤالهای ذخیره شده، یا مدلها استفاده میکنید، باید هر پرسوجوی تودرتو را به طور جداگانه اجرا کنید و نتایج را به صورت دستی بررسی کنید.
- نمیدانم آیا از یک پرسوجوی تودرتو استفاده میکنم.
- Schemaها را برای منابع داده استفاده شده در پرسوجوی خود دریافت کنید.
- آیا بیش از یک کلید خارجی ممکن وجود دارد؟
- آیا کلیدهای خارجی تغییر نام دادهاند یا به schema دیگری منتقل شدهاند؟
- اگر مطمئن نیستید، از شخصی که schema را نگهداری میکند بپرسید.
- کلیدهای خارجی جداول یا پرسوجوهای تودرتو خود را مرور کنید.
- برای مشکلات رایج منطق SQL بررسی کنید.
دلایل رایج برای نتایج پرسوجوی غیرمنتظره
منطق SQL نحوه ترکیب داده از جداول یا منابع داده مختلف (شامل جداول موقت، مثل نتایج پرسوجوهای دیگر) را توصیف میکند. رایجترین راههای ترکیب داده joinها و پرسوجوهای تودرتو هستند.
حتی اگر منطق SQL شما قبلاً کار میکرد، میتواند زمانی که:
- جداول یا منابع داده تغییر کردهاند.
- پرسوجوهای تودرتو تغییر کردهاند (اگر بر اساس یک سؤال ذخیره شده یا مدل میسازید).
- پرسوجوهای تودرتو شما همانطور که انتظار دارید محاسبه نمیشوند (اگر آنها را از ابتدا نوشتهاید).
- داده شما شامل موارد لبه، مثل مقادیر خالی یا
NULLاست.
خراب شود.
بیشتر اوقات، این تغییرات به صورت upstream توسط سیستمهایی که داده شما را جمعآوری میکنند، یا افرادی که پایگاههای داده و ابزارهای BI شما را مدیریت میکنند معرفی میشوند.
برای تیمها پیشبینی اثرات موجی از چنین تغییراتی بسیار دشوار است. رفع منطق SQL نه تنها درباره پاسخ به تغییر است، بلکه بهروزرسانی رویکرد شما برای محافظت بهتر در برابر بهروزرسانیهای آینده است.
اگر یک پیام خطای قرمز دریافت میکنید که به بندهای SQL یا نام جدول و ستون اشاره میکند، به احتمال زیاد مشکل نحو SQL دارید. به جای آن به عیبیابی نحو SQL بروید.
مشکلات رایج منطق SQL
- نتیجه من داده تکراری دارد.
- نتیجه من داده گمشده دارد.
- تجمیعهای من (شمارشها، مجموعها و غیره) اشتباه هستند.
نتایج تجمیع شده (شمارشها، مجموعها و غیره) اشتباه هستند
- خیلی بالا، بررسی کنید که آیا جداول یا پرسوجوهای منبع شما ردیفهای تکراری دارند.
- خیلی پایین، بررسی کنید که آیا جداول یا پرسوجوهای منبع شما ردیفهای گمشده دارند.
- اگر تجمیعهای شما:
- چگونه ردیفهای خالی یا
NULLرا در تجمیعهای خود مدیریت میکنید؟ - چگونه رکوردهای نامعتبر، لغو شده یا منقضی شده را مدیریت میکنید؟ از مدیر متابیس یا تیم داده خود درباره منطق تجاری که ممکن است از آن اطلاع نداشته باشید بپرسید.
- جداول یا پرسوجوهای منبع خود را برای فیلترها بررسی کنید.
- به عنوان مثال، اعمال
SUMرویCOUNT_DISTINCTممکن است مقادیر منحصر به فرد را دو بار بشمارد.
- اگر با
COUNT_DISTINCTکار میکنید، بررسی کنید که آیا با توابع تجمیع دیگر تعامل دارد. - اگر با داده سری زمانی کار میکنید، منطقه زمانی خود را بررسی کنید.
- اگر داده شما طبق برنامه بهروز میشود، از مدیر متابیس خود بپرسید آیا جداول شما بهروز هستند.
توضیح
تجمیعها اغلب اولین جایی هستند که یک مشکل ناشی از یکی از دلایل رایج برای نتایج پرسوجوی غیرمنتظره را تشخیص میدهید. مراحل بالا به شما کمک میکند هر مورد لبه داده که ممکن است نتایج شما را کج کند را بگیرید. اگر موارد لبه زیادی پیدا کردید، و انتظار دارید همان موارد را بارها و بارها مدیریت کنید، ممکن است بخواهید همه آن منطق را در یک مدل بستهبندی کنید تا به راحتی قابل استفاده مجدد باشد.
گاهی اوقات، ممکن است فقط به یک جفت چشم تازه نیاز داشته باشید. اگر نمیتوانید علت اصلی را با استفاده از مراحل بالا پیدا کنید، از یک همتیمی بخواهید به شما کمک کند ریاضیات خود را بررسی کنید!
مطالعه بیشتر
نحوه شناسایی یک پرسوجوی تودرتو
اگر SQL شما شامل:
- بیش از یک عبارت
SELECTاست، از زیرپرسوجوها استفاده میکنید. - یک بند
WITHاست، از CTEها (عبارات جدول مشترک) استفاده میکنید. - نمادی که شبیه
{{ variable }}در بندFROMیاWITHشما به نظر میرسد است، یک متغیر SQL دارید که به یک سؤال ذخیره شده یا مدل ارجاع میدهد.
نحوه دریافت schema برای یک پرسوجوی تودرتو
- برای زیرپرسوجوها یا CTEها، هر بلوک
SELECTرا به طور جداگانه اجرا کنید و از بندLIMITاستفاده کنید. - برای سؤالهای ذخیره شده یا مدلها، به سؤال متابیس زیرین از پنل متغیرها یا با چسباندن شماره ID در نوار جستجو بروید. با استفاده از query builder یک محدودیت ردیف اضافه کنید، یا یک بند
LIMITدر ویرایشگر SQL اضافه کنید.
- نمونهای از داده از پرسوجوی تودرتو خود دریافت کنید.
- در پایگاه داده نمونه متابیس، جدول
Productsیک ستونIDدارد، و جدولOrdersیک ستونProduct IDدارد. IDوProduct IDهر دو شامل مقادیر عدد صحیح هستند، و بسیاری از آن مقادیر در هر دو ستون ظاهر میشوند.
- نام ستونها و مقادیر را بین نمونههای خود مقایسه کنید تا کلیدهای خارجی را بررسی کنید. به عنوان مثال:
- جدول
Productsمقادیر منحصر به فرد در ستونIDدارد. - جدول
Ordersچندین ردیف با همانProduct IDدارد. - رابطه جدول از
ProductsبهOrdersیک به چند است (فرض میکنیم که رابطه کلید خارجی معتبر است).
- ردیفها را بین نمونههای خود مقایسه کنید تا رابطههای جدول را بررسی کنید. به عنوان مثال:
- اگر از یک مدل استفاده میکنید، میتوانید با hover کردن روی نام ستون به دنبال متادیتای به صراحت تعریف شده بگردید.
- اگر بر اساس کار شخص دیگری میسازید، از سازنده اصلی پرسوجو، سؤال ذخیره شده، یا مدل بپرسید.
توضیح
یک schema ستونها در یک جدول، انواع داده آن ستونها، و روابط بین ستونها در جداول مختلف را توصیف میکند. این متادیتا معمولاً به صراحت برای جداول ذخیره شده در پایگاه داده شما توسط افرادی که داده شما را مدیریت میکنند تعریف میشود.
از آنجایی که نتایج پرسوجوهای تودرتو فقط به طور موقت ذخیره میشوند، متادیتا درباره نتایج در هیچ جا تعریف یا ذخیره نمیشود. مراحل بالا به شما کمک میکند به جای آن نتایج پرسوجو را به صورت دستی بررسی کنید.
پس از اینکه schemaها را برای پرسوجوهای تودرتو خود دارید، میتوانید مراحل عیبیابی را دنبال کنید.
مطالعه بیشتر
- نحوه شناسایی یک پرسوجوی تودرتو
- Schema چیست؟
- رابطههای جدول پایگاه داده
- نحوه اجرای پرسوجوهای SQL توسط متابیس
آیا مشکل متفاوتی دارید؟
- تاریخها و زمانهای من اشتباه هستند.
- داده من بهروز نیست.
- یک خطای نحو SQL دارم.
- یک پیام خطا دارم که خاص پرسوجو یا نحو SQL من نیست.
آیا هنوز گیر کردهاید؟
جستجو کنید یا از جامعه متابیس بپرسید.