جداول تقسیم شده پرس و جو

ساخت وبلاگ

آخرین مطالب

امکانات وب

این سند برخی ملاحظات خاص را برای پرس و جو از جداول تقسیم شده در BigQuery شرح می دهد.

برای کسب اطلاعات کلی در مورد اجرای نمایش داده شدگان در BigQuery ، به نمایش داده های تعاملی و دسته ای مراجعه کنید.

بررسی اجمالی

اگر یک پرس و جو از یک فیلتر واجد شرایط در مقدار ستون پارتیشن بندی استفاده کند ، BigQuery می تواند پارتیشن هایی را که با فیلتر مطابقت دارند اسکن کرده و از پارتیشن های باقی مانده استفاده کنند. این فرآیند هرس پارتیشن نامیده می شود.

هرس پارتیشن مکانیسم BigQuery برای از بین بردن پارتیشن های غیر ضروری از اسکن ورودی است. پارتیشن های هرس در هنگام محاسبه بایت های اسکن شده توسط پرس و جو گنجانده نشده است. به طور کلی ، هرس پارتیشن به کاهش هزینه پرس و جو کمک می کند.

رفتارهای هرس برای انواع مختلف پارتیشن بندی متفاوت است ، بنابراین می توانید تفاوت در بایت های پردازش شده را هنگام پرس و جو جداول که متفاوت است ، مشاهده کنید اما در غیر این صورت یکسان هستند. برای تخمین اینکه تعداد پرس و جو چند بایت پردازش می کند ، یک اجرای خشک را انجام دهید.

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

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

در مثال زیر فرض کنید که DataSet. Table در ستون Transaction_Date تقسیم شده است. نمونه آلوهای پرس و جو قبل از 2016-01-01 تاریخ است.

یک جدول تقسیم شده در زمان مصرف را پرس و جو کنید

جداول پارتیشن بندی شده با زمان بندی حاوی یک ستون شبه به نام _partitiontime است که ستون پارتیشن بندی است. مقدار ستون زمان مصرف UTC برای هر ردیف است که به مرز پارتیشن (مانند ساعتی یا روزانه) کوتاه می شود ، به عنوان یک مقدار زمانی.

به عنوان مثال ، اگر داده ها را در 15 آوریل 2021 ، 08:15:00 UTC اضافه کنید ، ستون _partitiontime برای آن ردیف ها حاوی مقادیر زیر است:

  • جدول پارتیشن ساعتی: Timestamp ("2021-04-15 08:00:00")
  • جدول پارتیشن روزانه: Timestamp ("2021-04-15")
  • جدول پارتیشن ماهانه: Timestamp ("2021-04-01")
  • جدول پارتیشن سالانه: Timestamp ("2021-01-01")

اگر دانه بندی پارتیشن روزانه باشد ، جدول همچنین حاوی یک ستون شبه به نام _partitiondate است. مقدار برابر است با _partitiontime کوتاه شده به یک مقدار تاریخ.

هر دوی این نام های شبه ستون محفوظ هستند. شما نمی توانید ستونی با هر نام در هر یک از جداول خود ایجاد کنید.

برای هرس پارتیشن ها ، روی هر یک از این ستون ها فیلتر کنید. به عنوان مثال ، پرس و جو زیر فقط پارتیشن های بین تاریخ 1 ژانویه 2016 و 2 ژانویه 2016 را اسکن می کند:

برای انتخاب _partitiontime pseudo-column ، باید از نام مستعار استفاده کنید. به عنوان مثال ، پرس و جو زیر _partitiontime را با اختصاص Alias PT به شبه ستون انتخاب می کند:

برای جداول پارتیشن روزانه ، می توانید _partitiondate pseudo-column را به همان روش انتخاب کنید:

_partitiontime و _partitiondate شبه ستونها با بیانیه * انتخابی بازگردانده نمی شوند. شما باید آنها را صریح انتخاب کنید:

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

