ClickHouse/docs/fa/sql-reference/dictionaries/external-dictionaries/external-dicts-dict-layout.md
Ivan Blinkov d91c97d15d
[docs] replace underscores with hyphens (#10606)
* Replace underscores with hyphens

* remove temporary code

* fix style check

* fix collapse
2020-04-30 21:19:18 +03:00

15 KiB
Raw Blame History

machine_translated machine_translated_rev toc_priority toc_title
true d734a8e46d 41 ذخیره واژهنامهها در حافظه

ذخیره واژهنامهها در حافظه

راه های مختلفی برای ذخیره لغت نامه ها در حافظه وجود دارد.

ما توصیه می کنیم تخت, درهم و اخت مجتمع. که سرعت پردازش بهینه را فراهم می کند.

ذخیره سازی به دلیل عملکرد بالقوه ضعیف و مشکلات در انتخاب پارامترهای مطلوب توصیه نمی شود. ادامه مطلب در بخش “نهانگاه”.

راه های مختلفی برای بهبود عملکرد فرهنگ لغت وجود دارد:

  • پاسخ تابع برای کار با فرهنگ لغت پس از GROUP BY.
  • علامت گذاری به عنوان ویژگی برای استخراج به عنوان تزریقی. یک ویژگی است که به نام عاطفی اگر مقادیر ویژگی های مختلف به کلید های مختلف مطابقت دارد. بنابراین زمانی که GROUP BY با استفاده از یک تابع است که بازخوانی ارزش ویژگی های کلیدی, این تابع به طور خودکار از گرفته GROUP BY.

تاتر تولید یک استثنا برای خطا با لغت نامه. نمونه هایی از اشتباهات:

  • فرهنگ لغت در حال دسترسی نمی تواند لود شود.
  • خطای پرسوجو یک cached فرهنگ لغت.

شما می توانید لیستی از لغت نامه های خارجی و وضعیت خود را در system.dictionaries جدول

پیکربندی به نظر می رسد مثل این:

<yandex>
    <dictionary>
        ...
        <layout>
            <layout_type>
                <!-- layout settings -->
            </layout_type>
        </layout>
        ...
    </dictionary>
</yandex>

متناظر توصیف:

CREATE DICTIONARY (...)
...
LAYOUT(LAYOUT_TYPE(param value)) -- layout settings
...

راه هایی برای ذخیره لغت نامه ها در حافظه

تخت

فرهنگ لغت به طور کامل در حافظه در قالب مجموعه تخت ذخیره می شود. چقدر حافظه استفاده از فرهنگ لغت? مقدار متناسب با اندازه بزرگترین کلید است (در فضا استفاده می شود).

کلید فرهنگ لغت است UInt64 نوع و ارزش محدود به 500,000 است. اگر یک کلید بزرگتر کشف شده است در هنگام ایجاد فرهنگ لغت, تاتر می اندازد یک استثنا و فرهنگ لغت ایجاد کنید.

تمام انواع منابع پشتیبانی می شوند. هنگام به روز رسانی, داده ها (از یک فایل و یا از یک جدول) در تمامیت خود را به عنوان خوانده شده.

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

مثال پیکربندی:

<layout>
  <flat />
</layout>

یا

LAYOUT(FLAT())

درهم

فرهنگ لغت به طور کامل در حافظه در قالب یک جدول هش ذخیره می شود. فرهنگ لغت می تواند شامل هر تعداد از عناصر با هر شناسه در عمل تعداد کلید ده ها میلیون نفر از اقلام برسد.

تمام انواع منابع پشتیبانی می شوند. هنگام به روز رسانی, داده ها (از یک فایل و یا از یک جدول) در تمامیت خود را به عنوان خوانده شده.

مثال پیکربندی:

<layout>
  <hashed />
</layout>

یا

LAYOUT(HASHED())

فشردهسازی

مشابه به hashed, اما با استفاده از حافظه کمتر به نفع استفاده از پردازنده بیشتر.

مثال پیکربندی:

<layout>
  <sparse_hashed />
</layout>
LAYOUT(SPARSE_HASHED())

اخت مجتمع

این نوع ذخیره سازی برای استفاده با کامپوزیت است کلید. مشابه به hashed.

مثال پیکربندی:

<layout>
  <complex_key_hashed />
</layout>
LAYOUT(COMPLEX_KEY_HASHED())

رنگها

فرهنگ لغت در حافظه به شکل یک جدول هش با مجموعه ای مرتب از محدوده ها و مقادیر مربوطه ذخیره می شود.

این روش ذخیره سازی کار می کند به همان شیوه به عنوان درهم و اجازه می دهد تا با استفاده از تاریخ/زمان (نوع عددی دلخواه) محدوده علاوه بر کلید.

مثال: جدول شامل تخفیف برای هر تبلیغ در قالب:

+---------|-------------|-------------|------+
| advertiser id | discount start date | discount end date | amount |
+===============+=====================+===================+========+
| 123           | 2015-01-01          | 2015-01-15        | 0.15   |
+---------|-------------|-------------|------+
| 123           | 2015-01-16          | 2015-01-31        | 0.25   |
+---------|-------------|-------------|------+
| 456           | 2015-01-01          | 2015-01-15        | 0.05   |
+---------|-------------|-------------|------+

برای استفاده از یک نمونه برای محدوده تاریخ, تعریف range_min و range_max عناصر در ساختار. این عناصر باید حاوی عناصر name وtype (اگر type مشخص نشده است, نوع پیش فرض استفاده خواهد شد - تاریخ). type می تواند هر نوع عددی (تاریخ / DateTime / UInt64 / Int32 / دیگران).

مثال:

<structure>
    <id>
        <name>Id</name>
    </id>
    <range_min>
        <name>first</name>
        <type>Date</type>
    </range_min>
    <range_max>
        <name>last</name>
        <type>Date</type>
    </range_max>
    ...

یا

CREATE DICTIONARY somedict (
    id UInt64,
    first Date,
    last Date
)
PRIMARY KEY id
LAYOUT(RANGE_HASHED())
RANGE(MIN first MAX last)

برای کار با این لغت نامه, شما نیاز به تصویب یک استدلال اضافی به dictGetT تابع, که یک محدوده انتخاب شده است:

dictGetT('dict_name', 'attr_name', id, date)

این تابع ارزش برای مشخص گرداند idبازدید کنندگان و محدوده تاریخ که شامل تاریخ گذشت.

اطلاعات از الگوریتم:

  • اگر id یافت نشد و یا یک محدوده برای یافت نشد id مقدار پیش فرض فرهنگ لغت را برمی گرداند.
  • اگر با هم تداخل دارند محدوده وجود دارد, شما می توانید هر استفاده.
  • اگر جداساز محدوده باشد NULL یا نامعتبر تاریخ (مانند 1900-01-01 یا 2039-01-01) طیف وسیعی است که در سمت چپ باز است. محدوده را می توان در هر دو طرف باز کرد.

مثال پیکربندی:

<yandex>
        <dictionary>

                ...

                <layout>
                        <range_hashed />
                </layout>

                <structure>
                        <id>
                                <name>Abcdef</name>
                        </id>
                        <range_min>
                                <name>StartTimeStamp</name>
                                <type>UInt64</type>
                        </range_min>
                        <range_max>
                                <name>EndTimeStamp</name>
                                <type>UInt64</type>
                        </range_max>
                        <attribute>
                                <name>XXXType</name>
                                <type>String</type>
                                <null_value />
                        </attribute>
                </structure>

        </dictionary>
</yandex>

یا

CREATE DICTIONARY somedict(
    Abcdef UInt64,
    StartTimeStamp UInt64,
    EndTimeStamp UInt64,
    XXXType String DEFAULT ''
)
PRIMARY KEY Abcdef
RANGE(MIN StartTimeStamp MAX EndTimeStamp)

نهانگاه

فرهنگ لغت در کش است که تعداد ثابتی از سلول های ذخیره می شود. این سلول ها حاوی عناصر اغلب استفاده می شود.

هنگام جستجو برای یک فرهنگ لغت کش اول جستجو می شود. برای هر بلوک از داده ها, تمام کلید هایی که در کش یافت نشد و یا منسوخ شده از منبع با استفاده از درخواست SELECT attrs... FROM db.table WHERE id IN (k1, k2, ...). داده های دریافت شده است و سپس به کش نوشته شده است.

برای لغت نامه کش, انقضا طول عمر از داده ها در کش را می توان تنظیم کرد. اگر زمان بیشتری از lifetime از زمان بارگذاری داده ها در یک سلول گذشت, ارزش سلول استفاده نمی شود, و دوباره درخواست دفعه بعد که نیاز به استفاده می شود. این حداقل موثر از تمام راه هایی برای ذخیره لغت نامه است. سرعت کش به شدت در تنظیمات صحیح و سناریوی استفاده بستگی دارد. فرهنگ لغت نوع کش به خوبی انجام تنها زمانی که نرخ ضربه به اندازه کافی بالا هستند (توصیه می شود 99% و بالاتر). شما می توانید میزان ضربه به طور متوسط در مشاهده system.dictionaries جدول

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

پشتیبانی منابع پردازشگر پشتیبانی شده:

مثال تنظیمات:

<layout>
    <cache>
        <!-- The size of the cache, in number of cells. Rounded up to a power of two. -->
        <size_in_cells>1000000000</size_in_cells>
    </cache>
</layout>

یا

LAYOUT(CACHE(SIZE_IN_CELLS 1000000000))

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

  1. تنظیم برخی از ارزش.
  2. نمایش داده شد اجرا تا کش کاملا کامل است.
  3. ارزیابی مصرف حافظه با استفاده از system.dictionaries جدول
  4. افزایش یا کاهش تعداد سلول ها تا زمانی که مصرف حافظه مورد نیاز رسیده است.

!!! warning "اخطار" هنوز تاتر به عنوان یک منبع استفاده نمی, چرا که کند است برای پردازش نمایش داده شد با تصادفی می خواند.

_پیچید_چهای پیچیده

این نوع ذخیره سازی برای استفاده با کامپوزیت است کلید. مشابه به cache.

شمال اروپا

این نوع ذخیره سازی برای پیشوندهای نقشه برداری شبکه (نشانی های اینترنتی) به فراداده مانند ان است.

مثال: جدول شامل پیشوندهای شبکه و مربوط به خود را به عنوان شماره و کد کشور:

  +-----------|-----|------+
  | prefix          | asn   | cca2   |
  +=================+=======+========+
  | 202.79.32.0/20  | 17501 | NP     |
  +-----------|-----|------+
  | 2620:0:870::/48 | 3856  | US     |
  +-----------|-----|------+
  | 2a02:6b8:1::/48 | 13238 | RU     |
  +-----------|-----|------+
  | 2001:db8::/32   | 65536 | ZZ     |
  +-----------|-----|------+

هنگام استفاده از این نوع طرح, ساختار باید یک کلید کامپوزیت دارند.

مثال:

<structure>
    <key>
        <attribute>
            <name>prefix</name>
            <type>String</type>
        </attribute>
    </key>
    <attribute>
            <name>asn</name>
            <type>UInt32</type>
            <null_value />
    </attribute>
    <attribute>
            <name>cca2</name>
            <type>String</type>
            <null_value>??</null_value>
    </attribute>
    ...

یا

CREATE DICTIONARY somedict (
    prefix String,
    asn UInt32,
    cca2 String DEFAULT '??'
)
PRIMARY KEY prefix

کلید باید تنها یک ویژگی نوع رشته ای داشته باشد که شامل یک پیشوند مجاز است. انواع دیگر هنوز پشتیبانی نمی شوند.

برای نمایش داده شد, شما باید توابع مشابه استفاده کنید (dictGetT با یک تاپل) به لغت نامه ها با کلید های ترکیبی:

dictGetT('dict_name', 'attr_name', tuple(ip))

تابع طول می کشد یا UInt32 برای ایپو4 یا FixedString(16) برای IPv6:

dictGetString('prefix', 'asn', tuple(IPv6StringToNum('2001:db8::1')))

انواع دیگر هنوز پشتیبانی نمی شوند. تابع ویژگی برای پیشوند که مربوط به این نشانی اینترنتی را برمی گرداند. اگر پیشوند با هم تداخل دارند وجود دارد, یکی از خاص ترین بازگشته است.

داده ها در یک ذخیره می شود trie. این به طور کامل باید به رم مناسب.

مقاله اصلی