Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Прочее";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Вниз

К знатокам Oracle.   Найти похожие ветки 

 
AntiUser ©   (2006-08-20 22:37) [0]

Пара вопросов.
1. При CREATE TABLE SOME
(SOME1 VARCHAR2(10)
,SOME2 VARCHAR2(10)
,SOME3 VARCHAR2(1)
,SOME4 VARCHAR2(20)
,SOME5 NUMBER(2)
,SOME6 NUMBER(2)
)
Есть возможность задать поле boolean? Если да, то как?

2. При создании несколькох индексированных таблиц и их заполнении с нуля, в течении этого сеанса работы запрос, типа: SELECT * FROM Some WHERE (SOME4 LIKE "%sometext%")" выборка из 1000000 записей происходит за 3 сек.. После перезагрузки машины, тотже самый запрос выполняется за 12 сек.. В чем может быть проблема? Не происходит индексация при загрузке? Или еще чего? Какие могут быть варианты?

Блин, пока писал забыл еще вопрос =) Ладно, вспомню - спрошу.


 
Vendict ©   (2006-08-20 22:51) [1]

AntiUser ©   (20.08.06 22:37)
1.У Смирнова в "Работаем С Oracle" про тип boolean не сказано ни слова. хотя он рассматривает 8й Oracle. Может в старших версиях появился.


 
AntiUser ©   (2006-08-20 23:01) [2]

У меня Oracle9i (9.2.0.1.0) в хелпах тоже ни слова =(


 
Vendict ©   (2006-08-20 23:34) [3]

AntiUser ©   (20.08.06 23:01) [2]
тоже ни слова =(

значит нет такого типа.


 
kaif ©   (2006-08-20 23:36) [4]

2 AntiUser ©   (20.08.06 22:37)  
2.
Правильнее сказать, что при повторении запроса результат получается быстрее. ИМХО, скорее всего часть страниц файла базы данных  остается в кешах обмена с дисковыми устройствами (в различных устройствах памяти). Так работает не только ORACLE. Interbase тоже повторный запрос отрабатывает быстрее, чем самый первый запрос к той же таблице. Здесь нет проблемы.


 
Vendict ©   (2006-08-20 23:37) [5]

Vendict ©   (20.08.06 22:51) [1]
не сказано ни слова. хотя

я имел ввиду, что есть раздел/глава с описанием типов данных в книжке, но в этом разделе/главе о типе boolean не говорится, т.е. его в данной версии нет.


 
AntiUser ©   (2006-08-20 23:45) [6]

kaif ©   (20.08.06 23:36) [4]

В том-то и дело, что до перезагрузки ЛЮБЫЕ запросы выполняются за 3-4 сек., а после перезагрузки самый быстрый 12.


 
Petr V. Abramov ©   (2006-08-21 00:48) [7]

>1 лично мне не удалось вычитать что-либо про тип boolean
>2  проблемы нет, данные оказываются в кеше, хорошо, если оракловом
читайте Concepts


 
kaif ©   (2006-08-21 00:55) [8]

Документация ORACLE 9i a96624.pdf

PL/SQL Datatypes
 Predefined Datatypes
   Boolean Type

Boolean Type
BOOLEAN
You use the BOOLEAN datatype to store the logical values TRUE, FALSE, and NULL (which stands for a missing, unknown, or inapplicable value). Only logic operations are allowed on BOOLEAN variables.
The BOOLEAN datatype takes no parameters. Only the values TRUE, FALSE, and
NULL can be assigned to a BOOLEAN variable. You cannot insert the values TRUE
and FALSE into a database column. Also, you cannot select or fetch column values into a BOOLEAN variable
.

И еще в другом месте:
The value of a Boolean expression can be assigned only to Boolean variables, not to host variables or database columns. Also, datatype conversion to or from type BOOLEAN is not supported.

Таким образом колонки таблиц типа Boolean не поддерживаются ORACLE.


 
Petr V. Abramov ©   (2006-08-21 01:00) [9]

> kaif ©   (21.08.06 00:55) [8]
 то, что Predefined в PL/SQL, не обязательно поддерживается в "чистом" SQL Oracle DB.


 
kaif ©   (2006-08-21 01:09) [10]

2 Petr V. Abramov ©   (21.08.06 01:00) [9]
Я это и имею в виду.
Тип boolean в SQL есть неявно.
А что, например, значит WHERE 1 = 1 ?
Или WHERE EXISTS(SELECT ... FROM ...) ?
Как раз и значит WHERE TRUE.
Здесь можно употреблять все логические операторы, например:
WHERE
 (FIELD1 = "Вася" AND EXISTS(SELECT ID FROM TABLE2 T2 WHERE T2.FIELD2 = "Вася")) OR
 (FIELD2 = "Петя")

То есть сам тип Boolean разумеется используется в SQL во всех условиях WHERE и HAVING, но это не то же самое, что позволять хранить данные типа BOOLEAN в колонках таблиц или возвращать их в SQL.

То есть конструкция
 SELECT (FIELD1 = "Вася") AS My_Boolean_Var FROM TABLE1 не сработает.


 
Petr V. Abramov ©   (2006-08-21 02:08) [11]

> kaif ©   (21.08.06 01:09) [10]
> Тип boolean в SQL есть неявно.
  Неявно = домысливаемо? В SQL есть выражения, которые Вы приводите к привычному Вам типу boolean/ Хотя они "не тааакие", у них есть null

> Тип boolean в SQL есть неявно.
Не зря SQL Reference и PLSQL User"s Guide and Reference.pdf - разные книги


 
Sergey13 ©   (2006-08-21 09:03) [12]

2 [6] AntiUser ©   (20.08.06 23:45)
> В том-то и дело, что до перезагрузки ЛЮБЫЕ запросы выполняются за 3-4 сек.,
Что-то у вас запросы какие то неоптимизированные.

> а после перезагрузки самый быстрый 12.
Не перезагружай. 8-)


 
AntiUser ©   (2006-08-21 09:14) [13]

Sergey13 ©   (21.08.06 09:03) [12]
> а после перезагрузки самый быстрый 12.
Не перезагружай. 8-)