مقدار _partitionTime بر اساس تاریخ UTC هنگام جمع شدن این زمینه است. اگر می خواهید داده ها را بر اساس یک منطقه زمانی غیر از UTC پرس و جو کنید ، یکی از گزینه های زیر را انتخاب کنید:

  • برای اختلافات منطقه زمانی در نمایش داده های SQL خود تنظیم کنید.
  • از دکوراتورهای پارتیشن برای بارگذاری داده ها در پارتیشن های زمان خاص ، بر اساس یک منطقه زمانی متفاوت نسبت به UTC استفاده کنید.

عملکرد بهتر با ستون های شبه

برای بهبود عملکرد پرس و جو ، از _partitiontime pseudo-column به خودی خود در سمت چپ یک مقایسه استفاده کنید.

For example, the following two queries are equivalent. Depending on the table size, the second query might perform better, because it places _PARTITIONTIME by itself on the left side of the >اپراتور. هر دو نمایش داده شده به همان مقدار داده پردازش می کنند.

برای محدود کردن پارتیشن هایی که در یک پرس و جو اسکن شده اند ، از یک عبارت ثابت در فیلتر خود استفاده کنید. محدودیت پرس و جو زیر کدام پارتیشن ها بر اساس اولین شرایط فیلتر در بند WHERE هرس می شوند. با این حال ، شرط فیلتر دوم پارتیشن های اسکن شده را محدود نمی کند ، زیرا از مقادیر جدول استفاده می کند ، که پویا هستند.

برای محدود کردن پارتیشن های اسکن شده ، هیچ ستون دیگری را در یک فیلتر _PartitionTime قرار ندهید. به عنوان مثال ، پرس و جو زیر پارتیشن های اسکن شده را محدود نمی کند ، زیرا Field1 یک ستون در جدول است.

اگر غالباً از طیف وسیعی از زمان های خاص پرس و جو می کنید ، در نظر بگیرید که منظره ای را ایجاد کنید که در _PartitionTime Pseudo-Column فیلتر شود. به عنوان مثال ، بیانیه زیر دیدگاهی را ایجاد می کند که شامل هفت روز اخیر داده از جدول به نام Dataset. partitioned_table است:

برای اطلاعات در مورد ایجاد نماها ، به ایجاد نماها مراجعه کنید.

یک جدول تقسیم شده با دامنه عدد صحیح را پرس و جو کنید

برای هرس پارتیشن ها هنگام پرس و جو یک جدول تقسیم شده با دامنه عدد صحیح ، یک فیلتر را در ستون تقسیم بندی عدد صحیح قرار دهید.

در مثال زیر ، فرض کنید که DataSet. Table یک جدول تقسیم شده با دامنه عدد صحیح با مشخصات پارتیشن بندی مشتری_id: 0: 100: 10 است که مثال پرس و جو سه پارتیشن را که با 30 ، 40 و 50 شروع می شود ، اسکن می کند.

هرس پارتیشن برای توابع بیش از یک ستون تقسیم شده با محدوده عدد صحیح پشتیبانی نمی شود. به عنوان مثال ، پرس و جو زیر کل جدول را اسکن می کند.

از میراث SQL برای پرس و جو از جداول تقسیم بندی شده با دامنه عدد صحیح استفاده کنید

شما نمی توانید از میراث SQL برای پرس و جو در کل جدول تقسیم شده با دامنه عدد صحیح استفاده کنید. در عوض ، پرس و جو خطایی مانند موارد زیر را برمی گرداند:

جداول پرس و جو در یک زمینه در Legacy SQL پشتیبانی نمی شود

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

مثال زیر از پارتیشن دامنه ای که با 30 شروع می شود پرس و جو می کند:

داده های پرس و جو در ذخیره سازی بهینه سازی شده

پارتیشن __unpartitioned__ به طور موقت داده هایی را که در یک جدول تقسیم شده پخش می شود ، در حالی که در ذخیره سازی بهینه شده است ، نگه می دارد. داده هایی که مستقیماً به یک پارتیشن خاص از یک جدول تقسیم شده پخش می شوند ، از پارتیشن __unpartitioned__ استفاده نمی کنند. در عوض ، داده ها مستقیماً به پارتیشن پخش می شوند.

داده ها در ذخیره سازی بهینه سازی شده دارای مقادیر تهی در ستون های _partitionTime و _partitionDate هستند.

برای پرس و جو از داده ها در پارتیشن __unpartitioned__ ، از _PartitionTime pseudo-column با مقدار تهی استفاده کنید. مثلا:

بهترین روشها برای هرس پارتیشن

از یک عبارت فیلتر ثابت استفاده کنید

برای محدود کردن پارتیشن هایی که در یک پرس و جو اسکن شده اند ، از یک عبارت ثابت در فیلتر خود استفاده کنید. اگر از عبارات پویا در فیلتر پرس و جو خود استفاده می کنید ، BigQuery باید تمام پارتیشن ها را اسکن کند.

به عنوان مثال ، پارتیشن های آلو پرس و جو زیر به دلیل اینکه فیلتر حاوی یک عبارت ثابت است:

با این حال ، پرس و جو زیر پارتیشن ها را هرس نمی کند ، زیرا فیلتر ، جایی که t1. ts = (Timestamp را از جدول انتخاب کنید که کلید = 2 باشد) ، یک بیان ثابت نیست. این بستگی به مقادیر پویا در زمینه های زمانی و کلیدی دارد:

ستون پارتیشن را در فیلتر خود جدا کنید

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

به عنوان مثال ، فیلتر زیر پارتیشن ها را هرس نمی کند زیرا بر اساس قسمت TS پارتیشن بندی و یک قسمت دوم TS2 به محاسبات نیاز دارد:

WHERE TIMESTAMP_ADD(ts, INTERVAL 6 HOUR) >TS2

به فیلتر پارتیشن در نمایش داده شد

هنگامی که یک جدول پارتیشن ایجاد می کنید ، می توانید با فعال کردن گزینه Filter Partition Partition ، به استفاده از فیلترهای محمول نیاز داشته باشید. هنگامی که این گزینه اعمال می شود ، تلاش برای پرس و جو از جدول تقسیم شده بدون مشخص کردن بند که در آن خطای زیر ایجاد می کند:

نمی توان از جدول "project_id. dataset. table" بدون فیلتر که می تواند برای حذف پارتیشن استفاده شود ، پرس و جو کنید.

حداقل باید یک محمول وجود داشته باشد که فقط یک ستون پارتیشن را برای فیلتر ارجاع دهد که واجد شرایط حذف پارتیشن باشد. به عنوان مثال ، برای یک جدول تقسیم شده بر روی ستون partition_id با یک ستون اضافی F در طرح آن ، هر دو مورد زیر که در آن بندها نیاز را برآورده می کنند:

با این حال ، جایی که (partition_id = "20221231" یا f = "20221130") کافی نیست.

برای جداول تقسیم شده زمان ، از _partitiontime یا _partitiondate شبه ستون استفاده کنید.

برای کسب اطلاعات بیشتر در مورد اضافه کردن گزینه Filter Partition Filter هنگام ایجاد یک جدول پارتیشن ، به ایجاد جداول پارتیشن مراجعه کنید. همچنین می توانید این تنظیمات را در یک جدول موجود به روز کنید.

مراحل بعدی

  • برای مرور کلی از جداول تقسیم شده ، به مواردی از جداول تقسیم شده مراجعه کنید.
  • برای کسب اطلاعات بیشتر در مورد ایجاد جداول تقسیم بندی شده ، به ایجاد جداول تقسیم شده مراجعه کنید.

به جز آنچه در غیر این صورت ذکر شد ، محتوای این صفحه تحت مجوز Creative Commons Attribution 4. 0 مجوز دارد و نمونه های کد تحت مجوز Apache 2. 0 مجوز دارند. برای جزئیات بیشتر ، به سیاست های سایت Google Developers مراجعه کنید. جاوا یک علامت تجاری ثبت شده اوراکل و/یا شرکت های وابسته به آن است.

آموزش کار در فارکس...
ما را در سایت آموزش کار در فارکس دنبال می کنید

برچسب : نویسنده : Mihayloo بازدید : <-PostHit-> تاريخ : يکشنبه 14 اسفند 1401 ساعت: 16:45