Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Сравнение СУБД Новый топик    Ответить
 Oracle vs MSSQL. Битва интеллекта.  [new]
dbms_photoshop
Member

Откуда:
Сообщений: 5151
Oracle
select distinct x
  from (select column_value x
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
order by length(x);

select x
  from (select column_value x
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
group by x
order by length(x);
OK
OK

MSSQL
select distinct x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
order by len(x)
go
select x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by len(x)
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
OK
Ну и почему MSSQL не может догадаться что можно сортировать по детерминированной функции над столбцом?

Идем далее.
В Оракле 1-й и 3-й случаи отрабатывают потому что он догадывается что там константа.
+
select distinct x
  from (select column_value x, 1 y
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
order by length(y);

select distinct x
  from (select column_value x, row_number() over (order by column_value) y
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
order by length(y);

select x
  from (select column_value x, 1 y
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
group by x
order by length(y);

select x
  from (select column_value x, row_number() over (order by column_value) y
          from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
group by x
order by length(y);

OK
ORA-01791: not a SELECTed expression
OK
ORA-00979: not a GROUP BY expression

В MSSQL не отрабатывает ничего (зато единообразно :))
+
select distinct x
  from (select x, 1 y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
order by len(y)
go
select distinct x
  from (select x, row_number() over (order by x) y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
order by len(y)
go
select x
  from (select x, 1 y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by len(y)
go
select x
  from (select x, row_number() over (order by x) y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by len(y)
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
ORDER BY items must appear in the select list if SELECT DISTINCT is specified.
Column "t.y" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.
Column "t.y" is invalid in the ORDER BY clause because it is not contained in either an aggregate function or the GROUP BY clause.

Ясное дело, без сортировки все варианты работают в обоих СУБД.
Ну и какая более интеллектуальная, huh?
3 дек 15, 16:26    [18509392]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
dbms_photoshop,

Dual все эти примеры перекрывает)
3 дек 15, 18:43    [18510278]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
dbms_photoshop
Member

Откуда:
Сообщений: 5151
SergSuper
Dual все эти примеры перекрывает
Что?
3 дек 15, 18:55    [18510344]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
SergSuper
Member

Откуда: SPb
Сообщений: 5488
dbms_photoshop
SergSuper
Dual все эти примеры перекрывает
Что?

это кусок Вашего кода, на Оракле попробуйте выполнить
select 'hello' x union all select 'mister' union all select 'smith' union all select 'x'

или вот Вы пишите
select column_value x
from table(sys.odcivarchar2list('hello','mister','smith','x'))) t
зачем это table? что ж этот интеллектуальный Оракл не может догадаться что там табличные данные
3 дек 15, 19:02    [18510371]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
dbms_photoshop
Member

Откуда:
Сообщений: 5151
SergSuper
Оракле попробуйте выполнить
Те, кому режут глаза подобные отличия, могут создать таблицу и любоваться практически полным совпадением текстов запросов.
Может тогда лучше удасться рассмотреть на чем делался акцент в стартовом посте.
SergSuper
что ж этот интеллектуальный Оракл не может догадаться что там табличные данные
Ага, а еще интеллектуальный Оракл не позволяет создавать процедуры/функции без объявления типа результата.
Вообще беда.
3 дек 15, 19:13    [18510420]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dbms_photoshop,


select distinct x
  from (select x
          from (select 'hello' x union all select 'hello' union all select 'smith' union all select 'x') t) t
--order by x

Полагаю, что это из-за того, что сам по себе DISTINCT в MS SQL фактически реализован оператором сортировки с удалением дубликатов:

К сообщению приложен файл. Размер - 56Kb
3 дек 15, 23:20    [18511321]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dbms_photoshop,

Сделать так:
select x
  from (select x
          from (select 'hello' x union all select 'hello' union all select 'smith' union all select 'x') t) t
order by LEN(x)

, то как бы очевидно, что сначала будет Compute Scalar и только потом SORT:

К сообщению приложен файл. Размер - 24Kb
3 дек 15, 23:22    [18511327]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dbms_photoshop,

А
select x
  from (select x, row_number() over (order by x) y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by len(y)


замените на:
select x
  from (select x, row_number() over (order by x) y
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by MAX(len(y))
3 дек 15, 23:25    [18511339]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dbms_photoshop,

Так же полагаю, что это вариант:

SELECT
  x
FROM
(
select distinct x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t) t1
order by len(x)

сработает на обеих СУБД.
3 дек 15, 23:31    [18511362]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
Симонов Денис
Member

Откуда: Рязань
Сообщений: 11092
dbms_photoshop,

для сравнения вне конкруса. Firebird 3.0

+
with t(x) as (
   select 'hello' from rdb$database
   union all
   select 'mister' from rdb$database
   union all
   select 'smith' from rdb$database
   union all
   select 'x' from rdb$database
)
select distinct x
  from (select x, 1 y
          from t) t
order by char_length(y);

with t(x) as (
   select 'hello' from rdb$database
   union all
   select 'mister' from rdb$database
   union all
   select 'smith' from rdb$database
   union all
   select 'x' from rdb$database
)
select distinct x
  from (select x, row_number() over (order by x) y
          from t) t
order by char_length(y);

with t(x) as (
   select 'hello' from rdb$database
   union all
   select 'mister' from rdb$database
   union all
   select 'smith' from rdb$database
   union all
   select 'x' from rdb$database
)
select x
  from (select x, 1 y
          from t) t
group by x
order by char_length(y);

with t(x) as (
   select 'hello' from rdb$database
   union all
   select 'mister' from rdb$database
   union all
   select 'smith' from rdb$database
   union all
   select 'x' from rdb$database
)
select x
  from (select x, row_number() over (order by x) y
          from t) t
group by x
order by char_length(y);


OK
OK
Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause).
Invalid expression in the ORDER BY clause (not contained in either an aggregate function or the GROUP BY clause).
4 дек 15, 09:57    [18512150]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
Агенор
Member

Откуда: "Откуда вам знать, если вы ещё не попробовали?"
Сообщений: 1429
dbms_photoshop
Идем далее.
В Оракле 1-й и 3-й случаи отрабатывают потому что он догадывается что там константа.


Это не достоинство оракла, а его недостаток. Вместо того, чтобы упрощать код и делать поведение системы предсказуемым, оракловские гавнокодеры реализовали кучу частных случаев и превратили движок исполнения запросов в подобие помойки, а именно свалку огромного количества костылей и заплаток, оставшихся от крупных клиентов.
5 дек 15, 17:26    [18518182]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
dbms_photoshop
Member

Откуда:
Сообщений: 5151
pkarklin
Полагаю, что это из-за того, что сам по себе DISTINCT в MS SQL фактически реализован оператором сортировки с удалением дубликатов
Несколько странно полагать обработку синтаксиса (парсинг) основываясь на плане.
В Оракле тоже раньше distinct работал как SORT ORDER BY, потом стало возможно задействовать HASH GROUP BY.
Регулируется хинтом (no_)use_hash_aggregation.
pkarklin
то как бы очевидно, что сначала будет Compute Scalar и только потом SORT
При отсутствующем distinct (или group by) не совсем понятно какое это имеет отношение к стартовому посту.
pkarklin
замените на
Это понятно. Акцент был сделан на ранице в поведении.
Впрочем особой необходимости для спец обработки вырожденных случаев как делает Оракле с константой я не вижу.

Ну и изначально в MSSQL выглядит несколько нелогично, что сортировка по len(x) в случае группировки допускается, а в случае distinct - нет.
Ясное дело, можно в случае с distinct добавить len(x) в select list и просто не отображать на клиенте, но сомнительна необходимость подобного в случае детерминированной функции.
7 дек 15, 13:43    [18524126]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
dbms_photoshop
Member

Откуда:
Сообщений: 5151
Симонов Денис
для сравнения вне конкруса. Firebird 3.0
Наиболее интересно отрабатывают ли эквивалент этого
select distinct x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
order by len(x)
go
select x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
group by x
order by len(x)
Спасибо.
7 дек 15, 13:58    [18524252]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
Таблоид
Member

Откуда:
Сообщений: 9456
Блог
dbms_photoshop
Симонов Денис
для сравнения вне конкруса. Firebird 3.0
Наиболее интересно отрабатывают ли
На ФБ эти два запроса выдают правильный вариант, начиная с версии 2.5.3:
+
C:\MIX\firebird\QA\fbt-repo\tmp>C:\MIX\firebird\oldfb253\bin\isql /3253:e25 -i da

X
======
x
hello
smith
mister


X
======
x
hello
smith
mister

ISQL Version: WI-V2.5.3.26780 Firebird 2.5
Server version:
Firebird/x86/Windows NT (access method), version "WI-V2.5.3.26780 Firebird 2.5"
Firebird/x86/Windows NT (remote server), version "WI-V2.5.3.26780 Firebird 2.5/tcp (csprog)/P12"
Firebird/x86/Windows NT (remote interface), version "WI-V2.5.3.26780 Firebird 2.5/tcp (csprog)/P12"
on disk structure version 11.2
До 2.5.2 включительно 'mister' вылезал раньше 'smith', т.е. они выдавались в перепутанном порядке:
+
X
======
x
hello
mister
smith


X
======
x
hello
mister
smith
8 дек 15, 15:30    [18530437]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
ДохтаР
Member [заблокирован]

Откуда: Новоукраинск
Сообщений: 16864
Агенор
dbms_photoshop
Идем далее.
В Оракле 1-й и 3-й случаи отрабатывают потому что он догадывается что там константа.


Это не достоинство оракла, а его недостаток. Вместо того, чтобы упрощать код и делать поведение системы предсказуемым, оракловские гавнокодеры реализовали кучу частных случаев и превратили движок исполнения запросов в подобие помойки, а именно свалку огромного количества костылей и заплаток, оставшихся от крупных клиентов.


Пожалуй соглашусь.

С выходом 12 версии сложилось впечетление , что на поддержку
всех фич заплаток и часных случаев оракла не хватает рук.

Там явно у менеджмента проблемы с осознанием теории сложности,
связать тренд зависимости трудозатрат на поддержку фич и частных случаев
с прогрессией 2^Х они кажется ИМХО не осилили.
9 дек 15, 12:53    [18534666]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
ДохтаР,

Так это - не малая доля их доходов завязана именно на платной поддержке. Поэтому они спокойно раздают базовую версию базы с сайта.
При таком подходе сложный черный ящик предпочтительней простого инструмента.
9 дек 15, 14:49    [18535651]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
ДохтаР
Member [заблокирован]

Откуда: Новоукраинск
Сообщений: 16864
Сергей Арсеньев
ДохтаР,

Так это - не малая доля их доходов завязана именно на платной поддержке. Поэтому они спокойно раздают базовую версию базы с сайта.
При таком подходе сложный черный ящик предпочтительней простого инструмента.


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

На росте мировой экономике это хорошая стратегия ,
а на стагнации клиенты найдут замену даже незаменимым дорогим фичам.

Понимаете в чем тут вопрос , когда видишь кучу фич,
которыми не пользуешься или которые работают немного не так как хочется
понимаешь , что недополучаешь прибыль.

И вобще саппорт , это страховка для эффективного менеджера
среднего звена, что бы когда что то перестало работать , можно было
эфективно перевести стрелки на индусов.
9 дек 15, 15:56    [18536198]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
Сергей Арсеньев
Member

Откуда:
Сообщений: 4118
ДохтаР,

Не мне учить Ларри деньги зарабатывать. :)
Так что их стратегия - их дело.

Простой инструмент требует дорогого сотрудника, чтоб умел им пользоваться. А он птица независимая. А многим хочется стабильности. Поэтому согласны платить за саппорт и удобства.

А они требуют большого комбайна.
9 дек 15, 16:05    [18536242]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
ДохтаР
Member [заблокирован]

Откуда: Новоукраинск
Сообщений: 16864
Сергей Арсеньев
ДохтаР,

Не мне учить Ларри деньги зарабатывать. :)
Так что их стратегия - их дело.

Простой инструмент требует дорогого сотрудника, чтоб умел им пользоваться. А он птица независимая. А многим хочется стабильности. Поэтому согласны платить за саппорт и удобства.

А они требуют большого комбайна.


С точки зрения менеджмента спорный вопрос,
дорогой сотрудник в националной валюте , или дорогой саппорт в пересчете на доллары.

В нашей организации уже несколько лет еще до всяких кризисов
изменился вектор на то,
что выгоднее платить своим в своей стране, в нацвалюте,
чем в долларах индусам.

Своими можно договориться на компенсацию ипотеки в нац валюте,
талонами на бензин, размещением премии на депозит,
или еще как то поиграать в пянташки с дырявой ликвидностью,
а индусам вынь да полож, в долларах, в срок по договору,
а доходы то зарабатываются в национальной валюте.
9 дек 15, 17:25    [18536762]     Ответить | Цитировать Сообщить модератору
 Re: Oracle vs MSSQL. Битва интеллекта.  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74930
dbms_photoshop,

автор
Несколько странно полагать обработку синтаксиса (парсинг) основываясь на плане.


Так парсинг такой запрос проходит успешно. Значит дело не в парсинге.
SET PARSEONLY ON
GO
select distinct x
  from (select x
          from (select 'hello' x union all select 'mister' union all select 'smith' union all select 'x') t) t
order by len(x)
GO
SET PARSEONLY OFF


Command(s) completed successfully.

автор
При отсутствующем distinct (или group by) не совсем понятно какое это имеет отношение к стартовому посту.

Порядок выполнения операторов в плане. Т.е. сначала надо посчитать, а потом сортировать, но из подсчитанного кое-что могло быть удалено при DISTINCT SORT. Т.е. получается, для того, чтобы выполнить запрос оптимизатор должен поменять порядок операторов в плане - сделать не то, что просили. Возможно, это какой-то "рудимент" оптимизатора. Заведение по этому поводу "тикета" вижу бесперспективным.
9 дек 15, 23:41    [18538030]     Ответить | Цитировать Сообщить модератору
Все форумы / Сравнение СУБД Ответить