А если серьезно? Как с этим можно бороться?


 
Sergey13 ©   (2006-08-21 09:24) [14]

> [13] AntiUser ©   (21.08.06 09:14)

Так я почти серьезно. Тебе же объяснили - это нормально. После перезагрузки кеш буферов пуст и все чтение идет с диска. Повтори свой запрос и увидишь свои "быстрые" 3-4 секунды.
Зачем перезагружать сервер то? Электричество экономите?


 
Desdechado ©   (2006-08-21 11:46) [15]

> SELECT * FROM Some WHERE (SOME4 LIKE "%sometext%")"
Этот запрос не использует индексов.
Зато, при разных настройках Оракла, вполне может использовать разные виды кэшей.


 
kaif ©   (2006-08-21 11:47) [16]

Попробую резюмировать.

1. В общем типа Boolean в том смысле, в каком хочет его видеть автор вопроса, в ORACLE нет и скорее всего не предвидится.

2. Даже если добиться скорости запросов 0.1 сек, то при повторном запросе это время все равно может уменьшиться до 0.01 сек и это нормально, так как скорость чтения страниц базы данных с дисков обычно ниже, чем скорость чтения из устройств памяти, которая кеширует считываемые страницы. Бороться с этим бессмысленно. Если скорость обращения к диску не устраивает - можно поставить какой-нибудь RAID со скоростью доступа 300 Mb/sec. А вообще фетчи из запросов с конструкцией WHERE LIKE "%sometext%" вряд ли смогут работать особенно быстро на миллионах записей. Так как это тупое сканирование всей таблицы без использования каких-либо индексов.
Для конструкции WHERE LIKE "sometext%" (без процента слева) в Interbase (не знаю, как в ORACLE) оптимизатор запросов в состоянии еще как-то   задействовать индекс. А вот чистый поиск по вхождению
(WHERE LIKE "%sometext%") индексы не использует и использовать не может. Так как не существует индексации "по вхождениям любой подстроки".
Хотя где-то у каких-то чуваков я видел реализацию подобного поиска.
Но там делали специальную таблицу, в которую вставляли все возможные подстроки и индексировали все это разнообразие.
Типа:

основная таблица T1:
--------
ID NAME
--------
1  Вася
2  Петя

дополнительная таблица T2:
-----------
ID NAME
1  Вася
1  ася
1  ся
1  я
2  Петя
2  етя
2  тя
2  я

SELECT T1.NAME
FROM T1, T2
WHERE
 T1.ID = T2.ID and
 T2.NAME LIKE "ася%"

Вот как-то так еще можно задействовать индекс.
Надеюсь у автора не тот случай, когда это может зачем-то понадобиться.
:)


 
Danilka ©   (2006-08-21 11:52) [17]


> Бороться с этим бессмысленно.

Некоторые, все-таки борюцца, иногда. :)
Если все-таки возникла необходимость перезагрузить сервак, то после перезагрузки можно "разогреть" базу запросами.


 
Desdechado ©   (2006-08-21 11:56) [18]

> можно "разогреть" базу запросами.
Только типовыми, чтобы не забить кэш данных мусором, а кэш планов - неоптимизированым хламом.


 
Sergey13 ©   (2006-08-21 13:07) [19]

> [17] Danilka ©   (21.08.06 11:52)

А смысл специального "разогрева"?


 
Danilka ©   (2006-08-21 16:13) [20]

[19] Sergey13 ©   (21.08.06 13:07)
Обычно сервак гасят не просто так, от раздолбайства, а когда нет юзеров, для каких-то работ.
А потом, чтоб когда пришли юзеры все летало как обычно, ее можно "подогреть", загнав актуальные данные в кэш.
Если сервак загасили во время работы и все юзеры ждут, то тут смысла нет, как сервак включицца, они и сами все что надо разогреют.
:)


 
Sergey13 ©   (2006-08-21 16:21) [21]

> [20] Danilka ©   (21.08.06 16:13)

Никогда не грел. Остужать пробовал. Греть - нет. Надо будет попробовать.
А как ты узнавал какие данные будут актуальные? Домой юзерам звонил? 8-)


 
Desdechado ©   (2006-08-21 16:29) [22]

Sergey13 ©   (21.08.06 16:21) [21]
Типовые запросы с типовыми параметрами. Хорошая вероятность, что зачитается нужными данными.


 
Sergey13 ©   (2006-08-21 16:37) [23]

> [22] Desdechado ©   (21.08.06 16:29)

Т.е. запустить десяток-другой приложений и во всех поработать денек другой, а там уж и узеров пускать? Зато придут и пять секунд съэкономят. Может быть. 8-)


 
Desdechado ©   (2006-08-21 17:30) [24]

Sergey13 ©   (21.08.06 16:37) [23]
Ты ж программист, придумай что-нибудь.
Напиши пакетик, который заничается этим сам. :)
И запускай его


 
AntiUser ©   (2006-08-21 20:39) [25]

Всем спасибо за внесенную ясность. Но вот у меня еще вопрос.
Возможно ли как-то прервать долго выполняющийся запрос (использую Direct Oracle Access VERSION 4.0) например WHERE (SOME4 LIKE "%sometext%") о-о-очень долгий и его хотельсь бы прервать. Возможно ли это? Может другой какой специальный запрос с callback"ом так сказать или еще как.


 
kaif ©   (2006-08-21 22:25) [26]

ORACLE позволяет убивать запросы.
Что-то в таком духе:
SELECT SID, SERIAL# FROM V$SESSION WHERE USERNAME = <USERNAME>
(сначала узнали все запросы какого-то юзера)
ALTER SYSTEM KILL SESSION  + <SID>, <SERIAL> IMMEDIATE
(убили конкретный запрос некоторого юзера)

Работает ли это всегда - не гарантирую.
Но что-то мне так удалось как-то грохнуть.
Это скорее намек, чем совет.
Я думаю, Петр подскажет что-то более точно. Он этот ORACLE знает лучше.


 
Petr V. Abramov ©   (2006-08-21 23:05) [27]

> AntiUser ©   (21.08.06 20:39) [25]
 вроде бы(?) в OCI такая возможность есть (сам не пробовал). При работе с DOA получить все необходимые хендлы можно.


 
by ©   (2006-08-22 08:43) [28]

У автора EhLib есть Oracle Cancelable Unit, как раз для DOA.
http://ehlib.com/oraclecutils_di.htm


 
Sergey13 ©   (2006-08-22 08:50) [29]

> [26] kaif ©   (21.08.06 22:25)
> ORACLE позволяет убивать запросы.

Все так, только не запросы, а сами сессии.


 
Petr V. Abramov ©   (2006-08-22 09:09) [30]

> Все так, только не запросы, а сами сессии.
 это само собой


 
Иксик ©   (2006-08-22 09:16) [31]

Разыскивается знаток оракл. З.п. 1500-2000 кб.
Правда необходимо азербайджанское гражданство... :))


 
Petr V. Abramov ©   (2006-08-22 09:34) [32]

удаленно могу :)))
гражданство тоже удаленно )


 
Иксик ©   (2006-08-22 09:54) [33]


> Petr V. Abramov ©   (22.08.06 09:34) [32]

:)))
Здесь на самом деле трудно найти сабж. Все что есть уже неплохо устроены...


 
Desdechado ©   (2006-08-22 12:27) [34]

> знаток оракл.
Какой именно профиль знатока?
Если универсал, то указанная сумма маловата.



Страницы: 1 вся ветка

Форум: "Прочее";
Текущий архив: 2006.09.17;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.101 c
15-1156859319
Chort
2006-08-29 17:48
2006.09.17
MathCad против Delphi


15-1156805982
Longman
2006-08-29 02:59
2006.09.17
Старые хранители экрана


3-1153049615
kaif
2006-07-16 15:33
2006.09.17
Нужна UDF, генерирующая случайные числа


15-1156694224
Griha
2006-08-27 19:57
2006.09.17
Скрыть от приложения деактивацию его окна (WM_ACTIVATE)


2-1156290623
RASkov
2006-08-23 03:50
2006.09.17
Рекурсия





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский