Skip to content

Commit e064530

Browse files
authored
Merge pull request #2055 from yahonda/slow_indexes
Add /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ hint to address slow SCHEMA queries
2 parents 015ee43 + 953d13d commit e064530

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
@@ -34,7 +34,7 @@ def describe(name)
3434
table_owner, table_name = default_owner, real_name
3535
end
3636
sql = <<~SQL.squish
37-
SELECT owner, table_name, 'TABLE' name_type
37+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ owner, table_name, 'TABLE' name_type
3838
FROM all_tables
3939
WHERE owner = '#{table_owner}'
4040
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
@@ -181,7 +181,7 @@ def default_primary_key?(column)
181181
def extract_expression_for_virtual_column(column)
182182
column_name = column.name
183183
@connection.select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name.upcase), bind_string("column_name", column_name.upcase)]).inspect
184-
select data_default from all_tab_columns
184+
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ data_default from all_tab_columns
185185
where owner = SYS_CONTEXT('userenv', 'current_schema')
186186
and table_name = :table_name
187187
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, "SCHEMA")
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, "SCHEMA", [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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA", [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, "SCHEMA", [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
@@ -365,7 +368,7 @@ def index_name(table_name, options) #:nodoc:
365368
def index_name_exists?(table_name, index_name)
366369
(_owner, table_name) = @connection.describe(table_name)
367370
result = select_value(<<~SQL.squish, "SCHEMA")
368-
SELECT 1 FROM all_indexes i
371+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ 1 FROM all_indexes i
369372
WHERE i.owner = SYS_CONTEXT('userenv', 'current_schema')
370373
AND i.table_owner = SYS_CONTEXT('userenv', 'current_schema')
371374
AND i.table_name = '#{table_name}'
@@ -500,7 +503,7 @@ def table_comment(table_name) #:nodoc:
500503
# TODO
501504
(_owner, table_name) = @connection.describe(table_name)
502505
select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name)])
503-
SELECT comments FROM all_tab_comments
506+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_tab_comments
504507
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
505508
AND table_name = :table_name
506509
SQL
@@ -516,7 +519,7 @@ def column_comment(table_name, column_name) #:nodoc:
516519
# TODO: it does not exist in Abstract adapter
517520
(_owner, table_name) = @connection.describe(table_name)
518521
select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name), bind_string("column_name", column_name.upcase)])
519-
SELECT comments FROM all_col_comments
522+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ comments FROM all_col_comments
520523
WHERE owner = SYS_CONTEXT('userenv', 'current_schema')
521524
AND table_name = :table_name
522525
AND column_name = :column_name
@@ -533,7 +536,7 @@ def type_to_sql(type, limit: nil, precision: nil, scale: nil, **) #:nodoc:
533536

534537
def tablespace(table_name)
535538
select_value(<<~SQL.squish, "SCHEMA")
536-
SELECT tablespace_name
539+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ tablespace_name
537540
FROM all_tables
538541
WHERE table_name='#{table_name.to_s.upcase}'
539542
AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -545,7 +548,7 @@ def foreign_keys(table_name) #:nodoc:
545548
(_owner, desc_table_name) = @connection.describe(table_name)
546549

547550
fk_info = select_all(<<~SQL.squish, "SCHEMA", [bind_string("desc_table_name", desc_table_name)])
548-
SELECT r.table_name to_table
551+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ r.table_name to_table
549552
,rc.column_name references_column
550553
,cc.column_name
551554
,c.constraint_name name
@@ -587,7 +590,7 @@ def extract_foreign_key_action(specifier) # :nodoc:
587590

588591
def disable_referential_integrity(&block) #:nodoc:
589592
old_constraints = select_all(<<~SQL.squish, "SCHEMA")
590-
SELECT constraint_name, owner, table_name
593+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ constraint_name, owner, table_name
591594
FROM all_constraints
592595
WHERE constraint_type = 'R'
593596
AND status = 'ENABLED'
@@ -702,7 +705,7 @@ def rebuild_primary_key_index_to_default_tablespace(table_name, options)
702705
return unless tablespace
703706

704707
index_name = select_value(<<~SQL.squish, "Index name for primary key", [bind_string("table_name", table_name.upcase)])
705-
SELECT index_name FROM all_constraints
708+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ index_name FROM all_constraints
706709
WHERE table_name = :table_name
707710
AND constraint_type = 'P'
708711
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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, "SCHEMA")
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
@@ -320,7 +322,7 @@ def execute_structure_dump(string)
320322
# return [{'column_name' => 'FOOS', 'data_default' => '...'}, ...]
321323
def virtual_columns_for(table)
322324
select_all(<<~SQL.squish, "SCHEMA")
323-
SELECT column_name, data_default
325+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ column_name, data_default
324326
FROM all_tab_cols
325327
WHERE virtual_column = 'YES'
326328
AND owner = SYS_CONTEXT('userenv', 'current_schema')
@@ -331,7 +333,7 @@ def virtual_columns_for(table)
331333
def drop_sql_for_feature(type)
332334
short_type = type == "materialized view" ? "mview" : type
333335
features = select_values(<<~SQL.squish, "SCHEMA")
334-
SELECT #{short_type}_name FROM all_#{short_type.tableize}
336+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ #{short_type}_name FROM all_#{short_type.tableize}
335337
where owner = SYS_CONTEXT('userenv', 'current_schema')
336338
SQL
337339
statements = features.map do |name|
@@ -342,7 +344,7 @@ def drop_sql_for_feature(type)
342344

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

lib/active_record/connection_adapters/oracle_enhanced_adapter.rb

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -553,7 +553,7 @@ def current_schema
553553
# Default tablespace name of current user
554554
def default_tablespace
555555
select_value(<<~SQL.squish, "SCHEMA")
556-
SELECT LOWER(default_tablespace) FROM user_users
556+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ LOWER(default_tablespace) FROM user_users
557557
WHERE username = SYS_CONTEXT('userenv', 'current_schema')
558558
SQL
559559
end
@@ -562,7 +562,7 @@ def column_definitions(table_name)
562562
(owner, desc_table_name) = @connection.describe(table_name)
563563

564564
select_all(<<~SQL.squish, "SCHEMA")
565-
SELECT cols.column_name AS name, cols.data_type AS sql_type,
565+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cols.column_name AS name, cols.data_type AS sql_type,
566566
cols.data_default, cols.nullable, cols.virtual_column, cols.hidden_column,
567567
cols.data_type_owner AS sql_type_owner,
568568
DECODE(cols.data_type, 'NUMBER', data_precision,
@@ -594,15 +594,15 @@ def pk_and_sequence_for(table_name, owner = nil, desc_table_name = nil) #:nodoc:
594594
(owner, desc_table_name) = @connection.describe(table_name)
595595

596596
seqs = select_values(<<~SQL.squish, "SCHEMA")
597-
select us.sequence_name
597+
select /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ us.sequence_name
598598
from all_sequences us
599599
where us.sequence_owner = '#{owner}'
600600
and us.sequence_name = upper(#{quote(default_sequence_name(desc_table_name))})
601601
SQL
602602

603603
# changed back from user_constraints to all_constraints for consistency
604604
pks = select_values(<<~SQL.squish, "SCHEMA")
605-
SELECT cc.column_name
605+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
606606
FROM all_constraints c, all_cons_columns cc
607607
WHERE c.owner = '#{owner}'
608608
AND c.table_name = #{quote(desc_table_name)}
@@ -636,7 +636,7 @@ def primary_keys(table_name) # :nodoc:
636636
(_owner, desc_table_name) = @connection.describe(table_name)
637637

638638
pks = select_values(<<~SQL.squish, "SCHEMA", [bind_string("table_name", desc_table_name)])
639-
SELECT cc.column_name
639+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */ cc.column_name
640640
FROM all_constraints c, all_cons_columns cc
641641
WHERE c.owner = SYS_CONTEXT('userenv', 'current_schema')
642642
AND c.table_name = :table_name
@@ -666,7 +666,8 @@ def columns_for_distinct(columns, orders) #:nodoc:
666666

667667
def temporary_table?(table_name) #:nodoc:
668668
select_value(<<~SQL.squish, "SCHEMA", [bind_string("table_name", table_name.upcase)]) == "Y"
669-
SELECT temporary FROM all_tables WHERE table_name = :table_name and owner = SYS_CONTEXT('userenv', 'current_schema')
669+
SELECT /*+ OPTIMIZER_FEATURES_ENABLE('11.2.0.2') */
670+
temporary FROM all_tables WHERE table_name = :table_name and owner = SYS_CONTEXT('userenv', 'current_schema')
670671
SQL
671672
end
672673

0 commit comments

Comments
 (0)