Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
И всё же ответьте мне, пока я тут 20-ую минуту дожидаюсь открытия запроса...
Почему SQLServer так медленно работает с запросами на выборку данных, если в условии выборки упоменается значение null???
Меня это уже порядком раздражать стало.
Ну невозвожно же работать, когда необходимо, например, стыковать 2 таблицы и выбрать из связи только те данный которых нет либо в одной, либо в другой таблице.
Может как-нить по-другому делать?
Спасибо.
3 авг 04, 13:07    [854890]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Вербняков Александр
Member

Откуда: г.Таганрог, Ростовская область
Сообщений: 498
а можно текст запроса?
3 авг 04, 13:08    [854895]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
andsm
Member

Откуда: Москва
Сообщений: 1320
Блог
Запрос идет больше 20-ти минут? Проблема не в NULL-ах, проблема в чем-то другом. И SQL Server не работает медленнее из-за NULL-ов.
3 авг 04, 13:09    [854902]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
Вербняков Александр:

как всегда, можно:
Select *
From Tab1
Full Outer Join Tab2
On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null
3 авг 04, 13:14    [854936]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5637
а без nullов сколько отрабатывает? именно этот запрос...


для спящего время бодрствования равносильно сну
3 авг 04, 13:16    [854949]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
Алексей2003:
если вообще условия убрать?
Секунд 25 от силы :)
Но в этот раз что-то вообще невообразимое случилось :)
Запрос уже 40 минут открывается, а результ, по ходу, на диск C:\ скидывает. Мегабайты на глазах тают - пл 2 метра за секунду где-то )
Любо дорого на глюки такие посмотреть :))
И всё-равно проблема с null остается - я точно это знаю!!! :(
3 авг 04, 13:24    [855000]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Вербняков Александр
Member

Откуда: г.Таганрог, Ростовская область
Сообщений: 498
сколько получается строк при джоине? можно это переписать с union?

Select *
From Tab1
left Outer Join Tab2
On (Tab1.id = Tab2.id)
Where Tab2.id is null

union 

Select *
From Tab1
right Outer Join Tab2
On (Tab1.id = Tab2.id)
Where Tab1.id is null

?
3 авг 04, 13:24    [855002]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5637
бывает что и запрос
select 1
не отрабатывается
попробуйте скопировать этот запрос, закройте коннект, откройте новый и запустите еще раз :-)


для спящего время бодрствования равносильно сну
3 авг 04, 13:27    [855022]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
alre
Member

Откуда:
Сообщений: 27
Хороший запрос :-)))

On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null


Это означает, что если в каждой таблице
есть 1000 строк, у которых id is null,
то результат 1000 * 1000 = 1 000 000 строк
3 авг 04, 13:28    [855030]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
alre
Хороший запрос :-)))

On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null


Это означает, что если в каждой таблице
есть 1000 строк, у которых id is null,
то результат 1000 * 1000 = 1 000 000 строк

С чего это вдруг? Это же не CROSS JOIN.
3 авг 04, 13:30    [855040]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
Согласен с tpg! :)
У меня вообще в талицах в поле id значений null не имеется.
Хочу выбрать те, которые не стыковались (вот у них-то id и будет null)
Разве нет?
3 авг 04, 13:33    [855069]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Всё правильно. Только дело не в запросе, а скорее всего в коннекте...
3 авг 04, 13:36    [855087]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Glory
Member

Откуда:
Сообщений: 104751
Почему SQLServer так медленно работает с запросами на выборку данных, если в условии выборки упоменается значение null???
Меня это уже порядком раздражать стало.


- Может быть все-таки создать какие-нибудь индексы ? На основе плана выполнения(можно и предварительного а не реального)
3 авг 04, 13:37    [855099]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Summerson
Member

Откуда:
Сообщений: 50
Вообще значений null в таблицах и сравнения величин с null в запросах надо по возможности избегать, в любой ERP-системе это аксиома. Если возможно, стоит вместо null подставлять знак пробела, например сделать в таблице ограничение default. Такое ощущение, что запрос относится к тем запросам, которые могут выдать непредсказуемый результат.
3 авг 04, 13:42    [855124]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
To Glory:
а помогают, да? :))
Да нет, индексы, конечно всегда создаю на те поля, по которым связываю! В одной из таблиц id вообще уникальный индекс (причем идентификатор).
У нас там коллизия какая-то на серваке случилась, но скорее всего это из-за меня.
Ну и темпарь, конечно, же у меня под отказ забился :))
Прикольно осозновать, что на систем диске у тебя 0 байт свободного места :))
3 авг 04, 13:48    [855152]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
Ну, а что мешало вовремя кильнуть процесс то? Да и в запросе, я думаю, ошибка - что то типа кросса получилось (не может внешнее соединение дать строк больше чем сумма строк в обеих таблицах). А может там не две табличка, а 22?...
3 авг 04, 13:52    [855185]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
To tpg:


Шутить изволите? :)
Кильнуть жалко было - всё равно я тут с вами общался, а запрос уже 20 минут открывался :)
Но с null-ами, повторяю, у меня всегда такая проблема!!!
И таблички 2 всё-таки:) Говоришь, как мой преподаватель мат.ана. - очень смешной человек :))
3 авг 04, 14:00    [855215]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5637
а такой запрос сколько отработает?

Select top 25 *
From Tab1
Full Outer Join Tab2
On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null


для спящего время бодрствования равносильно сну
3 авг 04, 14:06    [855247]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Tyler
Member

Откуда:
Сообщений: 181
To Алексей2003:
да их там примерно 25 после отбора быть и должно
Ну 100 - не велика разница...
3 авг 04, 14:10    [855263]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
alre
Member

Откуда:
Сообщений: 27
tpg
alre
Хороший запрос :-)))

On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null


Это означает, что если в каждой таблице
есть 1000 строк, у которых id is null,
то результат 1000 * 1000 = 1 000 000 строк


С чего это вдруг? Это же не CROSS JOIN.

====================
use pubs
go
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Tab1]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Tab1]
GO
if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[Tab2]') and OBJECTPROPERTY(id, N'IsUserTable') = 1)
drop table [dbo].[Tab2]
GO
create table Tab1 ( [id] int null, f1 int identity(1,1) not null )
create table Tab2 ( [id] int null, f2 int identity(1,1) not null )
insert into Tab1 ([id]) values (null)
insert into Tab2 ([id]) values (null)
insert into Tab2 ([id]) values (null)

Select *
From Tab1
Full Outer Join Tab2
On (Tab1.id = Tab2.id)
Where Tab1.id is null
or Tab2.id is null

------------------
NULL NULL NULL 1
NULL NULL NULL 2
NULL 1 NULL NULL
3 авг 04, 14:13    [855278]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
Алексей2003
Member

Откуда: Москва
Сообщений: 5637
я понял, вы тут собираетесь сидеть и говорить что у вас ничего не получается... И НИЧЕГО НЕ ДЕЛАТЬ


для спящего время бодрствования равносильно сну
3 авг 04, 14:16    [855305]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
daw
Member

Откуда: Муром -> Москва
Сообщений: 7381
2 alre

create table #a (f1 int null, f2 int)

insert into #a values (null, 1)
insert into #a values (null, 2)
insert into #a values (null, 3)
insert into #a values (null, 4)

create table #b (f1 int null, f2 int)

insert into #b values (null, 5)
insert into #b values (null, 6)
insert into #b values (null, 7)
insert into #b values (null, 8)


select *
from #a
  full outer join #b on
    #a.f1 = #b.f1

зы: 4*4 = 16
3 авг 04, 14:18    [855315]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
alre
Member

Откуда:
Сообщений: 27
А вообще-то запросы (любые) могут неправильно работать из-за "плохих" статистик.
Попробуй UPDATE STATISTICS...
3 авг 04, 14:18    [855316]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
tpg
Member

Откуда: Novosibirsk
Сообщений: 23902
2 alre
Ну и что? Здесь не умножение числа строк из двух таблиц, а их сложение - в одной одна + во второй две = три. FULL OUTER JOIN так и работает.
3 авг 04, 14:19    [855318]     Ответить | Цитировать Сообщить модератору
 Re: Значения null - хуже не придумать  [new]
WiRuc
Member

Откуда: Воронеж
Сообщений: 1280
tpg
2 alre
Ну и что? Здесь не умножение числа строк из двух таблиц, а их сложение - в одной одна + во второй две = три. FULL OUTER JOIN так и работает.


Вообще-то FULL OUTER JOIN дает как раз перемножение строк. В данном случае получается сложение из-за особенностей сравнения NULL. А вот если заменить NULL на какое-то конкретное значение, то вы получите перемножение строк.
3 авг 04, 14:35    [855387]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить