Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
2 запроса, выполняемые с использованием linked server

Первый
SELECT top 10 name FROM [127.0.0.1\sql2008r2].master.dbo.spt_values


SELECT top 10 name FROM [127.0.0.1\sql2008r2].master.dbo.spt_values
|--Compute Scalar(DEFINE:([127.0.0.1\sql2008r2].[master].[dbo].[spt_values].[name]=[127.0.0.1\sql2008r2].[master].[dbo].[spt_values].[name]))
|--Remote Query(SOURCE:(127.0.0.1\sql2008r2), QUERY:(SELECT TOP (10) "Tbl1002"."name" "Col1004" FROM "master"."dbo"."spt_values" "Tbl1002"))

Второй
SELECT top 10 row_number() over(order by name), name FROM [127.0.0.1\sql2008r2].master.dbo.spt_values


SELECT top 10 row_number() over(order by name), name FROM [127.0.0.1\sql2008r2].master.dbo.spt_values
|--Top(TOP EXPRESSION:((10)))
|--Sequence Project(DEFINE:([Expr1003]=row_number))
|--Segment
|--Compute Scalar(DEFINE:([127.0.0.1\sql2008r2].[master].[dbo].[spt_values].[name]=[127.0.0.1\sql2008r2].[master].[dbo].[spt_values].[name]))
|--Remote Query(SOURCE:(127.0.0.1\sql2008r2), QUERY:(SELECT "Tbl1002"."name" "Col1005" FROM "master"."dbo"."spt_values" "Tbl1002" ORDER BY "Col1005" ASC))

Как видно из плана, во втором случае с использованием row_number на linked server отправляется запрос на вычитку всей таблицы, а расчет row_number() и top происходит уже на локальном сервере, в то время как в первом случае (без row_number()) на linked server отправляется "нормальный" запрос с top.

Откуда возникает вопрос: как с наименьшими усилиями и с наименьшими изменениями заставить второй вариант запроса выполняться полностью на стороне linked server'a. ну там опция, трейс-флаг, галочка, что еще....

Microsoft SQL Server 2008 R2 (SP1) - 10.50.2500.0 (X64)

-------------------------
There’s no silver bullet!
19 апр 12, 21:14    [12442273]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
А top специально без order by?
19 апр 12, 21:28    [12442339]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
А top специально без order by?

Ну, это непринципиальный момент
просто чтобы было видно что в плане топ отправляется на linked server
19 апр 12, 21:28    [12442347]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
exec('select top 10 row_number() over(order by name), name  from master.dbo.spt_values;') at [127.0.0.1\sql2008r2];
Не?
19 апр 12, 21:34    [12442363]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
exec('select top 10 row_number() over(order by name), name  from master.dbo.spt_values;') at [127.0.0.1\sql2008r2];
Не?

Не. Запрос формирую не я, а linq2sql и влиять на него могу с ооочень малой степенью.
19 апр 12, 21:37    [12442382]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
У меня складывается впечатление, что скуль считает, что на "той" стороне - 2000-й скуль, а не выше.
потому как top(10) - он выполняет "там", а top(@cnt) - "тут"
19 апр 12, 21:42    [12442403]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Из области предположений, сам не проверял -- может plan guide подходящий состряпать?
19 апр 12, 21:58    [12442486]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Chkot
Guest
Исключительно предположение - row_number() - это функция и ее ты запрашиваешь из базыданных в контексте которой запускается запрос, по этому на линкованном сервере читается вся таблица, а обработка происходит в функции на этом сервере.
19 апр 12, 22:13    [12442567]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
Из области предположений, сам не проверял -- может plan guide подходящий состряпать?

Ну, на все запросы то гайдов не настряпаешь.
да и как указать, что выполнение должно быть "там"?
19 апр 12, 22:53    [12442726]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
exec('бла-бла') at [127.0.0.1\sql2008r2];
А так короче:
exec('бла-бла') at [.\sql2008r2];


А вообще указание IP где либо меня побешивает.
19 апр 12, 23:12    [12442815]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
Mnior,

Это имя линкед-сервера такое. Так что сократить не выйдет :)
20 апр 12, 00:14    [12443049]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
invm
Это имя линкед-сервера такое. Так что сократить не выйдет :)
Перевожу:
- лень уже
- не всегда доходит сразу
- не все в конторе чистюли
- так получилось
Нужное подчеркнуть.

Да не, я и не заставляю.
КО это такая роль. Не обращайте внимания.
20 апр 12, 00:54    [12443143]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
locky
да и как указать, что выполнение должно быть "там"?
Добавить top (10) в RemoteQuery в xml-плане? Опять же не проверял, только предположение.
А в каких пределах текст запроса можно менять?
20 апр 12, 01:01    [12443152]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior
invm
Это имя линкед-сервера такое. Так что сократить не выйдет :)
Перевожу:
- лень уже
- не всегда доходит сразу
- не все в конторе чистюли
- так получилось
Нужное подчеркнуть.

Да не, я и не заставляю.
КО это такая роль. Не обращайте внимания.

Давайте не растекаться мысью по древу, а попробуем ответить на изначальный вопрос?

зы 127.0.0.1, ., localhost, <machinename> etc - это возможность зарегистрировать локальный сервер несколько раз в качестве linked server. иногда бывает нужно для тестирования.
20 апр 12, 01:01    [12443153]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
invm
locky
да и как указать, что выполнение должно быть "там"?
Добавить top (10) в RemoteQuery в xml-плане? Опять же не проверял, только предположение.
А в каких пределах текст запроса можно менять?

Не топ.
Заставить запрос с row_number() выполняться целиком на прилинкованной стороне, а не тянуть данные локально и уже локально вычислять row_number() и прочее.
Причем сделать это без значительного переписывания запроса (ибо автогенерируемый), а, желательно, "магическим переключателем".
20 апр 12, 01:03    [12443156]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
locky
У меня складывается впечатление, что скуль считает, что на "той" стороне - 2000-й скуль, а не выше.
потому как top(10) - он выполняет "там", а top(@cnt) - "тут"
Чисто теоретически, с той стороны вообще не MSSQL может быть. Или нет?
20 апр 12, 01:31    [12443195]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Гавриленко Сергей Алексеевич
locky
У меня складывается впечатление, что скуль считает, что на "той" стороне - 2000-й скуль, а не выше.
потому как top(10) - он выполняет "там", а top(@cnt) - "тут"
Чисто теоретически, с той стороны вообще не MSSQL может быть. Или нет?

Ну, вообще-то, если подумать, то может и не скуль (в теории)
Но с другой стороны, сервер то добавляется именно как скулёвый сервер, это раз
ну и с другой стороны - TOP то он пропихивает на ту сторону то, а ведь далеко не каждый сервер его поддерживает
20 апр 12, 01:34    [12443197]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
aleks2
Guest
locky
Как видно из плана

1. Главная обшибка тредстартера - ничо там из плана такого НЕ видно.
2. И видно быть не могет.
3. Оба запроса тянут все. Только в первом случае тянуть больше 10 строк не надо.
4. Фот и фсе.
20 апр 12, 04:37    [12443267]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
locky
Не топ.
Заставить запрос с row_number() выполняться целиком на прилинкованной стороне, а не тянуть данные локально и уже локально вычислять row_number() и прочее.
Причем сделать это без значительного переписывания запроса (ибо автогенерируемый), а, желательно, "магическим переключателем".
Боюсь, такого переключателя не найти. Вернее, он уже есть, но не подходит -- exec() at.
Может в этом случае имеет смысл вынести все нужное во вьюхи/инлайновые функции и уже их дергать из приложения?
20 апр 12, 10:18    [12443711]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
+ locky, invm
locky
зы 127.0.0.1, ., localhost, <machinename> etc - это возможность зарегистрировать локальный сервер несколько раз в качестве linked server. иногда бывает нужно для тестирования.
Бл$
Я чё против чё. Я просто не понимаю задлянафига писать так длинно и через IP имена линков к локалу.
Просто как совет в стиле КО. Мол я линки делаю так: [.\Test1], [.\Test2] ...
Проходящие мимо чтоб видели.

Это тупо был комент в offtop, а не "вы делаете неправильно". Нафига уводить тему, реагирутя так ... глупо.

Ссори за offtop. Я даже не заметил что тема от locky. Неожиданно.

aleks2, +1

Оператор Top убивает процесс чтения, а не фильтрует данные.
А вот на сколько эффективно убивает - зависит от.
20 апр 12, 17:20    [12447483]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
И вообще, не непоимаю "претензии".
То что скуль пробросил условия/операторы на линк это скорее исключение чем правило.

В этот раз linq2sql дал Top, а в другой раз JOIN в всё, хамба.
Кроме как перебить в linq2sql запросы, другого способа контроля не вижу.

Или вы, locky, знает что-то больше, чем я.
20 апр 12, 17:28    [12447553]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior
И вообще, не непоимаю "претензии".
То что скуль пробросил условия/операторы на линк это скорее исключение чем правило.

В этот раз linq2sql дал Top, а в другой раз JOIN в всё, хамба.
Кроме как перебить в linq2sql запросы, другого способа контроля не вижу.

Или вы, locky, знает что-то больше, чем я.

Претензии в том, что запрос, который теоретически может быть выполнен более оптимально - на практике выполняется менее оптимально. И вопрос - как бы это побороть "ничего не делая".
20 апр 12, 19:25    [12448108]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
locky
Member

Откуда: Харьков, Украина
Сообщений: 62034
Mnior
Я даже не заметил что тема от locky. Неожиданно.


+
Я тоже знаю далеко не всё
20 апр 12, 19:26    [12448113]     Ответить | Цитировать Сообщить модератору
 Re: linked server + row_number()  [new]
Mnior
Member

Откуда: Кишинёв
Сообщений: 6724
linked server
У меня складывается ощущение, что у M$ есть на архитектуру межсерверного взаимодействия другой взгляд.
Строить распределённую систему (именно строить, а не быстренько связать две/несколько на коленке) видимо можно как-то по другому.
Отсутствие развития LS - это как залог продвижения железного решения (аля PDW) для партнёров M$.
Хотя это всё как-то притянуто за уши. Ибо не вижу я нормального решения вообще.
Не?
21 апр 12, 15:18    [12450763]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить