Все технические форумы на одном сайте Удобный поиск информации с популярных форумов в одном месте
Вопрос: Использование USING

Есть в SQL такая замечательная конструкция как
SQL
1
2
3
SELECT title, body
FROM today_news
INNER JOIN news USING(news_id)
Однако, не совсем понятно, как ее использовать в случае с несколькими таблицами, когда JOIN-нить надо не к "основной" таблице. Например,
SQL
1
2
3
4
SELECT *
FROM today_news t0
INNER JOIN news t1 USING(news_id)
LEFT JOIN rating t2 ON t1.rating = t2.rating
Просветите?
Ответ: Бросьте каку.

Это один из вариантов так называемого NATURAL JOIN синтаксиса, введенного в стандарт SQL по совершенно непонятным причинам. У этого способа соединения очень мало плюсов, зато просто дохренища минусов.

Более того, согласно документации, MySQL сначала преобразует данные конструкции в ОБЫЧНЫЙ JOIN ... ON... синтаксис, а только после этого начинает процессинг стейтмента. То есть он еще и медленнее работает засчет дополнительного преобразования.
Вопрос: Could not get central inventory using NGOUI

Коллеги, добрый день, подскажите, можно ли считать это ошибкой или не стоит обращать внимания?
[15.11.2016 17:13:04] Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil
[15.11.2016 17:13:04] OUI-67077:


[15.11.2016 17:13:04] PREREQ session
[15.11.2016 17:13:04] OPatch invoked as follows: 'prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc /u/app/oracle/product/12.1.0/dbhome_1/oraInst.loc '
[15.11.2016 17:13:04] Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil
[15.11.2016 17:13:04] OUI-67077:
Oracle Home : /u/app/oracle/product/12.1.0/dbhome_1
Central Inventory : /u/app/oraInventory
from : /u/app/oracle/product/12.1.0/dbhome_1/oraInst.loc
OPatch version : 12.1.0.1.10
OUI version : 12.1.0.2.0
OUI location : /u/app/oracle/product/12.1.0/dbhome_1/oui
Log file location : /u/app/oracle/product/12.1.0/dbhome_1/cfgtoollogs/opatch/opatch2016-11-15_17-13-04PM_1.log
[15.11.2016 17:13:04] Patch history file: /u/app/oracle/product/12.1.0/dbhome_1/cfgtoollogs/opatch/opatch_history.txt
[15.11.2016 17:13:05] Invoking prereq "checkconflictagainstohwithdetail"
[15.11.2016 17:13:05] Ignoring file "/home/oracle/patchs/psu/p21345478_121020_Linux-x86-64/24433133/24006101/README.html" in the patch directory.
[15.11.2016 17:13:05] Ignoring file "/home/oracle/patchs/psu/p21345478_121020_Linux-x86-64/24433133/24006101/README.txt" in the patch directory.
[15.11.2016 17:13:06] [OPSR-MEMORY-1] : after installInventory.getAllCompsVect() call : 33 (MB)
[15.11.2016 17:13:06] [OPSR-MEMORY-2] : before loading cooked one off : 41 (MB)
[15.11.2016 17:13:06] [OPSR-MEMORY-3] : after loading rawOneOffList and before loading minipatch list in cooked one off : 17 (MB)
[15.11.2016 17:13:06] [OPSR-MEMORY-4] : after filling cookedOneOffs and when inventory is loaded.. : 17 (MB)
[15.11.2016 17:13:06] checkConflictAgainstOHWithDetail start -> Tue Nov 15 17:13:06 MSK 2016
[15.11.2016 17:13:06] Tue Nov 15 17:13:06 MSK 2016
[15.11.2016 17:13:06] Adapter can go list: 21948354 22291127 23054246 24006101
[15.11.2016 17:13:06] Adapter not need list:
[15.11.2016 17:13:06] Adapter auto-rollback list: 20267166 18851894 18797519
[15.11.2016 17:13:06] checkConflictAgainstOHWithDetail end -> Tue Nov 15 17:13:06 MSK 2016
[15.11.2016 17:13:06] Prereq "checkConflictAgainstOHWithDetail" passed.
[15.11.2016 17:13:06] Finishing PrereqSession at Tue Nov 15 17:13:06 MSK 2016
Ответ: Отвечаю сам.
На сайте сопровождения есть нота.
В ней написано это внутренний баг. Можно игнорировать.

Opatch generates messages: "Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil" in logfile. (Doc ID 2083483.1)

In this Document
Symptoms
Cause
Solution
References
APPLIES TO:
Oracle Database - Enterprise Edition - Version 11.2.0.3 to 12.1.0.2 [Release 11.2 to 12.1]
Information in this document applies to any platform.
SYMPTOMS
Opatch prereq check and opatch lsinventory is generating unexpected line of output in the log file as "Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil"

This message is seen when used 11.2.0.3.12 and 12.1.0.1.9 utility

CASE 1- opatch prereq CheckConflictAgainstOHWithDetail -ph ./

OPatch invoked as follows: 'prereq CheckConflictAgainstOHWithDetail -ph ./ -invPtrLoc /h01/app/oracle/db/11.2.0.4_02/oraInst.loc '

[Nov 17, 2015 3:25:44 PM] Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil

[Nov 17, 2015 3:25:44 PM] OUI-67077:

Oracle Home : /h01/app/oracle/db/11.2.0.4_02

Central Inventory : /c01/app/oraInventory

from : /h01/app/oracle/db/11.2.0.4_02/oraInst.loc

OPatch version : 11.2.0.3.12

OUI version : 11.2.0.4.0

CASE 2 - opatch lsinventory

OPatch invoked as follows: 'lsinventory -invPtrLoc /u01/app/oracle/product/11.2.0.3/dbhome_1/oraInst.loc '

[Nov 11, 2015 2:15:10 PM] Could not get central inventory using NGOUI; oracle.sysman.nextgen.utils.NextGenInventoryUtil

[Nov 17, 2015 3:25:44 PM] OUI-67077:

Oracle Home : /h01/app/oracle/db/11.2.0.4_02

Central Inventory : /c01/app/oraInventory

from : /h01/app/oracle/db/11.2.0.4_02/oraInst.loc

OPatch version : 11.2.0.3.12

OUI version : 11.2.0.4.0

CAUSE
This error is due to an internal bug .
SOLUTION

There is no functional issue with this message. Hence this error can be safely ignored.
Вопрос: Объясните разницу между USING CURRENT LOGFILE и DISCONNECT FROM SESSION

Объясните, пожалуйста, на пальцах, для особо "одарённых", в чём разница между:

1. alter database recover managed standby database disconnect from session;


2. alter database recover managed standby database using current logfile disconnect;


3. alter database recover managed standby database cancel;
Ответ:
Объясните разницу между USING CURRENT LOGFILE и DISCONNECT FROM SESSION
Примерно как между "теплым" и "мягким"
Вопрос: Connection to Oracle using SSL authentication

Приветствую!

Нужна помочь в настройке коннекта с использованием сертификатов

SERVER
Oracle Database 12c Enterprise Edition Release 12.1.0.1.0 - 64bit Production
PL/SQL Release 12.1.0.1.0 - Production
"CORE 12.1.0.1.0 Production"
TNS for 64-bit Windows: Version 12.1.0.1.0 - Production
NLSRTL Version 12.1.0.1.0 - Production


CLIENT
SQL*Plus: Release 11.2.0.1.0 Production on Mon Jan 25 13:07:11 2016


SERVER
  • Создал wallet
  • Создал trusted certificate (использовал openssl 0.9.8)
  • Сделал Certificate request и подписал его trusted certificate
  • Загрузил оба сертификата в серверный wallet
  • Настроил listener, сконфигурил tnsnames.ora, sqlnet.ora как описано в

  • настроил wallet на auto login
  • Рестартовал listener

    CLIENT
  • Создал wallet
  • Сделал Certificate request и подписал его trusted certificate
  • Загрузил оба сертификата в клинтский wallet
  • Сконфигурил tnsnames.ora, sqlnet.ora как описано в

  • настроил wallet на auto login

    Когда пытаюсь залогиниться
    автор
    SQL> conn /@local_pdb_ssl
    ERROR:
    ORA-01017: invalid username/password; logon denied


    В трейсе сервера
    автор
    ...
    2016-01-25 12:43:44.973051 : nau_scn:server handshake succeeded
    ...
    2016-01-25 12:43:44.978310 : nszgclient:NT adapter cannot do role and privilege checking
    2016-01-25 12:43:44.978329 : nszgclient:returning no username
    2016-01-25 12:43:44.978348 : nszgclient:username: EMAIL=Client@luxoft.com,CN=ORACLE_CONTEXT,OU=R&C,O=Luxoft,L=Kiev,ST=Kiev,C=UA
    ...
    2016-01-25 12:43:44.978597 : ntzcontrol:The Final Negotiated SSL Cipher Suite is: SSL_RSA_WITH_3DES_EDE_CBC_SHA
    ...
    2016-01-25 12:43:44.978718 : ntzcontrol:Command = 1127
    2016-01-25 12:43:44.978735 : ntzcontrol:SSL connection version: 768
    ...
    2016-01-25 12:43:44.978889 : nazsgpnm:protocol authentication is to be used
    ...



    + Server - sqlnet.ora

    SQLNET.AUTHENTICATION_SERVICES= (TCPS, BEQ)

    SSL_VERSION = 3.0

    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

    SSL_CLIENT_AUTHENTICATION = TRUE

    WALLET_LOCATION =
    (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY = c:\app\VSamchynskyi\product\12.1.0\dbhome_1\owm\vsamchynskyi)
    )
    )

    SQLNET_ALLOWED_LOGON_VERSIONS= (10, 9, 8, 7)

    SSL_CIPHER_SUITES= (SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    ADR_BASE = C:\app\VSamchynskyi\product\12.1.0\dbhome_1\log

    TRACE_LEVEL_SERVER = SUPPORT
    TRACE_TIMESTAMP_SERVER = ON
    TRACE_FILE_SERVER = SERVER

    + Server - listener.ora

    SID_LIST_LISTENER =
    (SID_LIST =
    (SID_DESC =
    (SID_NAME = CLRExtProc)
    (ORACLE_HOME = C:\app\VSamchynskyi\product\12.1.0\dbhome_1)
    (PROGRAM = extproc)
    (ENVS = "EXTPROC_DLLS=ONLY:C:\app\VSamchynskyi\product\12.1.0\dbhome_1\bin\oraclr12.dll")
    )
    )

    SSL_CLIENT_AUTHENTICATION = FALSE

    WALLET_LOCATION =
    (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY = c:\app\VSamchynskyi\product\12.1.0\dbhome_1\owm\vsamchynskyi)
    )
    )

    LISTENER =
    (DESCRIPTION_LIST =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = IPC)(KEY = EXTPROC1521))
    )
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
    )
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    )
    )

    ADR_BASE_LISTENER = C:\app\VSamchynskyi\product\12.1.0\dbhome_1\log

    TRACE_LEVEL_LISTENER = USER

    + Server - tnsnames.ora

    LOCAL_ssl =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )

    LOCAL_PDB_ssl =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = pdborcl)
    )
    )

    + Client - sqlnet.ora

    SQLNET.AUTHENTICATION_SERVICES= (TCPS, BEQ)

    SSL_VERSION = 3.0

    NAMES.DIRECTORY_PATH= (TNSNAMES, EZCONNECT)

    SSL_CLIENT_AUTHENTICATION = TRUE

    WALLET_LOCATION =
    (SOURCE =
    (METHOD = FILE)
    (METHOD_DATA =
    (DIRECTORY = C:\app\VSamchynskyi\product\11.2.0\client_1\BIN\owm\wallets\vsamchynskyi)
    )
    )

    SSL_CIPHER_SUITES= (SSL_RSA_WITH_3DES_EDE_CBC_SHA)

    ADR_BASE = C:\app\VSamchynskyi\product\11.2.0\client_1\log

    TRACE_LEVEL_CLIENT = SUPPORT
    TRACE_UNIQUE_CLIENT = on
    TRACE_DIRECTORY_CLIENT = C:\app\VSamchynskyi\product\11.2.0\client_1\log\oradiag_vsamchynskyi\diag\clients\user_vsamchynskyi\host_4104255576_76\trace
    TRACE_FILE_CLIENT = client
    DIAG_ADR_ENABLED = OFF
    TRACE_TIMESTAMP_CLIENT = ON

    TRACE_LEVEL_SERVER = SUPPORT
    TRACE_TIMESTAMP_SERVER = ON
    TRACE_FILE_SERVER = SERVER

    + Client - tnsnames.ora


    LOCAL_ssl =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = orcl)
    )
    )

    LOCAL_PDB_ssl =
    (DESCRIPTION =
    (ADDRESS = (PROTOCOL = TCPS)(HOST = localhost)(PORT = 2484))
    (CONNECT_DATA =
    (SERVER = DEDICATED)
    (SERVICE_NAME = pdborcl)
    )
    )


    Собственно вопросы:
  • Если мы коннектимся как "conn /@local_pdb_ssl", то как база в итоге понимается под каким пользователем?
  • Если эта инфа должна быть в сертификате, то как ее задать? Или нужно создавать пользователя с externaly authentication?
  • Я все далал с использованием "wallet manager". Если я его закрою, то закроется wallet. Как сделать так, чтобы он был все время открытым?
  • Ответ: iehf,

    Ок, спасибо.
    Вопрос: Тяжелый запрос с Using temporary, Using filesort из-за ORDER

    Прошу помочь ускорить запрос или подсказать как правильно его переделать(или переделать структуру).

    Имеется вот такой запрос:
    SELECT
    SQL_NO_CACHE
    `content`.`pagetitle`,`content`.`id`,

    `a16`.`value` AS `a16`,
    `a60`.`value` AS `a60`,
    `a87`.`value` AS `a87`,
    `a89`.`value` AS `a89`,
    `a59`.`value` AS `a59`,
    `a94`.`value` AS `a94`,
    `a15`.`value` AS `a15`,
    `a6`.`value` AS `a6`,
    `a86`.`value` AS `a86`,
    `a19`.`value` AS `a19`
    FROM
    `modx_site_content` AS `content`
    LEFT JOIN `product_tmplvar_contentvalues` AS `a16` ON `a16`.`contentid` = `content`.`id` AND `a16`.`tmplvarid` = 16
    LEFT JOIN `product_tmplvar_contentvalues` AS `a60` ON `a60`.`contentid` = `content`.`id` AND `a60`.`tmplvarid` = 60
    LEFT JOIN `product_tmplvar_contentvalues` AS `a87` ON `a87`.`contentid` = `content`.`id` AND `a87`.`tmplvarid` = 87
    <...>
    LEFT JOIN `product_tmplvar_contentvalues` AS `a19` ON `a19`.`contentid` = `content`.`id` AND `a19`.`tmplvarid` = 19
    WHERE
    1 = 1
    AND `content`.`parent` = 66860
    AND `a83`.`value` = "42160"

    ORDER BY menuindex
    LIMIT 100

    Если в выборку попадает более 200к позиций(учитывая условия where), запрос выполняется от 5 до 60 секунд. Желательно не более 2-3 секунд.

    Если указать индекс:
    `modx_site_content` AS `content`
    USE INDEX (`parent-menuindex`)
    LEFT JOIN `product_tmplvar_contentvalues` AS `a16` ON `a16`.`contentid` = `content`.`id` AND `a16`.`tmplvarid` = 16
    - конкретно в этом запросе проблема решается: Using temporary, Using filesort пропадают и вместо 7 сек этот запрос выполнится за 0.01с. Но это помогает только в ~50% случаев, в остальные 50% случаев этот индекс наоборот тормозит, либо никак не влияет. Взаимосвязь найти не смог. Если убрать сортировку, также пропадает using filesort, using temporary и запрос выполняется 0.01с.

    ORDER заставляет БД лопатить все записи. Если добавить еще условий, напр. `a16`.`value` = "21334" и в результате это ограничит количество позиций до каких-нибудь 10к - запрос выполнится быстро. В самой таблице может быть несколько миллионов записей, на скорость влияет именно количество, попадающее в выборку(есть исключения, но общая картина такова). Если в выборку попадает несколько десятков тысяч записей(много) - часто помогает USE INDEX - но не всегда.

    Пробовал выделять оперативку для временных таблиц, key_buffer_size и прочие параметры - практически не влияет на производительность. Обновление с MySQL 5.1 до 5.6 ускорило запрос, но ненамного. Вернулся на 5.1.
    Пытался решить эту проблему уже несколько раз, многое перепробовал и честно говоря уже запутался, не хватает опыта и свежего взгляда.

    Что делает запрос:
    Здесь есть 2 таблицы: "предметы" и "характеристики" к ним. Соответственно идет выборка предметов по условиям характеристик.
    Может быть я неправильно организовал структуру хранения данных?

    Буду рад любым соображениям.

    EXPLAIN без USE INDEX
    +

    id select_type table type possible_keys key key_len ref rows Extra
    ------ ----------- ------- ------ --------------------------------------------- ------------------- ------- ------------------------------ ------ ----------------------------------------------
    1 SIMPLE a83 ref contentid-tmplvarid,tmplvarid,value-tmplvarid value-tmplvarid 12 const,const 22337 Using where; Using temporary; Using filesort
    1 SIMPLE content eq_ref PRIMARY,parent-menuindex PRIMARY 4 fluid-line.a83.contentid 1 Using where
    1 SIMPLE a81 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a88 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a92 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a93 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a65 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a95 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a86 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a19 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a16 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a60 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a87 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a89 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a59 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a94 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a15 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a6 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1


    EXPLAIN без USE INDEX, но без ORDER
    +

    id select_type table type possible_keys key key_len ref rows Extra
    ------ ----------- ------- ------ --------------------------------------------- ------------------- ------- ------------------------------ ------ -------------
    1 SIMPLE a83 ref contentid-tmplvarid,tmplvarid,value-tmplvarid value-tmplvarid 12 const,const 22337 Using where
    1 SIMPLE content eq_ref PRIMARY,parent-menuindex PRIMARY 4 fluid-line.a83.contentid 1 Using where
    1 SIMPLE a81 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a88 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a92 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a93 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a65 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a95 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a86 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a19 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a16 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a60 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a87 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a89 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a59 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a94 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a15 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a6 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1


    EXPLAIN с USE INDEX
    +
        id  select_type  table    type    possible_keys                                  key                  key_len  ref                               rows  Extra        
    ------ ----------- ------- ------ --------------------------------------------- ------------------- ------- ------------------------------ ------ -------------
    1 SIMPLE content ref parent-menuindex parent-menuindex 4 const 224253 Using where
    1 SIMPLE a83 ref contentid-tmplvarid,tmplvarid,value-tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using where
    1 SIMPLE a81 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a88 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a92 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a93 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1 Using index
    1 SIMPLE a65 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a95 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1 Using index
    1 SIMPLE a86 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a19 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a16 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a60 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a87 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a89 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a59 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.content.id,const 1
    1 SIMPLE a94 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a15 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1
    1 SIMPLE a6 ref contentid-tmplvarid,tmplvarid contentid-tmplvarid 8 fluid-line.a83.contentid,const 1


    ТАБЛИЦЫ
    +
    CREATE TABLE `modx_site_content` (
    `id` int(10) NOT NULL auto_increment,
    `pagetitle` varchar(255) collate utf8_unicode_ci NOT NULL default '',
    `parent` int(10) NOT NULL default '0',
    `isfolder` int(1) NOT NULL default '0',
    `menuindex` int(10) NOT NULL default '0',
    PRIMARY KEY (`id`),
    KEY `aliasidx` (`alias`),
    KEY `typeidx` (`type`),
    KEY `pub_date` (`pub_date`),
    KEY `unpub_date` (`unpub_date`),
    KEY `isfolder` (`isfolder`),
    KEY `parent-menuindex` (`parent`,`menuindex`),
    KEY `pagetitle` (`pagetitle`(15))
    ) ENGINE=MyISAM AUTO_INCREMENT=6609027 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Contains the site document tree.'

    CREATE TABLE `product_tmplvar_contentvalues` (
    `id` int(11) NOT NULL auto_increment,
    `contentid` int(11) NOT NULL,
    `tmplvarid` int(11) NOT NULL,
    `value` int NOT NULL,
    PRIMARY KEY (`id`),
    KEY `contentid-tmplvarid` (`contentid`,`tmplvarid`),
    KEY `tmplvarid` (`tmplvarid`),
    KEY `value-tmplvarid` (`value`,`tmplvarid`)
    ) ENGINE=MyISAM AUTO_INCREMENT=54304242 DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci COMMENT='Здесь хранятся значения свойств товара: цвет, кол-во и т.п.'
    Ответ: Хотя, наверно проблема надуманная, т.к. большие задержки возникают если в выборку попадает много записей, т.е. в фильтре не указаны основные характеристики продукции, а указаны только второстепенные, напр. при подборе машины(допустим) не указан ни тип кузова, ни цвет, а только размер дисков и наличие дворника - в результате в выборку попадают почти все машины и здесь поиск подходящих по фильтру машин выполняется очень медленно. Видимо нужно обозначать основные характеристики продукции, которые будут обязательными для выбора в фильтре...
    Вопрос: LEFT JOIN и Using join buffer (Block Nested Loop)

    Доброго времени суток всем, хотелось бы попросить у сообщества помощи, т.к. не могу понять, это баг MySQL или я что-то делаю не так. Опишу проблему. Имеется таблица (table1), которая связывается с другой (table2) с помощью LEFT JOIN.
    Если используется в выборке один столбец из table2, то индекс успешно используется.
    SELECT
    	`table1`.`id`,
    	`table2`.`value`
    FROM 
    	`table1`
    LEFT JOIN `table2` ON `table2`.`table1_id` = `table1`.`id`
    WHERE 
    	`table1`.`level` = 'test'
    

    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable1ALLNULLNULLNULLNULL49200Using where
    1SIMPLEtable2refPRIMARYPRIMARY4test1.table1.id1NULL


    Если используются два столбца из table1, то в EXPLAIN'е красуется загадочная надпись Using join buffer (Block Nested Loop), индекс не используется и запрос выполняется нереально долго.
    SELECT 
    	`table1`.`id`,
    	`table2`.`value`, 
    	`table2`.`count`
    FROM 
    	`table1`
    LEFT JOIN `table2` ON `table2`.`table1_id` = `table1`.`id`
    WHERE 
    	`table1`.`level` = 'test'
    

    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable1ALLNULLNULLNULLNULL49200Using where
    1SIMPLEtable2ALLPRIMARYNULLNULLNULL1Using where; Using join buffer (Block Nested Loop)


    Пока в качестве решения данной проблемы решил добавить второй аналогичный LEFT JOIN.
    SELECT 
    	`table1`.`id`,
    	`table2`.`value`, 
    	`table3`.`count`
    FROM 
    	`table1`
    LEFT JOIN `table2` ON `table2`.`table1_id` = `table1`.`id`
    LEFT JOIN `table3` ON `table3`.`table1_id` = `table1`.`id`
    WHERE 
    	`table1`.`level` = 'test'
    

    И теперь все работает замечательно, индексы используются.
    idselect_typetabletypepossible_keyskeykey_lenrefrowsExtra
    1SIMPLEtable1ALLNULLNULLNULLNULL49200Using where
    1SIMPLEtable2refPRIMARYPRIMARY4test1.table1.id1NULL
    1SIMPLEtable3refPRIMARYPRIMARY4test1.table1.id1NULL


    Теперь назревает вопрос, это норма или баг?
    Ответ:
    javajdbc
    "глюков" = "нестабильности пограничного состояния"...

    Вот нехрен было делать - почти два часа пробовал воспроизвести такое пограничное состояние на приведённом примере. Как и следовало ожидать - с нулевым результатом.
    Вопрос: merge; "update set ... where [condition]" vs "using (select * from t where [condition])"

    день добрый.

    есть два merge - "медленный" и "быстрый". в "медленном" набор обновляемых строк фильтруется через when matched then update set ... where ..., в "быстром" условие переносится на уровень фильтра таблицы-источника, поэтому hash join проходит быстрее.

    + script
    cl scr 
    --------------------------------------------------------------------------------
    set time off timi off echo on
    
    drop table t_src purge;
    drop table t_dst purge;
    
    create table t_src (id, value) as 
        select 
            rownum, 
            rownum 
        from dual
        connect by rownum <= 1e6;
        
    create table t_dst (id, value) as 
        select 
            id, 
            case when id < 1e6 then value end
        from t_src;
    
    exec dbms_stats.gather_table_stats(user, 't_src');
    exec dbms_stats.gather_table_stats(user, 't_dst');
        
    select * from t_dst where id = 1e6;
    --------------------------------------------------------------------------------    
    set autotrace on explain timi on
    
    merge into t_dst d 
        using t_src s on (s.id = d.id)
        when matched then update set d.value = s.value 
            where d.value is null;
    
    set autotrace off timi off
    
    select * from t_dst where id = 1e6;
    
    rollback;
    --------------------------------------------------------------------------------
    set autotrace on explain timi on
        
    merge into (select * from t_dst where value is null) d 
        using t_src s on (s.id = d.id) 
        when matched then update set d.value = s.value 
            where d.value is null;
        
    set autotrace off timi off
    
    select * from t_dst where id = 1e6;
    
    rollback;
    --------------------------------------------------------------------------------
    set time on timi on echo off 
    

    + spool
    SQL> drop table t_src purge;
    
    Table dropped.
    
    SQL> drop table t_dst purge;
    
    Table dropped.
    
    SQL>
    SQL> create table t_src (id, value) as
      2      select
      3          rownum,
      4          rownum
      5      from dual
      6      connect by rownum <= 1e6;
    
    Table created.
    
    SQL>
    SQL> create table t_dst (id, value) as
      2      select
      3          id,
      4          case when id < 1e6 then value end
      5      from t_src;
    
    Table created.
    
    SQL>
    SQL> exec dbms_stats.gather_table_stats(user, 't_src');
    
    PL/SQL procedure successfully completed.
    
    SQL> exec dbms_stats.gather_table_stats(user, 't_dst');
    
    PL/SQL procedure successfully completed.
    
    SQL>
    SQL> select * from t_dst where id = 1e6;
    
            ID      VALUE
    ---------- ----------
       1000000
    
    1 row selected.
    
    SQL> --------------------------------------------------------------------------------
    SQL> set autotrace on explain timi on
    SQL>
    SQL> merge into t_dst d
      2      using t_src s on (s.id = d.id)
      3      when matched then update set d.value = s.value
      4          where d.value is null;
    
    1 row merged.
    
    Elapsed: 00:00:04.33
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 3500657092
    
    --------------------------------------------------------------------------------------
    | Id  | Operation            | Name  | Rows  | Bytes |TempSpc| Cost (%CPU)| Time     |
    --------------------------------------------------------------------------------------
    |   0 | MERGE STATEMENT      |       |  1000K|    34M|       |  1912   (2)| 00:00:35 |
    |   1 |  MERGE               | T_DST |       |       |       |            |          |
    |   2 |   VIEW               |       |       |       |       |            |          |
    |*  3 |    HASH JOIN         |       |  1000K|    19M|    21M|  1912   (2)| 00:00:35 |
    |   4 |     TABLE ACCESS FULL| T_SRC |  1000K|  9765K|       |   244   (4)| 00:00:05 |
    |   5 |     TABLE ACCESS FULL| T_DST |  1000K|  9765K|       |   244   (4)| 00:00:05 |
    --------------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       3 - access("S"."ID"="D"."ID")
    
    SQL>
    SQL> set autotrace off timi off
    SQL>
    SQL> select * from t_dst where id = 1e6;
    
            ID      VALUE
    ---------- ----------
       1000000    1000000
    
    1 row selected.
    
    SQL>
    SQL> rollback;
    
    Rollback complete.
    
    SQL> --------------------------------------------------------------------------------
    SQL> set autotrace on explain timi on
    SQL>
    SQL> merge into (select * from t_dst where value is null) d
      2      using t_src s on (s.id = d.id)
      3      when matched then update set d.value = s.value
      4          where d.value is null;
    
    1 row merged.
    
    Elapsed: 00:00:00.93
    
    Execution Plan
    ----------------------------------------------------------
    Plan hash value: 290390879
    
    ------------------------------------------------------------------------------
    | Id  | Operation            | Name  | Rows  | Bytes | Cost (%CPU)| Time     |
    ------------------------------------------------------------------------------
    |   0 | MERGE STATEMENT      |       |     1 |    36 |   493   (5)| 00:00:09 |
    |   1 |  MERGE               | T_DST |       |       |            |          |
    |   2 |   VIEW               |       |       |       |            |          |
    |*  3 |    HASH JOIN         |       |     1 |    20 |   493   (5)| 00:00:09 |
    |*  4 |     TABLE ACCESS FULL| T_DST |     1 |    10 |   244   (4)| 00:00:05 |
    |   5 |     TABLE ACCESS FULL| T_SRC |  1000K|  9765K|   244   (4)| 00:00:05 |
    ------------------------------------------------------------------------------
    
    Predicate Information (identified by operation id):
    ---------------------------------------------------
    
       3 - access("S"."ID"="T_DST"."ID")
       4 - filter("VALUE" IS NULL)
    
    SQL>
    SQL> set autotrace off timi off
    SQL>
    SQL> select * from t_dst where id = 1e6;
    
            ID      VALUE
    ---------- ----------
       1000000    1000000
    
    1 row selected.
    
    SQL>
    SQL> rollback;
    
    Rollback complete.
    
    SQL> --------------------------------------------------------------------------------
    SQL> set time on timi on echo off
    


    я полагал, что данные merge эквивалентны, но меня смутило, что в первом merge оракл сам не протолкнул предикат из update where глубже, в фильтр таблицы.

    если команды эквивалентны - по какой причине оракл сам не догадался из первого merge сделать второй?
    если нет - при каком сценарии я увижу расхождение?

    спасибо.
    Ответ:
    кит северных морей
    merge into t_dst d 
        using t_src s on (s.id = d.id)
        when matched then update set d.value = s.value 
            where {1};
    
    этот вариант функционально ближе к такому:
    merge into t_dst d 
        using t_src s on (s.id = d.id and {1})
        when matched then update set d.value = s.value 
    
    но без ограничения на изменяемые колонки и условия проверяются только на самом этапе merge в плане. В этой части можно указывать предикаты не только по d, но и по s.

    кит северных морей
    смутило, что в первом merge оракл сам не протолкнул предикат из update where глубже, в фильтр таблицы
    CBO это не умеет, но умеет брать из ON (...)
    Вопрос: Хочу избавиться от USING temporary

    Добрый день, столкнулся с необходимостью оптимизировать ряд запросов и постоянно натыкаюсь на USING temprory, собственно сам запрос
    EXPLAIN SELECT SQL_NO_CACHE B.ID
    FROM b_iblock B
    INNER JOIN b_iblock_element BE ON BE.IBLOCK_ID = B.ID
    ORDER BY BE.SORT ASC , BE.ID DESC
    LIMIT 200
    
    А вот что получаю в результате
    id 	select_type 	table 	type 	possible_keys 	key 	key_len 	ref 	rows 	Extra
    1 SIMPLE B index PRIMARY,LID_2 LID 2 NULL 7 Using index; Using temporary; Using filesort
    1 SIMPLE BE ref ix_iblock_element_1,ix_iblock_element_4,ix_iblock_... ix_iblock_element_4 4 test4.B.ID 5131 NULL
    И не пойму почему он делает сортировку таблицы B(!), при этом создавая временную таблицу, в то время как указана сортировка таблицы BE по существующему индексу


    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `b_iblock`
    --
    
    CREATE TABLE IF NOT EXISTS `b_iblock` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `TIMESTAMP_X` timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
      `IBLOCK_TYPE_ID` varchar(50) NOT NULL,
      `LID` char(2) NOT NULL,
      `CODE` varchar(50) DEFAULT NULL,
      `NAME` varchar(255) NOT NULL,
      `ACTIVE` char(1) NOT NULL DEFAULT 'Y',
      `SORT` int(11) NOT NULL DEFAULT '500',
      `LIST_PAGE_URL` varchar(255) DEFAULT NULL,
      `DETAIL_PAGE_URL` varchar(255) DEFAULT NULL,
      `SECTION_PAGE_URL` varchar(255) DEFAULT NULL,
      `CANONICAL_PAGE_URL` varchar(255) DEFAULT NULL,
      `PICTURE` int(18) DEFAULT NULL,
      `DESCRIPTION` text,
      `DESCRIPTION_TYPE` char(4) NOT NULL DEFAULT 'text',
      `RSS_TTL` int(11) NOT NULL DEFAULT '24',
      `RSS_ACTIVE` char(1) NOT NULL DEFAULT 'Y',
      `RSS_FILE_ACTIVE` char(1) NOT NULL DEFAULT 'N',
      `RSS_FILE_LIMIT` int(11) DEFAULT NULL,
      `RSS_FILE_DAYS` int(11) DEFAULT NULL,
      `RSS_YANDEX_ACTIVE` char(1) NOT NULL DEFAULT 'N',
      `XML_ID` varchar(255) DEFAULT NULL,
      `TMP_ID` varchar(40) DEFAULT NULL,
      `INDEX_ELEMENT` char(1) NOT NULL DEFAULT 'Y',
      `INDEX_SECTION` char(1) NOT NULL DEFAULT 'N',
      `WORKFLOW` char(1) NOT NULL DEFAULT 'Y',
      `BIZPROC` char(1) NOT NULL DEFAULT 'N',
      `SECTION_CHOOSER` char(1) DEFAULT NULL,
      `LIST_MODE` char(1) DEFAULT NULL,
      `RIGHTS_MODE` char(1) DEFAULT NULL,
      `SECTION_PROPERTY` char(1) DEFAULT NULL,
      `PROPERTY_INDEX` char(1) DEFAULT NULL,
      `VERSION` int(11) NOT NULL DEFAULT '1',
      `LAST_CONV_ELEMENT` int(11) NOT NULL DEFAULT '0',
      `SOCNET_GROUP_ID` int(18) DEFAULT NULL,
      `EDIT_FILE_BEFORE` varchar(255) DEFAULT NULL,
      `EDIT_FILE_AFTER` varchar(255) DEFAULT NULL,
      `SECTIONS_NAME` varchar(100) DEFAULT NULL,
      `SECTION_NAME` varchar(100) DEFAULT NULL,
      `ELEMENTS_NAME` varchar(100) DEFAULT NULL,
      `ELEMENT_NAME` varchar(100) DEFAULT NULL,
      PRIMARY KEY (`ID`),
      KEY `ix_iblock` (`IBLOCK_TYPE_ID`,`LID`,`ACTIVE`),
      KEY `LID` (`LID`),
      KEY `LID_2` (`ID`,`LID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=14 ;
    
    
    
    ALTER TABLE `b_iblock`
      ADD CONSTRAINT `b_iblock_ibfk_1` FOREIGN KEY (`LID`) REFERENCES `b_lang` (`LID`),
      ADD CONSTRAINT `b_iblock_ibfk_2` FOREIGN KEY (`LID`) REFERENCES `b_lang` (`LID`);
    -- --------------------------------------------------------
    
    --
    -- Структура таблицы `b_iblock_element`
    --
    
    CREATE TABLE IF NOT EXISTS `b_iblock_element` (
      `ID` int(11) NOT NULL AUTO_INCREMENT,
      `TIMESTAMP_X` datetime DEFAULT NULL,
      `MODIFIED_BY` int(18) DEFAULT NULL,
      `DATE_CREATE` datetime DEFAULT NULL,
      `CREATED_BY` int(18) DEFAULT NULL,
      `IBLOCK_ID` int(11) NOT NULL DEFAULT '0',
      `IBLOCK_SECTION_ID` int(11) DEFAULT NULL,
      `ACTIVE` char(1) NOT NULL DEFAULT 'Y',
      `ACTIVE_FROM` datetime DEFAULT NULL,
      `ACTIVE_TO` datetime DEFAULT NULL,
      `SORT` int(11) NOT NULL DEFAULT '500',
      `NAME` varchar(255) NOT NULL,
      `PREVIEW_PICTURE` int(18) DEFAULT NULL,
      `PREVIEW_TEXT` text,
      `PREVIEW_TEXT_TYPE` varchar(4) NOT NULL DEFAULT 'text',
      `DETAIL_PICTURE` int(18) DEFAULT NULL,
      `DETAIL_TEXT` longtext,
      `DETAIL_TEXT_TYPE` varchar(4) NOT NULL DEFAULT 'text',
      `SEARCHABLE_CONTENT` text,
      `WF_STATUS_ID` int(18) DEFAULT '1',
      `WF_PARENT_ELEMENT_ID` int(11) DEFAULT NULL,
      `WF_NEW` char(1) DEFAULT NULL,
      `WF_LOCKED_BY` int(18) DEFAULT NULL,
      `WF_DATE_LOCK` datetime DEFAULT NULL,
      `WF_COMMENTS` text,
      `IN_SECTIONS` char(1) NOT NULL DEFAULT 'N',
      `XML_ID` varchar(255) DEFAULT NULL,
      `CODE` varchar(255) DEFAULT NULL,
      `TAGS` varchar(255) DEFAULT NULL,
      `TMP_ID` varchar(40) DEFAULT NULL,
      `WF_LAST_HISTORY_ID` int(11) DEFAULT NULL,
      `SHOW_COUNTER` int(18) DEFAULT NULL,
      `SHOW_COUNTER_START` datetime DEFAULT NULL,
      PRIMARY KEY (`ID`),
      UNIQUE KEY `SORT_2` (`SORT`,`ID`),
      UNIQUE KEY `ID` (`ID`,`SORT`),
      UNIQUE KEY `IBLOCK_ID_2` (`ACTIVE_TO`,`ACTIVE_FROM`,`ACTIVE`,`WF_STATUS_ID`,`WF_PARENT_ELEMENT_ID`,`ID`,`SORT`),
      KEY `ix_iblock_element_1` (`IBLOCK_ID`,`IBLOCK_SECTION_ID`),
      KEY `ix_iblock_element_4` (`IBLOCK_ID`,`XML_ID`,`WF_PARENT_ELEMENT_ID`),
      KEY `ix_iblock_element_3` (`WF_PARENT_ELEMENT_ID`),
      KEY `ix_iblock_element_code` (`IBLOCK_ID`,`CODE`),
      KEY `NAME` (`NAME`),
      KEY `SORT` (`SORT`),
      KEY `ID_2` (`ID`,`IBLOCK_ID`)
    ) ENGINE=InnoDB  DEFAULT CHARSET=cp1251 AUTO_INCREMENT=65299 ;
    
    ALTER TABLE `b_iblock_element`
      ADD CONSTRAINT `b_iblock_element_ibfk_1` FOREIGN KEY (`IBLOCK_ID`) REFERENCES `b_iblock` (`ID`);
    

    Я уже понатыкал ключей "лишь бы были" так и это не помагает.
    Ответ:
    Cygapb-007
    Тот же результат

    А, да, там же FK...
    Вопрос: ORA-01461 при MERGE using DUAL

    Нашёл не тут похожее, но тоже без ответа:


    Есть рецепт как полечить такой MERGE?

    MERGE INTO table g
    USING (SELECT ? as tb FROM DUAL) d
    ON ...
    тут есть INSERT и UPDATE

    Oracle 11.2 даёт по лицу ошибкой ORA-01461: can bind a LONG value only for insert into a LONG column

    Делаю через ODBC напрямую руками, тип bind-ится нужный, так как insert и update работают.
    Если вместо ? прямо пишу NULL и ничего не bind-ю - то тоже всё работает.
    Ответ:
    ora601
    У вас в кляузе ON нету сравнения блобов ?

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

    ora601
    Приведите пример мерджа, тогда можно будет сказать где ошибка.

    Да ничего полный MERGE вам не даст, ошибка именно в приведённой части, остальное там роли не играет.

    Как и в прошлый раз, забил и сделал через процу.
    Авось к версии 15 оракл научится такое делать.
    Вопрос: Using IBM Informix on the Cloud

    FYI ...

    Using IBM Informix on the Cloud -


    Kind regards,
    Vadim.
    Ответ: GVF112GVF,

    что то не открывается. Пробовал и лисой и хромом.