-
Notifications
You must be signed in to change notification settings - Fork 0
/
ejercicio_linkedin_fragmentacion_01.sql
426 lines (294 loc) · 13 KB
/
ejercicio_linkedin_fragmentacion_01.sql
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
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
-- EJERCICIO RENDIMIENTO DEBIDO A FRAGMENTACION--
CREATE TABLESPACE tbs1_error_allocate
DATAFILE 'C:\APP\XMY9080\ORADATA\ORCL\tbs1_error_allocate.DBF'
size 800m;
DROP TABLESPACE tbs1_error_allocate INCLUDING CONTENTS AND DATAFILES;
-- ADDING A BIGGER TABLESPACE FOR THE temp tablespace
ALTER TABLESPACE TEMP TABLESPACE GROUP tempgroup1;
CREATE TEMPORARY TABLESPACE TEMP1
TEMPFILE 'C:\APP\XMY9080\ORADATA\ORCL\TEMP1_DATAFILE_TEMPGROUP1.DBF'
SIZE 500m
TABLESPACE GROUP tempgroup1;
-- creando más espacio temporal para TEMP1, debido al error: ORA-01652: unable to extend temp segment by 128 in tablespace TEMP1
alter database TEMPFILE 'C:\APP\XMY9080\ORADATA\ORCL\TEMP1_DATAFILE_TEMPGROUP1.DBF' autoextend on maxsize 2000M;
ALTER TABLESPACE tbs1_error_allocate
ADD DATAFILE 'C:\APP\XMY9080\ORADATA\ORCL\tbs1_index_error_allocate.dbf'
SIZE 50m
AUTOEXTEND ON
NEXT 1024k
--NEXT 512k
MAXSIZE 500M;
ALTER TABLESPACE tbs1_error_allocate
ADD DATAFILE 'C:\APP\XMY9080\ORADATA\ORCL\tbs1_index_error_allocate2.dbf'
SIZE 50m
AUTOEXTEND ON
NEXT 1024k
--NEXT 512k
MAXSIZE 500M;
-- BUILDING TABLESPACE TABLE
CREATE TABLE hr.table_tbs1_error_allocate(consecutive_id number, id number, name char(20), last_name char(20)) tablespace tbs1_error_allocate;
-- BUILDING INDEX TABLE
CREATE UNIQUE INDEX index_error_allocate ON hr.table_tbs1_error_allocate(name) TABLESPACE tbs1_error_allocate;
DROP INDEX index_error_allocate;
select * from hr.table_tbs1_error_allocate;
select count(*) from hr.table_tbs1_error_allocate; --max size= 785,539 -- 785539
DELETE FROM hr.table_tbs1_error_allocate;
DROP TABLE hr.table_tbs1_error_allocate;
-- LlENADO DE LA TABLA: table_tbs1_error_allocate
DECLARE
-- time garbage variables --
Inicio_hora number;
Inicio_minuto number;
Inicio_segundo number;
Fin_hora number;
Fin_minuto number;
Fin_segundo number;
Tiempototal_hora number;
Tiempototal_minuto number;
Tiempototal_segundo number;
---
Uppercase_letter char(10);
Lowercase_letter char(10);
Random_number number;
Final_length number:=100000000;
Consecutive_number number:=1;
i number:=1;
BEGIN
select extract(HOUR from HORA) HORAS INTO Inicio_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Inicio_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Inicio_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
FOR i IN 1 .. Final_length LOOP
Lowercase_letter:=dbms_random.string('l',10);
Uppercase_letter:=dbms_random.string('u',10);
Random_number:=round(DBMS_RANDOM.value(1,300));
--DBMS_OUTPUT.put_line(Lowercase_letter);
--DBMS_OUTPUT.put_line(Random_number);
INSERT INTO hr.table_tbs1_error_allocate VALUES(i, Random_number, Lowercase_letter, Uppercase_letter);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('OTHERS EXCEPTION');
select count(*) INTO i FROM hr.table_tbs1_error_allocate;
select extract(HOUR from HORA) HORAS INTO Fin_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Fin_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Fin_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
Tiempototal_hora:=Fin_hora-Inicio_hora;
Tiempototal_minuto:=Fin_minuto-Inicio_minuto;
Tiempototal_segundo:=Fin_segundo-Inicio_segundo;
dbms_output.put_line('Final length: ' || to_char(i));
dbms_output.put_line ('Inicio: ' ||Inicio_hora || ':' || Inicio_minuto || ':' || Inicio_segundo);
dbms_output.put_line ('Fin: ' ||Fin_hora || ':' || Fin_minuto || ':' || Fin_segundo);
dbms_output.put_line('Tiempo Transcurrido: ' || Tiempototal_hora|| ':' || Tiempototal_minuto || ':' || Tiempototal_segundo);
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
COMMIT;
-- Borrado de Bloques aleatorios en la tabla: table_tbs1_error_allocate
select count(*) from hr.table_tbs1_error_allocate WHERE NAME LIKE 'a%'; -- 496660
select count(*) from hr.table_tbs1_error_allocate WHERE NAME LIKE 'z%'; --497712
select count(*) from hr.table_tbs1_error_allocate WHERE NAME LIKE 'h%'; --496832
DELETE from hr.table_tbs1_error_allocate WHERE NAME LIKE 'a%';
DELETE from hr.table_tbs1_error_allocate WHERE NAME LIKE 'h%';
DELETE from hr.table_tbs1_error_allocate WHERE NAME LIKE 'z%';
---
-- Calculo de Tiempo con un order by string last_name
-- Antes del Shrink
DECLARE
Inicio_hora number;
Inicio_minuto number;
Inicio_segundo number;
Fin_hora number;
Fin_minuto number;
Fin_segundo number;
Tiempototal_hora number;
Tiempototal_minuto number;
Tiempototal_segundo number;
--Cursor para guardar el order by
CURSOR cursor_ordenado IS SELECT * FROM hr.table_tbs1_error_allocate ORDER BY name ASC;
--Tabla para hacer el Fetch del cursor
TYPE type_table_tbs1 IS TABLE OF HR.table_tbs1_error_allocate%ROWTYPE INDEX BY BINARY_INTEGER;
t_before_shrink type_table_tbs1;
t_after_shrink type_table_tbs1;
BEGIN
select extract(HOUR from HORA) HORAS INTO Inicio_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Inicio_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Inicio_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
--dbms_output.put_line('Hora inicio: ' || Inicio);
-- Iniciando El cursor before_shrink_cursor:
OPEN cursor_ordenado;
FETCH cursor_ordenado BULK COLLECT INTO t_before_shrink;
select extract(HOUR from HORA) HORAS INTO Fin_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Fin_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Fin_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
Tiempototal_hora:=Fin_hora-Inicio_hora;
Tiempototal_minuto:=Fin_minuto-Inicio_minuto;
Tiempototal_segundo:=Fin_segundo-Inicio_segundo;
dbms_output.put_line('Tiempo SELECT cursor no index: ');
dbms_output.put_line ('Inicio: ' ||Inicio_hora || ':' || Inicio_minuto || ':' || Inicio_segundo);
dbms_output.put_line ('Fin: ' ||Fin_hora || ':' || Fin_minuto || ':' || Fin_segundo);
dbms_output.put_line('Tiempo Transcurrido: ' || Tiempototal_hora|| ':' || Tiempototal_minuto || ':' || Tiempototal_segundo);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('Tiempo SELECT cursor: ');
dbms_output.put_line('OTHERS EXCEPTION');
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
-- Despues del Shrink
-- Activando el movimiento de fila en la tabla:
alter table hr.table_tbs1_error_allocate enable row movement;
-- Activando el shrink space command
alter table hr.table_tbs1_error_allocate shrink space; -- 1849.63 seconds -> 30 minutos ->1735 -> 28 min
----------------
CREATE TABLESPACE TBS_TABLE_DELETE
DATAFILE 'C:\APP\XMY9080\ORADATA\ORCL\TBS_TABLE_DELETE.DBF'
size 10m
REUSE;
DROP TABLESPACE TBS_TABLE_DELETE INCLUDING CONTENTS AND DATAFILES;
CREATE TABLE hr.TABLE_DELETE(consecutive_id number, id number, name char(20), last_name char(20)) tablespace TBS_TABLE_DELETE;
CREATE TABLESPACE TBS_TABLE_TRUNCATE
DATAFILE 'C:\APP\XMY9080\ORADATA\ORCL\TBS_TABLE_TRUNCATE.DBF'
size 10m
REUSE;
DROP TABLESPACE TBS_TABLE_TRUNCATE INCLUDING CONTENTS AND DATAFILES;
CREATE TABLE hr.TABLE_TRUNCATE(consecutive_id number, id number, name char(20), last_name char(20)) tablespace TBS_TABLE_TRUNCATE;
SELECT TABLESPACE_NAME, FILE_ID, BLOCK_ID, BYTES/1024/1024 BYTES_MB, BLOCKS, RELATIVE_FNO
FROM dba_free_space
WHERE TABLESPACE_NAME IN ('TBS_TABLE_DELETE','TBS_TABLE_TRUNCATE');
SELECT TABLESPACE_NAME, BYTES/1024/1024 BYTES_MB
FROM dba_free_space
WHERE TABLESPACE_NAME IN ('TBS_TABLE_DELETE','TBS_TABLE_TRUNCATE');
SELECT TABLESPACE_NAME, BYTES/1024/1024 BYTES_MB FROM dba_data_files
WHERE TABLESPACE_NAME IN ('TBS_TABLE_DELETE','TBS_TABLE_TRUNCATE');
DECLARE
Uppercase_letter char(10);
Lowercase_letter char(10);
Random_number number;
Final_length number:=10000000;
Consecutive_number number:=1;
i number:=1;
BEGIN
FOR i IN 1 .. Final_length LOOP
Lowercase_letter:=dbms_random.string('l',10);
Uppercase_letter:=dbms_random.string('u',10);
Random_number:=round(DBMS_RANDOM.value(1,300));
INSERT INTO HR.TABLE_SHRINK_COMMAND VALUES(i, Random_number, Lowercase_letter, Uppercase_letter);
END LOOP;
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(sqlerrm);
END;
/
SELECT TABLESPACE_NAME, BYTES/1024/1024 BYTES_MB
FROM dba_free_space
WHERE TABLESPACE_NAME IN ('TBS_TABLE_DELETE','TBS_TABLE_TRUNCATE');
DECLARE
start_time TIMESTAMP;
end_time TIMESTAMP;
duration_time INTERVAL DAY(1) TO SECOND(4);
--Cursor DECLARATION
CURSOR CURSOR_ORDER_BY IS SELECT * FROM HR.TABLE_SHRINK_COMMAND ORDER BY name ASC;
--Table Type to Fetch CURSOR_ORDER_BY
TYPE type_table_tbs1 IS TABLE OF HR.TABLE_SHRINK_COMMAND%ROWTYPE INDEX BY BINARY_INTEGER;
t_shrink_command type_table_tbs1;
BEGIN
SELECT SYSTIMESTAMP INTO start_time FROM DUAL;
OPEN CURSOR_ORDER_BY;
FETCH CURSOR_ORDER_BY BULK COLLECT INTO t_shrink_command;
SELECT SYSTIMESTAMP INTO end_time FROM DUAL;
duration_time:=end_time-start_time;
dbms_output.put_line('Duration Time: ' || duration_time);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
DELETE from HR.TABLE_SHRINK_COMMAND WHERE NAME LIKE 'a%';
DELETE from HR.TABLE_SHRINK_COMMAND WHERE NAME LIKE 'v%';
DELETE from HR.TABLE_SHRINK_COMMAND WHERE NAME LIKE 'z%';
DELETE from HR.TABLE_SHRINK_COMMAND WHERE NAME LIKE 'd%';
DELETE from HR.TABLE_SHRINK_COMMAND WHERE NAME LIKE 'h%';
EXPLAIN PLAN FOR SELECT * FROM HR.TABLE_SHRINK_COMMAND ORDER BY name ASC;
SELECT COUNT(*) FROM HR.TABLE_SHRINK_COMMAND;
COMMIT;
---------------------------------
-------- TEMP QUERYS ------------
---------------------------------
select SYSTIMESTAMP FROM DUAL;
-- temp querys
DECLARE
Inicio_hora number;
Inicio_minuto number;
Inicio_segundo number;
Fin_hora number;
Fin_minuto number;
Fin_segundo number;
Tiempototal_hora number;
Tiempototal_minuto number;
Tiempototal_segundo number;
--Cursor para guardar el order by
CURSOR cursor_ordenado IS SELECT * FROM hr.table_tbs1_error_allocate ORDER BY name ASC;
--Tabla para hacer el Fetch del cursor
TYPE type_table_tbs1 IS TABLE OF HR.table_tbs1_error_allocate%ROWTYPE INDEX BY BINARY_INTEGER;
t_before_shrink type_table_tbs1;
t_after_shrink type_table_tbs1;
BEGIN
select extract(HOUR from HORA) HORAS INTO Inicio_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Inicio_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Inicio_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
--dbms_output.put_line('Hora inicio: ' || Inicio);
-- Iniciando El cursor before_shrink_cursor:
OPEN cursor_ordenado;
FETCH cursor_ordenado BULK COLLECT INTO t_before_shrink;
select extract(HOUR from HORA) HORAS INTO Fin_hora FROM (SELECT SYSTIMESTAMP HORA FROM DUAL);
select extract(MINUTE from MINUTO) MINUTOS INTO Fin_minuto FROM (SELECT SYSTIMESTAMP MINUTO FROM DUAL);
select extract(SECOND from SEGUNDO) SEGUNDOS INTO Fin_segundo FROM (SELECT SYSTIMESTAMP SEGUNDO FROM DUAL);
Tiempototal_hora:=Fin_hora-Inicio_hora;
Tiempototal_minuto:=Fin_minuto-Inicio_minuto;
Tiempototal_segundo:=Fin_segundo-Inicio_segundo;
dbms_output.put_line ('Inicio: ' ||Inicio_hora || ':' || Inicio_minuto || ':' || Inicio_segundo);
dbms_output.put_line ('Fin: ' ||Fin_hora || ':' || Fin_minuto || ':' || Fin_segundo);
dbms_output.put_line('Tiempo Transcurrido: ' || Tiempototal_hora|| ':' || Tiempototal_minuto || ':' || Tiempototal_segundo);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line('OTHERS EXCEPTION');
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;
-----
---22
SELECT * from dba_temp_files;
SELECT FILE_NAME, FILE_ID, TABLESPACE_NAME, BYTES/1024/1024, BLOCKS, STATUS, RELATIVE_FNO,
AUTOEXTENSIBLE, MAXBYTES/1024/1024, MAXBLOCKS, INCREMENT_BY, USER_BYTES/1024/1024, USER_BLOCKS,
SHARED, INST_ID FROM dba_temp_files;
SELECT TABLESPACE_NAME, FILE_ID, BLOCK_ID, BYTES/1024/1024, BLOCKS, RELATIVE_FNO FROM dba_free_space;
SELECT * FROM dba_tablespace_groups;
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
SELECT * FROM dba_data_files;
ALTER TABLESPACE TEMP TABLESPACE GROUP tempgroup1;
ALTER TABLESPACE [TEMP_TABLSEPACE_NAME] TABLESPACE GROUP [TEMP_TABLESPACE_GROUP_NAME];
SELECT * FROM DATABASE_PROPERTIES WHERE PROPERTY_NAME='DEFAULT_TEMP_TABLESPACE';
ALTER DATABASE DEFAULT TEMPORARY TABLESPACE tempgroup1ds
---
duration time
DECLARE
start_time TIMESTAMP;
end_time TIMESTAMP;
duration_time INTERVAL DAY(1) TO SECOND(4);
--Cursor DECLARATION
CURSOR CURSOR_ORDER_BY IS SELECT * FROM HR.TABLE_SHRINK_COMMAND ORDER BY name ASC;
--Table Type to Fetch CURSOR_ORDER_BY
TYPE type_table_tbs1 IS TABLE OF HR.TABLE_SHRINK_COMMAND%ROWTYPE INDEX BY BINARY_INTEGER;
t_shrink_command type_table_tbs1;
BEGIN
SELECT SYSTIMESTAMP INTO start_time FROM DUAL;
OPEN CURSOR_ORDER_BY;
FETCH CURSOR_ORDER_BY BULK COLLECT INTO t_shrink_command;
SELECT SYSTIMESTAMP INTO end_time FROM DUAL;
duration_time:=end_time-start_time;
dbms_output.put_line('Duration Time: ' || duration_time);
EXCEPTION
WHEN OTHERS THEN
dbms_output.put_line(sqlcode);
dbms_output.put_line(sqlerrm);
END;