Skip to content

Commit 7bd20dd

Browse files
authored
Merge pull request #2069 from yahonda/backport_2055_to_release60
Merge pull request #2055 from yahonda/slow_indexes
2 parents 06b3acf + 09227d2 commit 7bd20dd

File tree

5 files changed

+45
-39
lines changed

5 files changed

+45
-39
lines changed

lib/active_record/connection_adapters/oracle_enhanced/connection.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@ def describe(name)
3535
table_owner, table_name = default_owner, real_name
3636
end
3737
sql = <<~SQL.squish
38-
SELECT owner, table_name, 'TABLE' name_type
38+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, table_name, 'TABLE' name_type
3939
FROM all_tables
4040
WHERE owner = '#{table_owner}'
4141
AND table_name = '#{table_name}'

lib/active_record/connection_adapters/oracle_enhanced/schema_dumper.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -169,7 +169,7 @@ def default_primary_key?(column)
169169
def extract_expression_for_virtual_column(column)
170170
column_name = column.name
171171
@connection.select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name.upcase), bind_string("column_name", column_name.upcase)]).inspect
172-
select data_default from all_tab_columns
172+
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ data_default from all_tab_columns
173173
where owner = SYS_CONTEXT('userenv', 'current_schema')
174174
and table_name = :table_name
175175
and column_name = :column_name

lib/active_record/connection_adapters/oracle_enhanced/schema_statements.rb

Lines changed: 17 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,8 @@ module SchemaStatements
1212

1313
def tables #:nodoc:
1414
select_values(<<~SQL.squish, "tables")
15-
SELECT DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name)
15+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
16+
DECODE(table_name, UPPER(table_name), LOWER(table_name), table_name)
1617
FROM all_tables
1718
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
1819
AND secondary = 'N'
@@ -44,7 +45,7 @@ def table_exists?(table_name)
4445
end
4546

4647
select_values(<<~SQL.squish, "table exists", [bind_string("owner", table_owner), bind_string("table_name", table_name)]).any?
47-
SELECT owner, table_name
48+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, table_name
4849
FROM all_tables
4950
WHERE owner = :owner
5051
AND table_name = :table_name
@@ -60,20 +61,22 @@ def data_source_exists?(table_name)
6061

6162
def views # :nodoc:
6263
select_values(<<~SQL.squish, "views")
63-
SELECT LOWER(view_name) FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
64+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
65+
LOWER(view_name) FROM all_views WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
6466
SQL
6567
end
6668

6769
def materialized_views #:nodoc:
6870
select_values(<<~SQL.squish, "materialized views")
69-
SELECT LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
71+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
72+
LOWER(mview_name) FROM all_mviews WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
7073
SQL
7174
end
7275

7376
# get synonyms for schema dump
7477
def synonyms
7578
result = select_all(<<~SQL.squish, "synonyms")
76-
SELECT synonym_name, table_owner, table_name
79+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ synonym_name, table_owner, table_name
7780
FROM all_synonyms where owner = SYS_CONTEXT('userenv', 'current_schema')
7881
SQL
7982

@@ -88,7 +91,7 @@ def indexes(table_name) #:nodoc:
8891
default_tablespace_name = default_tablespace
8992

9093
result = select_all(<<~SQL.squish, "indexes", [bind_string("table_name", table_name)])
91-
SELECT LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
94+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ LOWER(i.table_name) AS table_name, LOWER(i.index_name) AS index_name, i.uniqueness,
9295
i.index_type, i.ityp_owner, i.ityp_name, i.parameters,
9396
LOWER(i.tablespace_name) AS tablespace_name,
9497
LOWER(c.column_name) AS column_name, e.column_expression,
@@ -118,7 +121,7 @@ def indexes(table_name) #:nodoc:
118121
if row["index_type"] == "DOMAIN" && row["ityp_owner"] == "CTXSYS" && row["ityp_name"] == "CONTEXT"
119122
procedure_name = default_datastore_procedure(row["index_name"])
120123
source = select_values(<<~SQL.squish, "procedure", [bind_string("procedure_name", procedure_name.upcase)]).join
121-
SELECT text
124+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
122125
FROM all_source
123126
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
124127
AND name = :procedure_name
@@ -362,7 +365,7 @@ def index_name(table_name, options) #:nodoc:
362365
def index_name_exists?(table_name, index_name)
363366
(_owner, table_name) = @connection.describe(table_name)
364367
result = select_value(<<~SQL.squish, "index name exists")
365-
SELECT 1 FROM all_indexes i
368+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ 1 FROM all_indexes i
366369
WHERE i.owner = SYS_CONTEXT('userenv', 'current_schema')
367370
AND i.table_owner = SYS_CONTEXT('userenv', 'current_schema')
368371
AND i.table_name = '#{table_name}'
@@ -496,7 +499,7 @@ def change_column_comment(table_name, column_name, comment_or_changes)
496499
def table_comment(table_name) #:nodoc:
497500
(_owner, table_name) = @connection.describe(table_name)
498501
select_value(<<~SQL.squish, "Table comment", [bind_string("table_name", table_name)])
499-
SELECT comments FROM all_tab_comments
502+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_tab_comments
500503
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
501504
AND table_name = :table_name
502505
SQL
@@ -512,7 +515,7 @@ def column_comment(table_name, column_name) #:nodoc:
512515
# TODO: it does not exist in Abstract adapter
513516
(_owner, table_name) = @connection.describe(table_name)
514517
select_value(<<~SQL.squish, "Column comment", [bind_string("table_name", table_name), bind_string("column_name", column_name.upcase)])
515-
SELECT comments FROM all_col_comments
518+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_col_comments
516519
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
517520
AND table_name = :table_name
518521
AND column_name = :column_name
@@ -529,7 +532,7 @@ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) #:nodoc:
529532

530533
def tablespace(table_name)
531534
select_value(<<~SQL.squish, "tablespace")
532-
SELECT tablespace_name
535+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ tablespace_name
533536
FROM all_tables
534537
WHERE table_name='#{table_name.to_s.upcase}'
535538
AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -541,7 +544,7 @@ def foreign_keys(table_name) #:nodoc:
541544
(_owner, desc_table_name) = @connection.describe(table_name)
542545

543546
fk_info = select_all(<<~SQL.squish, "Foreign Keys", [bind_string("desc_table_name", desc_table_name)])
544-
SELECT r.table_name to_table
547+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ r.table_name to_table
545548
,rc.column_name references_column
546549
,cc.column_name
547550
,c.constraint_name name
@@ -583,7 +586,7 @@ def extract_foreign_key_action(specifier) # :nodoc:
583586

584587
def disable_referential_integrity(&block) #:nodoc:
585588
old_constraints = select_all(<<~SQL.squish, "Foreign Keys to disable and enable")
586-
SELECT constraint_name, owner, table_name
589+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ constraint_name, owner, table_name
587590
FROM all_constraints
588591
WHERE constraint_type = 'R'
589592
AND status = 'ENABLED'
@@ -699,7 +702,7 @@ def rebuild_primary_key_index_to_default_tablespace(table_name, options)
699702
return unless tablespace
700703

701704
index_name = select_value(<<~SQL.squish, "Index name for primary key", [bind_string("table_name", table_name.upcase)])
702-
SELECT index_name FROM all_constraints
705+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ index_name FROM all_constraints
703706
WHERE table_name = :table_name
704707
AND constraint_type = 'P'
705708
AND owner = SYS_CONTEXT('userenv', 'current_schema')

lib/active_record/connection_adapters/oracle_enhanced/structure_dump.rb

Lines changed: 19 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,8 @@ module StructureDump #:nodoc:
99

1010
def structure_dump #:nodoc:
1111
sequences = select(<<~SQL.squish, "sequences to dump at structure dump")
12-
SELECT sequence_name, min_value, max_value, increment_by, order_flag, cycle_flag
12+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
13+
sequence_name, min_value, max_value, increment_by, order_flag, cycle_flag
1314
FROM all_sequences
1415
where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
1516
SQL
@@ -18,7 +19,7 @@ def structure_dump #:nodoc:
1819
"CREATE SEQUENCE #{quote_table_name(result["sequence_name"])} MINVALUE #{result["min_value"]} MAXVALUE #{result["max_value"]} INCREMENT BY #{result["increment_by"]} #{result["order_flag"] == 'Y' ? "ORDER" : "NOORDER"} #{result["cycle_flag"] == 'Y' ? "CYCLE" : "NOCYCLE"}"
1920
end
2021
tables = select_values(<<~SQL.squish, "tables at structure dump")
21-
SELECT table_name FROM all_tables t
22+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables t
2223
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
2324
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
2425
WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
@@ -30,7 +31,7 @@ def structure_dump #:nodoc:
3031
virtual_columns = virtual_columns_for(table_name) if supports_virtual_columns?
3132
ddl = +"CREATE#{ ' GLOBAL TEMPORARY' if temporary_table?(table_name)} TABLE \"#{table_name}\" (\n"
3233
columns = select_all(<<~SQL.squish, "columns at structure dump")
33-
SELECT column_name, data_type, data_length, char_used, char_length,
34+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_type, data_length, char_used, char_length,
3435
data_precision, data_scale, data_default, nullable
3536
FROM all_tab_columns
3637
WHERE table_name = '#{table_name}'
@@ -90,7 +91,7 @@ def structure_dump_virtual_column(column, data_default) #:nodoc:
9091
def structure_dump_primary_key(table) #:nodoc:
9192
opts = { name: "", cols: [] }
9293
pks = select_all(<<~SQL.squish, "Primary Keys")
93-
SELECT a.constraint_name, a.column_name, a.position
94+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
9495
FROM all_cons_columns a
9596
JOIN all_constraints c
9697
ON a.constraint_name = c.constraint_name
@@ -109,7 +110,7 @@ def structure_dump_primary_key(table) #:nodoc:
109110
def structure_dump_unique_keys(table) #:nodoc:
110111
keys = {}
111112
uks = select_all(<<~SQL.squish, "Primary Keys")
112-
SELECT a.constraint_name, a.column_name, a.position
113+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ a.constraint_name, a.column_name, a.position
113114
FROM all_cons_columns a
114115
JOIN all_constraints c
115116
ON a.constraint_name = c.constraint_name
@@ -145,7 +146,7 @@ def structure_dump_indexes(table_name) #:nodoc:
145146

146147
def structure_dump_fk_constraints #:nodoc:
147148
foreign_keys = select_all(<<~SQL.squish, "foreign keys at structure dump")
148-
SELECT table_name FROM all_tables
149+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
149150
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
150151
SQL
151152
fks = foreign_keys.map do |table|
@@ -173,7 +174,7 @@ def structure_dump_table_comments(table_name)
173174
def structure_dump_column_comments(table_name)
174175
comments = []
175176
columns = select_values(<<~SQL.squish, "column comments at structure dump")
176-
SELECT column_name FROM user_tab_columns
177+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name FROM user_tab_columns
177178
WHERE table_name = '#{table_name}' ORDER BY column_id
178179
SQL
179180

@@ -207,7 +208,7 @@ def foreign_key_definition(to_table, options = {}) #:nodoc:
207208
def structure_dump_db_stored_code #:nodoc:
208209
structure = []
209210
all_source = select_all(<<~SQL.squish, "stored program at structure dump")
210-
SELECT DISTINCT name, type
211+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ DISTINCT name, type
211212
FROM all_source
212213
WHERE type IN ('PROCEDURE', 'PACKAGE', 'PACKAGE BODY', 'FUNCTION', 'TRIGGER', 'TYPE')
213214
AND name NOT LIKE 'BIN$%'
@@ -216,7 +217,7 @@ def structure_dump_db_stored_code #:nodoc:
216217
all_source.each do |source|
217218
ddl = +"CREATE OR REPLACE \n"
218219
texts = select_all(<<~SQL.squish, "all source at structure dump")
219-
SELECT text
220+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ text
220221
FROM all_source
221222
WHERE name = '#{source['name']}'
222223
AND type = '#{source['type']}'
@@ -239,7 +240,7 @@ def structure_dump_db_stored_code #:nodoc:
239240
def structure_dump_views #:nodoc:
240241
structure = []
241242
views = select_all(<<~SQL.squish, "views at structure dump")
242-
SELECT view_name, text FROM all_views
243+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ view_name, text FROM all_views
243244
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY view_name ASC
244245
SQL
245246
views.each do |view|
@@ -251,7 +252,7 @@ def structure_dump_views #:nodoc:
251252
def structure_dump_synonyms #:nodoc:
252253
structure = []
253254
synonyms = select_all(<<~SQL.squish, "synonyms at structure dump")
254-
SELECT owner, synonym_name, table_name, table_owner
255+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, synonym_name, table_name, table_owner
255256
FROM all_synonyms
256257
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
257258
SQL
@@ -264,13 +265,14 @@ def structure_dump_synonyms #:nodoc:
264265

265266
def structure_drop #:nodoc:
266267
sequences = select_values(<<~SQL.squish, "sequences to drop at structure dump")
267-
SELECT sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
268+
SELECT/*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
269+
sequence_name FROM all_sequences where sequence_owner = SYS_CONTEXT('userenv', 'current_schema') ORDER BY 1
268270
SQL
269271
statements = sequences.map do |seq|
270272
"DROP SEQUENCE \"#{seq}\""
271273
end
272274
tables = select_values(<<~SQL.squish, "tables to drop at structure dump")
273-
SELECT table_name from all_tables t
275+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name from all_tables t
274276
WHERE owner = SYS_CONTEXT('userenv', 'current_schema') AND secondary = 'N'
275277
AND NOT EXISTS (SELECT mv.mview_name FROM all_mviews mv
276278
WHERE mv.owner = t.owner AND mv.mview_name = t.table_name)
@@ -286,7 +288,7 @@ def structure_drop #:nodoc:
286288

287289
def temp_table_drop #:nodoc:
288290
temporary_tables = select_values(<<~SQL.squish, "temporary tables to drop at structure dump")
289-
SELECT table_name FROM all_tables
291+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ table_name FROM all_tables
290292
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
291293
AND secondary = 'N' AND temporary = 'Y' ORDER BY 1
292294
SQL
@@ -321,7 +323,7 @@ def execute_structure_dump(string)
321323
# return [{'column_name' => 'FOOS', 'data_default' => '...'}, ...]
322324
def virtual_columns_for(table)
323325
select_all(<<~SQL.squish, "virtual columns for")
324-
SELECT column_name, data_default
326+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_default
325327
FROM all_tab_cols
326328
WHERE virtual_column = 'YES'
327329
AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -332,7 +334,7 @@ def virtual_columns_for(table)
332334
def drop_sql_for_feature(type)
333335
short_type = type == "materialized view" ? "mview" : type
334336
features = select_values(<<~SQL.squish, "features to drop")
335-
SELECT #{short_type}_name FROM all_#{short_type.tableize}
337+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ #{short_type}_name FROM all_#{short_type.tableize}
336338
where owner = SYS_CONTEXT('userenv', 'current_schema')
337339
SQL
338340
statements = features.map do |name|
@@ -343,7 +345,7 @@ def drop_sql_for_feature(type)
343345

344346
def drop_sql_for_object(type)
345347
objects = select_values(<<~SQL.squish, "objects to drop")
346-
SELECT object_name FROM all_objects
348+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ object_name FROM all_objects
347349
WHERE object_type = '#{type.upcase}' and owner = SYS_CONTEXT('userenv', 'current_schema')
348350
SQL
349351
statements = objects.map do |name|

0 commit comments

Comments
 (0)