powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
8 сообщений из 8, страница 1 из 1
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39067607
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
create table t1 (
  n1 integer not null,
  padding varchar(100) not null
) not logged initially
@
insert into t1
with 
  xxx(rn) as (
    values(1)
    union all
    select rn+1
    from xxx
    where rn+1 <= 100000
  )
select
  ((rn-1)/100) n1,  rpad('x',100) padding
from xxx
@
update dbm cfg using cpuspeed 1.000000e-006
@
-- extent size и prefetch size 32K
ALTER TABLESPACE USERSPACE1 OVERHEAD 1 TRANSFERRATE 1
@


и план
Код: 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.
145.
146.
147.
148.
149.
150.
151.
152.
153.
154.
155.
156.
157.
158.
159.
160.
161.
162.
163.
164.
165.
DB2 Universal Database Version 10.1, 5622-044 (c) Copyright IBM Corp. 1991, 2011
Licensed Material - Program Property of IBM
IBM DATABASE 2 Explain Table Format Tool



******************** EXPLAIN INSTANCE ********************

DB2_VERSION:       10.05.5
SOURCE_NAME:       SQLC2J24
SOURCE_SCHEMA:     NULLID  
SOURCE_VERSION:      
EXPLAIN_TIME:      2015-10-03-02.49.58.255872
EXPLAIN_REQUESTER: DB2INST1

Database Context:
----------------
	Parallelism:          None
	CPU Speed:            1.000000e-006
	Comm Speed:           0
	Buffer Pool size:     16384
	Sort Heap size:       2008
	Database Heap size:   8508
	Lock List size:       13984
	Maximum Lock List:    98
	Average Applications: 1
	Locks Available:      438538

Package Context:
---------------
	SQL Type:           Dynamic
	Optimization Level: 5
	Blocking:           Block All Cursors
	Isolation Level:    Cursor Stability



---------------- STATEMENT 1  SECTION 203 ----------------
	QUERYNO:       6
	QUERYTAG:      after runstats      
	Statement Type:   Select
	Updatable:        No
	Deletable:        No
	Query Degree:     1

Original Statement:
------------------
SELECT 
  * 
FROM 
  t1 x2


Optimized Statement:
-------------------
SELECT 
  Q1.N1 AS "N1",
  Q1.PADDING AS "PADDING" 
FROM 
  DB2INST1.T1 AS Q1

Access Plan:
-----------
	Total Cost: 		582.485
	Query Degree:		1

      Rows 
     RETURN
     (   1)
      Cost 
       I/O 
       |
     100000 
     TBSCAN
     (   2)
     582.485 
       362 
       |
     100000 
 TABLE: DB2INST1
       T1
       Q1



Extended Diagnostic Information:
--------------------------------

Diagnostic tables do not exist. No extended Diagnostic Information is available.


Plan Details:
-------------


	1) RETURN: (Return Result)
		Cumulative Total Cost: 		582.485
		Cumulative CPU Cost: 		1.74485e+008
		Cumulative I/O Cost: 		362
		Cumulative Re-Total Cost: 	172.202
		Cumulative Re-CPU Cost: 	1.72202e+008
		Cumulative Re-I/O Cost: 	0
		Cumulative First Row Cost: 	2.05231
		Estimated Bufferpool Buffers: 	362

		Input Streams:
		-------------
			2) From Operator #2

				Estimated number of rows: 	100000
				Number of columns: 		2


	2) TBSCAN: (Table Scan)
		Cumulative Total Cost: 		582.485
		Cumulative CPU Cost: 		1.74485e+008
		Cumulative I/O Cost: 		362
		Cumulative Re-Total Cost: 	172.202
		Cumulative Re-CPU Cost: 	1.72202e+008
		Cumulative Re-I/O Cost: 	0
		Cumulative First Row Cost: 	2.05231
		Estimated Bufferpool Buffers: 	362

		Input Streams:
		-------------
			1) From Object DB2INST1.T1

				Estimated number of rows: 	100000
				Number of columns: 		3


		Output Streams:
		--------------
			2) To Operator #1

				Estimated number of rows: 	100000
				Number of columns: 		2


Objects Used in Access Plan:
---------------------------

	Schema: DB2INST1
	Name: 	T1
	Type: 	Table
			Time of creation: 		2015-10-02-21.30.18.109503
			Last statistics update: 	2015-10-02-21.30.53.209923
			Number of columns: 		2
			Number of rows: 		100000
			Width of rows: 			114
			Number of buffer pool pages: 	362
			Number of data partitions: 	1
			Distinct row values: 		No
			Tablespace name: 		USERSPACE1
			Tablespace overhead: 		1.000000
			Tablespace transfer rate: 	1.000000
			Source for statistics: 		Single Node
			Prefetch page count: 		32
			Container extent page count: 	32
			Table overflow record count: 	0
			Table Active Blocks: 		-1
			Average Row Compression Ratio: 	0
			Percentage Rows Compressed: 	0
			Average Compressed Row Size: 	0

...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39067609
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс. Размер страницы в 32K, экстент и префетч по 32 страницы.

Играя CPU speed, TRANSFERRATE И OVERHEAD, я получил уравнение:

total cost = (I/O Cost)* OVERHEAD + 46*TRANSFERRATE + (Re-Total Cost)

Re-Total Cost - по-видимому, пересчитанное в стоимость CPU.
I/O Cost - похоже, количество экстентов.
Но что же такое 46?
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39067804
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У нас есть:

Параметры DBM:
CPUSPEED

Параметры табличного пространства:
PAGESIZE
EXTENTSIZE
OVERHEAD
TRANSFERRATE
PREFETCHSIZE
(неявный - количество контейнеров?)

Параметры буферпула
SIZE
NUMBLOCKPAGES
BLOCKSIZE

Таблица
Number of Pages

Играя этими параметрами, можно составить систему линейных уравнений.

Далее я ожидал, что будут расчитаны многоблочные чтения, но Prefetch eligible почему-то нет.
Таблица в 362 страницы занимает 11 полных 32-страничых экстентов и ещё один на одну треть.
Время многоблочных чтений - 12 * (OVERHEAD + 32*TRANSFERRATE), когда OVERHEAD=1 и TRANSFERRATE =1, это 396.
Время одноблочных чтений - 362*(OVERHEAD+TRANSFERRATE) = 724

Но расчёты по цифрам из EXPLAIN показывают даже не 362*OVERHEAD+362*TRANSFERRATE, а 362*OVERHEAD+46*TRANSFERRATE. Быть может, это какая-нибудь эвристика на тему "а может, эти страницы уже в буферном пуле", и тогда надо попробовать радикально увеличить размер таблицы и/или уменьшить размер буферного пула.
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39072582
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Предположим, что
OVERHEAD*A + TRANSFERRATE*B + cpuspeed*C = cost

Я переберу
(10,1,1)
(1,10,1)
(1,1,1)
вот так (r10000000 - это rows=10000000):
Код: sql
1.
2.
3.
4.
5.
6.
ALTER TABLESPACE testbp OVERHEAD 10 TRANSFERRATE  1 @
explain all SET QUERYNO = 1 SET QUERYTAG = 'r10000000' for SELECT * FROM t1 x1 @
ALTER TABLESPACE testbp OVERHEAD  1 TRANSFERRATE 10 @
explain all SET QUERYNO = 2 SET QUERYTAG = 'r10000000' for SELECT * FROM t1 x2 @
ALTER TABLESPACE testbp OVERHEAD  1 TRANSFERRATE  1 @
explain all SET QUERYNO = 3 SET QUERYTAG = 'r10000000' for SELECT * FROM t1 x3 @


cpuspeed на самом деле установлена в 1e-06, так надо будет поделить C на это число.
Получаем систему
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
 10A  +  1B + 1C = cost1
  1A  + 10B + 1C = cost2
  1A  +  1B + 1C = cost3

 A = (cost1-cost3)/9
 B = (cost2-cost3)/9
 C = cost3 - A - B = cost1 - (cost1-cost3)/9 - (cost2-cost3)/9
и запрос
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
with
  xxx as (
    select 
      explain_time,
      cast((lag(total_cost,2) over(partition by querytag order by explain_time)-total_cost)/9 
        as decimal(20,10)) A,
      cast((lag(total_cost,1) over(partition by querytag order by explain_time)-total_cost)/9 
        as decimal(20,10)) B,
      cast(total_cost
      - (lag(total_cost,2) over(partition by querytag order by explain_time)-total_cost)/9
      - (lag(total_cost,1) over(partition by querytag order by explain_time)-total_cost)/9 
        as decimal(20,10)) C,
      row_number()over(partition by querytag order by explain_time) rn#
    from explain_statement
    where explain_level='P'
  )
select *
from xxx
where rn# = 3
order by explain_time
@
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39072595
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
EXPLAIN_TIME               A                      B                      C                      RN#                 
-------------------------- ---------------------- ---------------------- ---------------------- --------------------
2015-10-09-12.13.06.832436       45129,9930555556      361035,0069444445      174429,4375000001                    3
2015-10-09-11.39.48.458501        4513,0000000000       36103,9982638889       17442,9861111111                    3
2015-10-09-12.04.06.971754         452,0000000000        3611,0001085069        1744,3465711805                    3
2015-10-09-12.05.04.294885          46,0000000000         361,9999864366         174,4847547743                    3
2015-10-09-12.05.56.261606           5,0000000000          37,0000000000          17,4949645996                    3
2015-10-09-12.06.34.939447           3,9999996821           3,9999996821           1,8133160273                    3
2015-10-09-12.07.25.185549           1,0000000000           1,0000000000           0,2245149612                    3
это у меня вышло для страницы 32K, extent = 32, prefetch = 32.
количество строк от 100 до 100000000.
Колонка B равна количеству занимаемых страниц.
Колонка A могла бы быть связана с количеством экстентов.
362 (страницы)/32(страниц в экстенте)=11.3125, т.е. 12 экстентов.
Но при пересозданном TS, extent = 8, prefetch = 8 (проверил только вторую строчку сверху) она у меня не поменялась.

Однако 46 близок к 362/8.
Итак,
Код: plaintext
1.
2.
3.
4.
5.
6.
EXPLAIN_TIME               A                      B                      C                      RN#                 
-------------------------- ---------------------- ---------------------- ---------------------- --------------------
2015-10-09-12.42.07.080804       18052,0000000000       36104,0000000000       17548,5937500000                    3
2015-10-09-12.45.27.920086        9026,0000000000       36104,0000000000       17478,1875000000                    3
2015-10-09-12.16.58.534075        4513,0000000000       36103,9982638889       17442,9861111111                    3
2015-10-09-11.39.48.458501        4513,0000000000       36103,9982638889       17442,9861111111                    3
при extsize 2,4,8,32.

Не считает возможным считывать больше 256К за раз?
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39072683
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Положим OVERHEAD=10 и TRANSFERRATE=0.4.
Читаем 1 мег.
32 страницы читаются за 32*TRANSFERRATE=12.8 мс.
К этому прибавляется OVERHEAD, который будет 10 или 40, в зависимости от того, кусками по 256к или 1м читает.
Отсюда гигантская разница в общей стоимости.

Разумеется, это только расчётное, а в реальности разница во времени может быть много меньше, потому что куски лежат рядом.
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39073522
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Под виндами (Windows server 2008r2) картина на NTFS та же, в оценщике ограничение в 256К на порцию (под линухом iostat показал, что это и физически так). (Надо ещё raw devices попробовать). Гуглежом пытался найти, где такое ограничение у DB2 установлено (считается, что Оракуль спрашивает ограничение у операционной системы и что у винды и традиционного линуха это 1 М), но ничего не смог.

Ещё попробовал extent size = 2, prefetch size = 2 и 4 с одним и двумя контейнерами - разницы в цене не увидал.
...
Рейтинг: 0 / 0
оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
    #39091822
Victor Metelitsa
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Victor MetelitsaНе считает возможным считывать больше 256К за раз?
И немудрено - в /sys/block/sdA/queue/max_sectors_kb стоит 256.
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / IBM DB2, WebSphere, IMS, U2 [игнор отключен] [закрыт для гостей] / оценка стоимости (вдохновляясь "Cost Based Oracle Fundamentals" by Jonathan Lewis)
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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