powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Измерение times
22 сообщений из 22, страница 1 из 1
Измерение times
    #32891868
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
/* Oracle 9.2.0.5 */

У меня образовалось два измерения, times и clients которые нельзя отнести к редко меняющимся справочникам, clients растет примерно так же как таблица фактов, times помедленнее на порядок(детализация до часов), но с остальными измерениями не сравнить. У меня есть идея включить справочник клиентов в таблицу фактов(из справочника сделать обычный btree индекс), а для times выделить отдельный tablespace.

Расскажите, как решали аналогичную задачу вы в своих проектах?

Да, кстати, в примере Oracle таблица фактов имеет на time_id bitmap индекс. Простым расчетом получаем что в год times имеет 24*365=8760 различных time_id. Что-то мне показывает, что btree порвет этот bitmap как тузик грелку, как сделано у Вас? (партицирование по месяцам уменьшит эту цифру в 12 раз, но все равно большая). В возможном измерении clients ситуация будет еще плачевней(еще один довод против измерения clients)





"The CBO without stats is like a morning without coffee." T.Kyte
...
Рейтинг: 0 / 0
Измерение times
    #32891927
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, кстати, в примере Oracle таблица фактов имеет на time_id bitmap индекс

А зачем? bit-map, насколько я понимаю, лучше применять на столбцах с низкой кардинальностью.

Что-то мне показывает, что btree порвет этот bitmap как тузик грелку

Мне, почему-то, тоже так кажется. Я не уверен, что Oracle использует bit-map при выполнеии джойнов. А, скорее всего, поле time_id у Вас исползуется для соединения с отдельной таблицей фактов.

Я бы рассмотрел ещё измерение time как два отдельных - одно для дат, другое для часов. В производительности, скорее всего, сильно выиграете.

У меня есть идея включить справочник клиентов в таблицу фактов

Сделаете ошибку, на мой взгляд. У вас сколько полей в таблице клиентов?


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32891966
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский
А зачем? bit-map, насколько я понимаю, лучше применять на столбцах с низкой кардинальностью.

В принципе они правы. Используя partitioning и индексы на раздел в их случае получается 29-31 различных time_id в индексе

Константин Лисянский
Мне, почему-то, тоже так кажется. Я не уверен, что Oracle использует bit-map при выполнеии джойнов. А, скорее всего, поле time_id у Вас исползуется для соединения с отдельной таблицей фактов.

Oracle использует bitmap joins. В моем случае да, измерение имеет time_id = date с точностью до часов(у Oracle до дней)

Константин Лисянский
Я бы рассмотрел ещё измерение time как два отдельных - одно для дат, другое для часов. В производительности, скорее всего, сильно выиграете.


Хм. Весьма здравая идея. Получим кардинальность 24 для часов и 31 для дней, это нормально) Спасибо за интересную идею.

Константин Лисянский
У меня есть идея включить справочник клиентов в таблицу фактов
Сделаете ошибку, на мой взгляд. У вас сколько полей в таблице клиентов?


1 поле - его номер.

Посмотрел данные за вчера. Фактов - 13200, клиентов - 13000, за месяц картина
примерно такая - (кол(клиенты) = кол(факты)/2)
...
Рейтинг: 0 / 0
Измерение times
    #32892643
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
1 поле - его номер.

Что-то тут не так. Неужели номер клиента несёт какую-то смысловую аналитическую нагрузку? Кто-то помнит всех клиентов по номерам? Какой вообще анализ ведётся в разрезе клиентов?


Хм. Весьма здравая идея. Получим кардинальность 24 для часов и 31 для дней, это нормально) Спасибо за интересную идею.

Не за что. Единственное - таблица фактов станет шире. На каких-то запросах станет работать медленнее.



С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32892695
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Согласен, что разбив время на часы и дни можно получить выигрыш.

С другой стороны, как ни парадоксально, bitmap дают прирост производительности даже при условно говоря большом разбросе значений. Главное как этот разброс соотносится с таблицей фактов.
Если у вас миллион записаей в таблице и 8760 часов - то в этой ситуации битмап будет работать нормально.
Другое дело, что битмапы не любят вставок-удалений-апдейтов, но в DWH это нехарактерно.
Еще в Oracle есть полезная штука, называется STAR SCHEME TRANSFORMATION (по дефолту выключена), которая позволяет использовать существующие BITMAP индексы на таблице фактов, даже если запрос идет по неключевому полю словаря.
...
Рейтинг: 0 / 0
Измерение times
    #32892746
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Другое дело, что битмапы не любят вставок-удалений-апдейтов, но в DWH это нехарактерно.

Всё зависит от того, что это за DWH. Если это Active Data Warehouse, то, оно может обновляться постоянно.


Еще в Oracle есть полезная штука, называется STAR SCHEME TRANSFORMATION

А что за зверь? Не расскажете вкратце, как работает?

А ещё - не расскажете, как Oracle использует bitmap-индекс для джойнов?


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32892810
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский
Еще в Oracle есть полезная штука, называется STAR SCHEME TRANSFORMATION

А что за зверь? Не расскажете вкратце, как работает?

А ещё - не расскажете, как Oracle использует bitmap-индекс для джойнов?



http://download-west.oracle.com/docs/cd/B10501_01/server.920/a96520/indexes.htm#98463

Это про bitmap-join, вкратце это индекс на таблице 1 по полю в таблице 2 :-)

Про star schema transformation:

http://download-east.oracle.com/docs/cd/A81042_01/DOC/server.816/a76994/schemas.htm#11685
...
Рейтинг: 0 / 0
Измерение times
    #32892831
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Константин Лисянский

Насчет Active Data Warehouse поправка принимается. Конечно все зависит от реальных условий. Но в этом случае желательно часто перестраивать bitmap индексы, иначе все начнет работать медленно.

А насчет как это работает.
В Oracle есть такой функционал, называется Query Rewrite. То есть в некоторых случаях, оптимизатор Oracle умеет переписывать запрос на эквивалентный, но более производительный. Например на этом основаны запросы к материализованным представлениям. Group by запрос пишется к таблице, а оптимизатор определяет, что существует мат. представление, создержащее те же, но агрегированные данные, и переписывает запрос на другой, например
Код: plaintext
select filial, sum(sales_amount) from sales group by filial
перепишется на
Код: plaintext
select filial sum_sales_amount from mv_sales
Понятно, что второй запрос будет работать быстрее.

В случае star transformation применяется тоже технология QR, но по-другому.
Пример из документации.
Допустим, у нас есть запрос
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
SELECT ch.channel_class, c.cust_city, t.calendar_quarter_desc,
   SUM(s.amount_sold) sales_amount
FROM sales s, times t, customers c, channels ch
WHERE s.time_id = t.time_id
AND   s.cust_id = c.cust_id
AND   s.channel_id = ch.channel_id
AND   c.cust_state_province = 'CA'
AND   ch.channel_desc in ('Internet','Catalog')
AND   t.calendar_quarter_desc IN ('1999-Q1','1999-Q2')
GROUP BY ch.channel_class, c.cust_city, t.calendar_quarter_desc
Здесь на таблице sales построены BITMAP индексы и по FK она связана с таблицами-словарями times, customers, channels.
Обратите внимание, что на times тоже стоит BITMAP индекс.
Так вот, этот запрос будет переписан на такой:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
SELECT ... FROM sales
WHERE time_id IN
  (SELECT time_id FROM times 
   WHERE calendar_quarter_desc IN('1999-Q1','1999-Q2'))
   AND cust_id IN
  (SELECT cust_id FROM customers WHERE cust_state_province='CA')
   AND channel_id IN
  (SELECT channel_id FROM channels WHERE channel_desc IN('Internet','Catalog'));

То есть, теперь сначала обсчитываются подзапросы, из которых выпадает список ID из словарей, а по этим ID теперь легко использовать BITMAP индексы в таблице фактов. Если же использовать первоначальный запрос, то использовать битмап индекс будет сложно.

Ну, плюс к этому, в Oracle есть еще BITMAP JOINED INDEX-ы, которые позволяют построить индекс между несколькими таблицами и таким образом еще ускорить время выполнения.
...
Рейтинг: 0 / 0
Измерение times
    #32893011
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А этот Query Rewrite надо включать что ли? Или он всегда включён?

Так вот, этот запрос будет переписан на такой

Поскольку во втором запросе отсутствуют предложения FROM и GROUP BY не очень понятно, как он соответствует первому.
Вроде бы в списке столбцов упоминается несколько таблиц, а условий джойна нету. Есть подзапросы, но в этом случае список после SELECT должен включать столбцы только из одной таблицы. Но тогда непонятно, по каким полям будет группировка, поскольку в исходном запросе группировка выполняется по кварталам, а это поле в таблице измерения, а не в таблице фактов.
Может, приведёте более правильный вариант второго запроса?


То есть, теперь сначала обсчитываются подзапросы, из которых выпадает список ID из словарей, а по этим ID теперь легко использовать BITMAP индексы в таблице фактов

И, всё равно, не очень понятно, как они используются.
По каким полям в Вашем примере построены индексы в таблице фактов и в таблицах измерений? И как они используются при джойнах?

На мой взгляд, строить bitmap по time_id в таблице измерения бессмысленно, поскольку все значения уникальны, если только, Oracle как-то умеет использовать этот битмап для джойна.
По calendar_quarter_desc, по-моему, лучше иметь btree-индекс, поскольку значения тоже полностью уникальные.

В общем, вопросов больше, чем ответов. Просветите окончательно, пожалуйста, уж очень интересная тема.

Конечно, интересно было бы посмотреть на план запроса, если это, конечно, возможно.

Спасибо.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32893133
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский

Конечно, интересно было бы посмотреть на план запроса, если это, конечно, возможно.
http://lissianski.narod.ru

Короче, я приводил линк, приведу текст с линка

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
94.
95.
96.
97.
98.
99.
100.
101.
102.
103.
104.
105.
106.
107.
108.
109.
110.
111.
112.
113.
114.
115.
116.
117.
118.
119.
120.
121.
122.
123.
124.
125.
126.
127.
128.
129.
130.
131.
132.
133.
134.
135.
136.
137.
138.
139.
140.
141.
142.
143.
144.
 Optimizing Star Queries
Tuning Star Queries

In order to get the best possible performance for star queries, it is important to follow some basic guidelines:

    * A bitmap index should be built on each of the foreign-key columns of the fact table(s).

    * The initialization parameter STAR_TRANSFORMATION_ENABLED should be set to TRUE. This enables an important optimizer feature for star-queries; it is set to FALSE by default for backwards-compatibility.

    * The cost-based optimizer should be used. [This does not apply solely to star schemas: all data warehouses should always use the cost-based optimizer].

When a data warehouse satisfies these conditions, the majority of the star queries running in the data warehouse will use a query-execution strategy known as the star transformation. The star transformation provides very efficient query performance for star queries.
Star Transformation

The star transformation is a cost-based query transformation aimed at executing star queries efficiently. Whereas the star optimization works well for schemas with a small number of dimensions and dense fact tables, the star transformation may be considered as an alternative if any of the following holds true:

    * The number of dimensions is large

    * The fact table is sparse

    * There are queries where not all dimension tables have constraining predicates

The star transformation does not rely on computing a Cartesian product of the dimension tables, which makes it better suited for cases where fact table sparsity and/or a large number of dimensions would lead to a large Cartesian product with few rows having actual matches in the fact table. In addition, rather than relying on concatenated indexes, the star transformation is based on combining bitmap indexes on individual fact table columns.

The transformation can thus combine indexes corresponding precisely to the constrained dimensions. There is no need to create many concatenated indexes where the different column orders match different patterns of constrained dimensions in different queries.

Attention:

Bitmap indexes are available only if you have purchased the Oracle8i Enterprise Edition. In Oracle8i, bitmap indexes and star transformation are not available.  
Star Transformation Example

This section provides an example of the star transformation. The star transformation is a powerful, and interesting, optimization technique which relies upon implicitly rewriting (or transforming) the SQL of the original star query.

The end user never needs to know any of the details about the star transformation; Oracle's cost-based optimizer will automatically choose the star transformation where appropriate.

However, the DBA may be interested to learn the details of the star transformation. This section will enable the DBA to understand how the star transformation algorithm works, and moreover, the DBA will be able to recognize the execution plans of star queries which are using the star transformation.

Oracle processes a star query using two basic phases. The first phase retrieves exactly the necessary rows from the fact table (the result set). Because this retrieval utilizes bitmap indexes, it is very efficient.

The second phase joins this result set to the dimension tables. Below is an example of how an end-user may query this data warehouse: "What were the sales and profits for the grocery department of stores in the west and southwest sales districts over the last three quarters?" This is a simple star query. The SQL generated by an end-user tool could look like:

SELECT 
    store.sales_district, 
    time.fiscal_period, 
    SUM(sales.dollar_sales) revenue, 
    SUM(dollar_sales) - SUM(dollar_cost) income
FROM 
    sales, store, time, product
WHERE 
    sales.store_key = store.store_key AND
    sales.time_key  = time.time_key AND
    sales.product_key = product.product_key AND
    time.fiscal_period IN ('3Q95', '4Q95', '1Q96') and
    product.department = 'Grocery' AND
    store.sales_district IN ('San Francisco', 'Los Angeles')
GROUP BY 
    store.sales_district, time.fiscal_period;

Oracle will process this query in two phases. In the first phase, Oracle will use the bitmap indexes on the foreign-key columns of the fact table to identify and retrieve the only the necessary rows from the fact table. That is, Oracle will retrieve the result set from the fact table using essentially the following query:

SELECT ...  FROM sales
WHERE 
    store_key IN (SELECT store_key FROM store WHERE 
                  sales_district IN ('WEST', 'SOUTHWEST')) AND
    time_key  IN (SELECT time_key FROM time WHERE
                  quarter IN ('3Q96', '4Q96', '1Q97')) AND
    product_key IN (SELECT product_key FROM product WHERE
                    department = 'GROCERY');

This is the transformation step of the algorithm, because the original star query has been transformed into this subquery representation. This method of accessing the fact table leverages the strengths of Oracle's bitmap indexes. Intuitively, bitmap indexes provide a set-based processing scheme within a relational database. Oracle has implemented very fast methods for doing set operations such as AND (an intersection in standard set-based terminology), OR (a set-based union), MINUS, and COUNT.

In this star query, a bitmap index on store_key is used to identify the set of all rows in the fact table corresponding to sales in the West sales district. This set is represented as a bitmap (a string of 1's and 0's that indicates which rows of the fact table are members of the set).

A similar bitmap is retrieved for the fact-table rows corresponding to the sale in the Southwest sales district. The bitmap OR operation is used to combine this set of Southwest sales with the set of West sales.

Additional set operations will be done for the time dimension and the product dimension. At this point in the star query processing, there are three bitmaps: each bitmap corresponds to a separate dimension table, and each bitmap represents the set of rows of the fact table that satisfy that individual dimension's constraints.

These three bitmaps are combined into a single bitmap using the bitmap AND operation. This final bitmap represents the set of rows in the fact table that satisfy all of the constraints on the dimension table; this is the result set, the exact set of rows from the fact table needed to evaluate the query. Note that none of the actual data in the fact table has been accessed; all of these operations rely solely on the bitmap indexes and the dimension tables. Because of the bitmap indexes' patented, compressed data representations, the bitmap set-based operations are extremely efficient.

Once the result set is identified, the bitmap is used to access the actual data from the sales table. Only those rows that are required for the end-user's query are retrieved from the fact table.

The second phase of this query is to join these rows from the fact table to the dimension tables. Oracle will use the most efficient method for accessing and joining the dimension tables. Many dimension are very small, and table scans are typically the most efficient access method for these dimension tables. For large dimension tables, table scans may not be the most efficient access method. In the example above, a bitmap index on product.department may be used to quickly identify all of those products in the grocery department. Oracle8's cost-based optimizer will automatically determine which access method is most appropriate for a given dimension table, based upon the cost-based optimizer's knowledge about the sizes and data distributions of each dimension table.

The specific join method (as well as indexing method) for each dimension tables will likewise be intelligently determined by the cost-based optimizer. A hash join is often the most efficient algorithm for joining the dimension tables. The final answer is returned to the user once all of the dimension tables have been joined. The query technique of retrieving only the matching rows from one table and then joining to another table is commonly known as a semi-join.
Execution Plan

The following execution plan might result from "Star Transformation Example":

SELECT STATEMENT 
  HASH JOIN 
   HASH JOIN 
    HASH JOIN 
     TABLE ACCESS              SALES              BY INDEX ROWID 
      BITMAP CONVERSION                           TO ROWIDS 
       BITMAP AND 
        BITMAP MERGE 
         BITMAP KEY ITERATION 
          TABLE ACCESS         STORE              FULL 
          BITMAP INDEX         SALES_STORE_KEY    RANGE SCAN 
        BITMAP MERGE 
         BITMAP KEY ITERATION 
          TABLE ACCESS         TIME               FULL 
          BITMAP INDEX         SALES_TIME_KEY     RANGE SCAN 
        BITMAP MERGE 
         BITMAP KEY ITERATION 
          TABLE ACCESS         PRODUCTS           FULL 
          BITMAP INDEX         SALES_PRODUCT_KEY  RANGE SCAN 
     TABLE ACCESS              TIME               FULL 
    TABLE ACCESS               PRODUCTS           FULL 
   TABLE ACCESS                STORE              FULL 

In this plan, the fact table is accessed through a bitmap access path based on a bitmap AND of three merged bitmaps. The three bitmaps are generated by the BITMAP MERGE row source being fed bitmaps from row source trees underneath it. Each such row source tree consists of a BITMAP KEY ITERATION row source which fetches values from the subquery row source tree, which in this example is just a full table access. For each such value, the BITMAP KEY ITERATION row source retrieves the bitmap from the bitmap index. After the relevant fact table rows have been retrieved using this access path, they are joined with the dimension tables and temporary tables to produce the answer to the query.

The star transformation is a cost-based transformation in the following sense. The optimizer generates and saves the best plan it can produce without the transformation. If the transformation is enabled, the optimizer then tries to apply it to the query and if applicable, generates the best plan using the transformed query. Based on a comparison of the cost estimates between the best plans for the two versions of the query, the optimizer will then decide whether to use the best plan for the transformed or untransformed version.

If the query requires accessing a large percentage of the rows in the fact table, it may well be better to use a full table scan and not use the transformations. However, if the constraining predicates on the dimension tables are sufficiently selective that only a small portion of the fact table needs to be retrieved, the plan based on the transformation will probably be superior.

Note that the optimizer will generate a subquery for a dimension table only if it decides that it is reasonable to do so based on a number of criteria. There is no guarantee that subqueries will be generated for all dimension tables. The optimizer may also decide, based on the properties of the tables and the query, that the transformation does not merit being applied to a particular query. In this case the best regular plan will be used.
Restrictions on Star Transformation

Star transformation is not supported for tables with any of the following characteristics:

    * Tables with a table hint that is incompatible with a bitmap access path

    * Tables with too few bitmap indexes (There must be a bitmap index on a fact table column for the optimizer to generate a subquery for it.)

    * Remote tables (However, remote dimension tables are allowed in the subqueries that are generated.)

    * Anti-joined tables

    * Tables that are already used as a dimension table in a subquery

    * Tables that are really unmerged views, which are not view partitions

    * Tables that have a good single-table access path

    * Tables that are too small for the transformation to be worthwhile

In addition, temporary tables will not be used by star transformation under the following conditions:

    * The database is in read-only mode

    * The star query is part of a transaction that is in serializable mode
 [code=plaintext]
                    
...
Рейтинг: 0 / 0
Измерение times
    #32893234
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин ЛисянскийА этот Query Rewrite надо включать что ли? Или он всегда включён?

QR по умолчанию включен, и используется для работы с мат. представлениями, но его можно отключить. А что касается функционала QR для STAR TRANSFORMATION, то он выключен.

Константин Лисянский Так вот, этот запрос будет переписан на такойПоскольку во втором запросе отсутствуют предложения FROM и GROUP BY не очень понятно, как он соответствует первому.
Дело в том, что запрос как там и написано будет отрабатываться в два прохода - на первом, для которого используется переписывание из таблицы фактов достаются нужные записи, а на втором этапе будет делаться уже GROUP BY, он в данном случае не приведен, так как это все внутри Oracle происходит
В списке столбцов несколько таблиц быть не должно, это я тормознул, их туда напечатал, но не стоило. В оригинале в доке там троеточие стоит :) Я поправил уже в сообщении. Спасибо за замечание. Лучшее - враг хорошего :)
Константин ЛисянскийИ, всё равно, не очень понятно, как они используются.
По каким полям в Вашем примере построены индексы в таблице фактов и в таблицах измерений? И как они используются при джойнах?
Индексы построены по полям в таблице фактов. CHANNEL_ID, TIME_ID и так далее.

Константин ЛисянскийНа мой взгляд, строить bitmap по time_id в таблице измерения бессмысленно, поскольку все значения уникальны, если только, Oracle как-то умеет использовать этот битмап для джойна.
По calendar_quarter_desc, по-моему, лучше иметь btree-индекс, поскольку значения тоже полностью уникальные.

В том случае, если в качестве времени используется timestamp, то смысла в BITMAP нет, но если используется день или даже час - как в этом примере, то BITMAP подходит. Так как важен разброс значений относительно количсества записаей в таблице фактов. К тому же STAR трансформация работает только при наличии BITMAP индексов.
Даже если в таблице продаж 1 миллион фактов, а в словаре товаров 100 000 записей номенклатуры - BITMAP и в этом случае дает преимущество по скорости выборки. Ну а если в фактической таблице их больше, то тем более.


Константин Лисянский
Конечно, интересно было бы посмотреть на план запроса, если это, конечно, возможно.

В моем случае план выглядит так. (hell привел пример из доки по 9i, а я по 10g. Но суть от этого не меняется.)
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
SELECT STATEMENT, GOAL = ALL_ROWS			Cost= 994 	Cardinality= 1 	Bytes= 73 
 TEMP TABLE TRANSFORMATION					
  LOAD AS SELECT					
   TABLE ACCESS FULL	Object owner=SH	Object name=CUSTOMERS	Cost= 467 	Cardinality= 1 	Bytes= 29 
  SORT GROUP BY			Cost= 527 	Cardinality= 1 	Bytes= 73 
   HASH JOIN			Cost= 526 	Cardinality= 1 	Bytes= 73 
    HASH JOIN			Cost= 505 	Cardinality= 1 	Bytes= 57 
     HASH JOIN			Cost= 501 	Cardinality= 1 	Bytes= 36 
      TABLE ACCESS FULL	Object owner=SYS	Object name=SYS_TEMP_0FD9D6783_84DAD47B	Cost= 2 	Cardinality= 1 	Bytes= 15 
      PARTITION RANGE ITERATOR			Cost= 499 	Cardinality= 5 	Bytes= 105 
       TABLE ACCESS BY LOCAL INDEX ROWID	Object owner=SH	Object name=SALES	Cost= 499 	Cardinality= 5 	Bytes= 105 
        BITMAP CONVERSION TO ROWIDS					
         BITMAP AND					
          BITMAP MERGE					
           BITMAP KEY ITERATION					
            BUFFER SORT					
             TABLE ACCESS FULL	Object owner=SYS	Object name=SYS_TEMP_0FD9D6783_84DAD47B	Cost= 2 	Cardinality= 1 	Bytes= 13 
            BITMAP INDEX RANGE SCAN	Object owner=SH	Object name=SALES_CUST_BIX			
          BITMAP MERGE					
           BITMAP KEY ITERATION					
            BUFFER SORT					
             TABLE ACCESS FULL	Object owner=SH	Object name=CHANNELS	Cost= 3 	Cardinality= 2 	Bytes= 42 
            BITMAP INDEX RANGE SCAN	Object owner=SH	Object name=SALES_CHANNEL_BIX			
          BITMAP MERGE					
           BITMAP KEY ITERATION					
            BUFFER SORT					
             TABLE ACCESS FULL	Object owner=SH	Object name=TIMES	Cost= 21 	Cardinality= 183 	Bytes= 2928 
            BITMAP INDEX RANGE SCAN	Object owner=SH	Object name=SALES_TIME_BIX			
     TABLE ACCESS FULL	Object owner=SH	Object name=CHANNELS	Cost= 3 	Cardinality= 2 	Bytes= 42 
    TABLE ACCESS FULL	Object owner=SH	Object name=TIMES	Cost= 21 	Cardinality= 183 	Bytes= 2928 
...
Рейтинг: 0 / 0
Измерение times
    #32893337
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский 1 поле - его номер.

Что-то тут не так. Неужели номер клиента несёт какую-то смысловую аналитическую нагрузку? Кто-то помнит всех клиентов по номерам? Какой вообще анализ ведётся в разрезе клиентов?


Может иметь. Например представьте, что компания предоставляет сервис по переводу денег на счет получателя. Есть только одна достоверная информация - счет получателя. В основном деньги в день идут на разнве счета, но можно выделиь например группы счетов, на которые приходятся 50% платежей, 10ку самых больших сумм перевода на клиента за год итп
...
Рейтинг: 0 / 0
Измерение times
    #32893513
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, если так, то можно его определить и в таблицу фактов.
По Кимбалу получится degenerate dimension.
Однако всё равно странно выглядит. Обычно про клиента довольно много известно. Когда она появится, придётся опять строить нормальную таблицу для измерения Клиент.

2 Birkhoff, Hell.
Спасибо за разъяснения. Я понял как эта штуковина работает.
Единственный момент - не очень понятно, как это распараллеливается.
И ещё, этот ваш план запросов в Оракле невозможно читать. Не могли они его что ли человеческим языком написать, как, например, в Терадате?

Ну, и оптимизатору, очевидно, довольно сложно приходится такой план выбирать. Очевидно, он не во всех случаях оптимален.
Интересно, а почему они через декартово произведение не захотели реализовывать star join? Bitmap-индексы, всё-таки поддерживать надо. А если внешних ключей много в таблице фактов, то это, наверняка, достаточно обременительно.

Удачи!

С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32894079
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский2 Birkhoff, Hell.
Спасибо за разъяснения. Я понял как эта штуковина работает.
Единственный момент - не очень понятно, как это распараллеливается.
В каком смысле как это распараллеливается?
Ну например селекты по словарям могут быть распараллелены. Чтение различных частей таблицы фактов тоже. Или я не понял вопроса?

Константин ЛисянскийИ ещё, этот ваш план запросов в Оракле невозможно читать. Не могли они его что ли человеческим языком написать, как, например, в Терадате?
А можно привести план запроса из Терадаты? Никогда не видел.

Константин ЛисянскийНу, и оптимизатору, очевидно, довольно сложно приходится такой план выбирать. Очевидно, он не во всех случаях оптимален.

В Oracle используется так называемый cost based optimizer (CBO). Он для каждого запроса строит несколько планов и по каждому плану вычисляет его стоимость (cost) Тот план, который имеет меньшую стоимость и будет выполняться. Поэтому для одного и того же запроса в разное время может использоваться разный план. Например для маленькой таблицы фактов может быть использовано полное сканирование (full scan), а потом, по мере ее увеличения может получиться, что дешевле использовать индексы. Очевидно что оптимизатор иногда может ошибаться :)
В Терадате это не так? Интересно, как там это работает?

Константин ЛисянскийИнтересно, а почему они через декартово произведение не захотели реализовывать star join? Bitmap-индексы, всё-таки поддерживать надо. А если внешних ключей много в таблице фактов, то это, наверняка, достаточно обременительно.
А как тут может помочь декартово произведение? Не совсем понял.
Преимущества битмапов еще в том, что на часть запросов можно получить ответы читая только индексы и не залезая в таблицу. (например count-ы различные) Потом накладывать условия на таблицу фактов удобно, например, сделав операцию AND между двумя или большим числом битовых карт - в результате это будет очень быстро.
...
Рейтинг: 0 / 0
Измерение times
    #32894395
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Константин Лисянский
Ну, и оптимизатору, очевидно, довольно сложно приходится такой план выбирать. Очевидно, он не во всех случаях оптимален.


Для того, чтобы наиболее корректно выбрать план, собирается регулярно статистика по данным.

Еще вопрос по измерению время, Вы предлагаете создавать данные в измерении загодя, например на год? Я то думал, что проще это делать для каждой записи
...
Рейтинг: 0 / 0
Измерение times
    #32894416
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hellЕще вопрос по измерению время, Вы предлагаете создавать данные в измерении загодя, например на год? Я то думал, что проще это делать для каждой записиПочему проще?
Или вы о том, что можно вообще не создавать измерение времени?
...
Рейтинг: 0 / 0
Измерение times
    #32894486
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я предлагаю загодя.
Просто раз в год загружаете данные на год вперёд и горя не знаете целый год (два года, пятилетку, десять лет... сколько загрузите, в общем).

Единственное, по ходу эксплуатации могут возникать новые потребности в атрибутах времени (например, в розничной торговле интересно знать, когда какие праздники, сколько дней осталось от текущего дня до конца недели, месяца, до ближайшего праздника). Таких атрибутов может быть сотни.
На мой взгляд, добавлять их нужно по мере необходимости.

При этом могут возникать проблемы с тем, что таблицы (таблицы) измерения ВРЕМЯ становятся слишком широкими (у меня есть проект с таблицей уровня дней, имеющей более ста столбцов), тогда надо дальше думать, как с ними работать (вертикальный и горизонтальный партишионинг, индексация и т.д.).

Всё это решается.

С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32899797
Birkhoff
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2 Константин Лисянский

Похоже, что комментариев на тему как работает Терадата я не дождусь :)
...
Рейтинг: 0 / 0
Измерение times
    #32901708
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Извините, меня долго не было. А пост с вопросами про Терадату я как-то пропустил.

Сначала про план запроса.
Допустим, есть такой запрос:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
select count(distinct a11.cust_id)  WJXBFS1
from dmtb_sales a11
	join (select a11.cust_id  cust_id
	from dmtb_sales a11
	where a11.day_id between  1  and  10 
	group by a11.cust_id
	having count(a11.tran_id) between  1 . 0  and  5 . 0 
	) pa1
	  on  (a11.cust_id = pa1.cust_id)
where a11.day_id between  1  and  10 

Если перед ним вписать слово EXPLAIN и запустить, получим вот что:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
Explanation
   1 ) First, we lock a distinct TPCH."pseudo table" for read on a
     RowHash to prevent global deadlock for TPCH.a11. 
   2 ) Next, we lock TPCH.a11 for read. 
   3 ) We do an all-AMPs SUM step to aggregate from a single partition of
     TPCH.a11 with a condition of ("(TPCH.a11.day_id >= 1) AND
     (TPCH.a11.day_id <= 10)"), and the grouping identifier in field
      1027 .  Aggregate Intermediate Results are computed globally, then
     placed in Spool  3 .  The input table will not be cached in memory,
     but it is eligible for synchronized scanning.  The size of Spool  3 
     is estimated with no confidence to be  3 , 163  rows.  The estimated
     time for this step is  0 . 91  seconds. 
   4 ) We do an all-AMPs RETRIEVE step from Spool  3  (Last Use) by way of
     an all-rows scan with a condition of ("((Field_3 (INTEGER))<= 5)
     AND ((Field_3 (INTEGER))>= 1)") into Spool  1  (all_amps), which is
     built locally on the AMPs.  The size of Spool  1  is estimated with
     no confidence to be  3 , 163  rows.  The estimated time for this step
     is  0 . 04  seconds. 
   5 ) We execute the following steps in parallel. 
        1 ) We do an all-AMPs RETRIEVE step from Spool  1  (Last Use) by
          way of an all-rows scan with a condition of ("NOT (CUST_ID IS
          NULL)") into Spool  8  (all_amps), which is duplicated on all
          AMPs.  Then we do a SORT to order Spool  8  by row hash.  The
          size of Spool  8  is estimated with no confidence to be  6 , 326 
          rows.  The estimated time for this step is  0 . 07  seconds. 
        2 ) We do an all-AMPs RETRIEVE step from a single partition of
          TPCH.a11 with a condition of ("(TPCH.a11.day_id >= 1) AND
          ((TPCH.a11.day_id <= 10) AND (NOT (TPCH.a11.cust_id IS NULL
          )))") into Spool  9  (all_amps), which is built locally on the
          AMPs.  Then we do a SORT to order Spool  9  by row hash.  The
          result spool file will not be cached in memory.  The size of
          Spool  9  is estimated with no confidence to be  1 , 799 , 919  rows. 
          The estimated time for this step is  26 . 90  seconds. 
   6 ) We do an all-AMPs JOIN step from Spool  8  (Last Use) by way of a
     RowHash match scan, which is joined to Spool  9  (Last Use).  Spool
      8  and Spool  9  are joined using a merge join, with a join condition
     of ("cust_id = CUST_ID").  The result goes into Spool  7  (all_amps),
     which is built locally on the AMPs.  The result spool file will
     not be cached in memory.  The size of Spool  7  is estimated with no
     confidence to be  4 , 243 , 514  rows.  The estimated time for this step
     is  17 . 31  seconds. 
   7 ) We do an all-AMPs SUM step to aggregate from Spool  7  (Last Use) by
     way of an all-rows scan, and the grouping identifier in field  2 . 
     Aggregate Intermediate Results are computed globally, then placed
     in Spool  11 .  The size of Spool  11  is estimated with high
     confidence to be  1  row.  The estimated time for this step is  5 . 64 
     seconds. 
   8 ) We do an all-AMPs SUM step to aggregate from Spool  11  (Last Use)
     by way of an all-rows scan.  Aggregate Intermediate Results are
     computed globally, then placed in Spool  13 .  The size of Spool  13 
     is estimated with high confidence to be  1  row.  The estimated time
     for this step is  0 . 05  seconds. 
   9 ) We do an all-AMPs RETRIEVE step from Spool  13  (Last Use) by way of
     an all-rows scan into Spool  5  (group_amps), which is built locally
     on the AMPs.  The size of Spool  5  is estimated with high
     confidence to be  1  row.  The estimated time for this step is  0 . 03 
     seconds. 
  10 ) Finally, we send out an END TRANSACTION step to all AMPs involved
     in processing the request.
  -> The contents of Spool  5  are sent back to the user as the result of
     statement  1 .

Все шаги, где есть фраза all-AMPs выполняются параллельно (AMP - это единица параллелизма в Терадате).
В дополнении к этому на 5 шаге параллельно выполняются два подэтапа (которые в свою очередь тоже выполняются параллельно внутри себя).
Надеюсь, это несколько сумбурное объяснение понятно.

Ну, и раз уж я привёл текст плана запроса, надо отметить, что оптимизатор в Терадате тоже cost-based. Он был таким с самого появления Терадаты. Можно сказать, что это самый старый и зрелый оптимизатор РСУБД.
В плане запроса можно видеть оценку стоимости выполнения шагов запроса. Она выражается в условных временн ы х единицах.

BirkhoffВ каком смысле как это распараллеливается?
Ну например селекты по словарям могут быть распараллелены. Чтение различных частей таблицы фактов тоже. Или я не понял вопроса?

В приведённом выше плане запроса, как я уже упомянул, все шаги выполняются параллельно. Это, вообще, отличительная черта СУБД Терадата - она практически все операции выполняет параллельно.
Соответственно, вопрос был о том, как Оракл параллелит шаги запроса в обсуждаемом случае. Очевидно, таблицы и индексы должны быть секционированные (я имею в виду партишионинг). Ну, и план запроса должен показывать какие шаги выполняются параллельно и с какой степенью параллелизма. Вот это я имел в виду, когда задавал вопрос.

BirkhoffВ Oracle используется так называемый cost based optimizer (CBO). Он для каждого запроса строит несколько планов и по каждому плану вычисляет его стоимость (cost) Тот план, который имеет меньшую стоимость и будет выполняться. Поэтому для одного и того же запроса в разное время может использоваться разный план. Например для маленькой таблицы фактов может быть использовано полное сканирование (full scan), а потом, по мере ее увеличения может получиться, что дешевле использовать индексы. Очевидно что оптимизатор иногда может ошибаться :)
В Терадате это не так? Интересно, как там это работает?

Естественно, всё так, помимо этого Терадата всегда знает конфигурацию сервера на котором она работает (частота процессоров, количество узлов, скорость и объём жёстких дисков, количество единиц параллелизма, скорость коммутатора, и ещё множество других параметров, описывающих систему). Соответственно, для одного и того же запроса на одних и тех же данных, но на двух разных системах оптимизатор выберет различные планы запросов.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32901741
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторА как тут может помочь декартово произведение? Не совсем понял.

Это ещё одна техника оптимизации star-join. Сначала делается локальная выборка из таблиц измерений (если есть условия WHERE на них), потом вычисляется их декатрово произведение (CROSS JOIN в терминах SQL).
Получаем таблицу, которую нужно однократно приджойнить к таблице фактов.
Суть в том, чтобы не делать последовательные джойны огромной таблицы фактов с маленькими таблицами измерений. В результате джойн только однократный. При этом, если на таблице фактов есть составной индекс, состоящий из внешних ключей, то он может использоваться при джойне.

Надеюсь, объяснил.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
Измерение times
    #32901743
Фотография hell
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Мда, такой план надо читать на вечер, вместо "Войны и мира". Насчет производительности - в Oracle это зовется cpu costing

"The CBO without stats is like a morning without coffee." T.Kyte
...
Рейтинг: 0 / 0
Измерение times
    #32901791
Константин Лисянский
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
hellМда, такой план надо читать на вечер, вместо "Войны и мира".

Читается, кстати, нормально. Хоть немного и громоздко, зато всё понятно.
Для особо эстетствующих есть графическая утилита Teradata Visual Explain со всяческими визуальными наворотами и сервисами типа сравнения планов запросов.

hellНасчет производительности - в Oracle это зовется cpu costing

Не понял, что зовётся cpu costing.


С уважением,
Константин Лисянский
http://lissianski.narod.ru
...
Рейтинг: 0 / 0
22 сообщений из 22, страница 1 из 1
Форумы / OLAP и DWH [игнор отключен] [закрыт для гостей] / Измерение times
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]