Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Не поняль...  [new]
q
Guest
Отцы, че-то я...

Имею 30 таких таблиц:

CREATE TABLE [sp_xx] (

[id] [int] IDENTITY (-1, 1) NOT NULL ,
[name] [varchar] (50) COLLATE Cyrillic_General_CI_AS NOT NULL ,

CONSTRAINT [PK_sp_xx] PRIMARY KEY CLUSTERED ([id])
)


и одну такую:

CREATE TABLE [t] (

[id] [int] IDENTITY (1, 1) NOT NULL ,
[f01] [int] NOT NULL ,
[f02] [int] NOT NULL ,
.
.
.
[f50] [int] NOT NULL ,

CONSTRAINT [PKt] PRIMARY KEY CLUSTERED ([id])
)

ALTER TABLE t ADD
CONSTRAINT [FK_t_sp_01] FOREIGN KEY ([f01]) REFERENCES [sp_01] ([id]),
CONSTRAINT [FK_t_sp_02] FOREIGN KEY ([f02]) REFERENCES [sp_02] ([id]),
.
.
.
CONSTRAINT [FK_t_sp_xx] FOREIGN KEY ([f50]) REFERENCES [sp_xx] ([id])


В таблицах sp_xx в среднем по 10 записей, в таблице t - одна.


1. Хочу такой селект:

SELECT (SELECT name FROM sp_01 WHERE sp_01.id=t.f01) AS f01_st,

(SELECT name FROM sp_02 WHERE sp_02.id=t.f02) AS f02_st,
.
.
.
(SELECT name FROM sp_xx WHERE sp_xx.id=t.f50) AS f50_st
FROM t
WHERE id=1


Выполняется подозрительно медленно.
Тогда
2. Делаю 31 селект с клиента :)

SELECT id, name FROM sp_01

.
.
.
SELECT id, name FROM sp_30

SELECT f01, f02, ..., f50 FROM t WHERE id=1

, а потом уже на клиенте - 50 выборок name из 30 таблиц


Дык почему второй вариант в разы быстрее?!
19 май 03, 13:29    [202628]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Мож я конечно чего не понял, но разве здесь 30 раз LEFT JOIN таблицы t c таблицами sp_xx не самое простое решение.
19 май 03, 13:36    [202639]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
q
Guest
Я не хочу LEFT JOIN... Типа... так надо 8)
19 май 03, 14:11    [202711]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Дык почему второй вариант в разы быстрее?!

Потому и быстрее, что "а потом уже на клиенте - 50 выборок name из 30 таблиц " - т.е. часть вычислений перенесена с сервера на клиента.

Или вы считате, что
SELECT id, name FROM sp_01
и
(SELECT name FROM sp_02 WHERE sp_02.id=t.f02) AS f02_st
в качестве поля это одно и тоже ?
19 май 03, 14:15    [202717]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
pkarklin
Member

Откуда: Москва (Муром)
Сообщений: 74925
Я не хочу LEFT JOIN... Типа... так надо

Ни че не понял. 8-) Тебе надо чтоб быстро работала или чтоб запрос был обязательно корреляционный? В последнем случаи не спрашивай почему медленно.
19 май 03, 14:17    [202722]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
q
Guest
Потому и быстрее, что "а потом уже на клиенте - 50 выборок name из 30 таблиц " - т.е. часть вычислений перенесена с сервера на клиента.

Или вы считате, что
SELECT id, name FROM sp_01
и
(SELECT name FROM sp_02 WHERE sp_02.id=t.f02) AS f02_st
в качестве поля это одно и тоже ?


Я говорил про суммарное время, т.е. время на сервере + время на клиенте, а они у меня на одном компе.
19 май 03, 14:45    [202760]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
Glory
Member

Откуда:
Сообщений: 104760
Ну так может раскроете методику вашего тестирования - какое время вы засекаете и как и что означают слова "потом уже на клиенте - 50 выборок name из 30 таблиц", т.е. вот эти вот 50 выборок на клиенте
19 май 03, 16:21    [202939]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
q
Guest
Методика простая :) На двухсотом пне вариант №1 выполняется 50 секунд, это говорит QA. А второй - ну значительно быстрее, задом чую. 50 выборок на клиенте - это что-то типа foreach(DataRow drow in dtab.Rows) if(drow["id"] ==id_i) { name_i = drow["name"]; break; } X 50
19 май 03, 17:34    [203076]     Ответить | Цитировать Сообщить модератору
 Re: Не поняль...  [new]
Анон
Guest
ааа... это у тебя руки кривые...
21 май 03, 11:47    [204943]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить