Добро пожаловать в форум, Guest >> Войти | Регистрация | Поиск | Правила | | В избранное | Подписаться | ||
Все форумы / Microsoft SQL Server |
![]() ![]() |
зеленый админ Member Откуда: Сообщений: 247 |
Есть таблицаCREATE TABLE [dbo].[test_ice] ( [id] int IDENTITY(1, 1) NOT NULL, [id2] int NOT NULL) ON [PRIMARY] WITH (DATA_COMPRESSION = NONE); уникальній индекс CREATE UNIQUE NONCLUSTERED INDEX [ix_test_ice_id2_id] ON [dbo].[test_ice] ([id2] , [id]) WITH ( PAD_INDEX = OFF, FILLFACTOR = 1, IGNORE_DUP_KEY = OFF, STATISTICS_NORECOMPUTE = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON, DATA_COMPRESSION = NONE ) ON [PRIMARY]; GO и запрос select distinct t.id2, min(t.id) OVER(PARTITION BY id2) AS min_id from test_ice as t with (index (ix_test_ice_id2_id)) Есть ли в 2008R2 такой план, при котором был бы проход по индексу и поиск минимального? |
9 авг 13, 17:17 [14688462] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
А почему distinct, а не group by ? |
9 авг 13, 17:21 [14688485] Ответить | Цитировать Сообщить модератору |
зеленый админ Member Откуда: Сообщений: 247 |
Потому что, 1. select t.id2, min(t.id) OVER(PARTITION BY id2) AS min_id from test_ice as t with (index (ix_test_ice_id2_id)) group by t.id2 Msg 8120, Level 16, State 1, Line 1 Column 'test_ice.id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 1. select t.id2, min(t.id) OVER(PARTITION BY id2) AS min_id from test_ice as t with (index (ix_test_ice_id2_id)) group by t.id2, min(t.id) OVER(PARTITION BY id2) Msg 4108, Level 15, State 1, Line 3 Windowed functions can only appear in the SELECT or ORDER BY clauses. |
||
9 авг 13, 17:29 [14688558] Ответить | Цитировать Сообщить модератору |
Glory Member Откуда: Сообщений: 104751 |
разве это не тоже самое, что select t.id2, min(t.id) from test_ice group by t.id2 |
9 авг 13, 17:33 [14688594] Ответить | Цитировать Сообщить модератору |
зеленый админ Member Откуда: Сообщений: 247 |
да, согласен, спасибо. Более тогоselect t.id2, min(t.id) from test_ice as t with (index (ix_test_ice_id2_id)) group by t.id2 выглядит план запроса таким, как нужно! |
9 авг 13, 17:48 [14688735] Ответить | Цитировать Сообщить модератору |
erfgwerfewr
Guest |
зеленый админ, А что ты хотел от сервера distinct t.id2, min(t.id) OVER(PARTITION BY id2) AS min_id Он как не крути вконце будет делать sort distinct, так как у тебя колонка min_id известна только после вычисления, в индексе информации о нем нет. и это кстати, не то, что с group by... В строго твоем примере (с логикой distinct) можно было только убрать ненужный table spool и прочую шелуху таким образом distinct t.id2, FIRST_VALUE(t.id) OVER(PARTITION BY id2 ORDER BY ID) AS min_id --- скажи спасибо Glory, что он умеет читать мысли |
9 авг 13, 18:05 [14688849] Ответить | Цитировать Сообщить модератору |
iap Member Откуда: Москва Сообщений: 47052 |
|
||||
9 авг 13, 18:17 [14688910] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Но зачем?
Явно ум за разум. Гуманитарный. У обоих. |
||||||
10 авг 13, 00:00 [14690193] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Mnior, никак на top ... with ties.... order by ....asc намекаете ? |
12 авг 13, 11:07 [14695240] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Потому как заставить его искать по индексу можно легко,добавими фейковый where по id2. Но Вы видимо ,подразумевали нечто другое ,если не жалко 1 минуты времени - покажите плиз |
||
12 авг 13, 11:48 [14695540] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Maxx, а чего вы добиваетесь? По чеснаку. |
12 авг 13, 19:09 [14698684] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
я - если честно , то просто хотел увидеть чет реальное.. у нас же профессия вечный студент,и если кто-то обладает знаниями которых ты не знаеш,то и не зазорно спросить Троллинга - нет по факту |
||
13 авг 13, 11:38 [14700924] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Как вас надоумило задать эти вопросы? Мне интересно, честно. Вот покажите этапы логических рассуждений, как из 14690193: * distinct + OVER -> ухо пяткой * group by -> элементарно Вы вывели: * top with ties -> круче * group by -> не настолько круто ???
Спрашивают не знания, а несостыковки (Знания сами формируются, из сопоставления). А что-то новое - выслушивают/высматривают. Ссори за придирчивость к словам. Maxx, рассуждения erfgwerfewr непонятны подходом: Надо выпиливать (методом подбора) запрос до "эталонного" плана, при этом структура запроса сама по себе якобы совершенно неважна. Структура плана - замечательно. Но язык важная часть. Его структурность не должна быть абы какая - это инструмент формализации стоящий на строгих понятиях. Надо писать в первую очередь формально правильно, подбирая подходящую эквивалентную форму, а план контролирует что модель адекватная (модель предметной области, модель её реализации, модель компиляции, мат. моделей, модель языка, модель формализации) и исправляя, если что-то не так, если возможно. |
||||||
13 авг 13, 15:42 [14703073] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Прикалываетесь да ? Я вообще спросил чем Вас не устроил вариант просто group by ,при етом добавив что поиск по идексу можно обеспечить добавиви фейковый where по id2. В ответ очередной загон про гуманитариев и все такое,вместо нормального примера , без "пяток в ухо" и с лучшим планов и более дешевым.
Формально правильно и удобноваримо серверу ето агрегатная ф-ция +group by . Все остальное записываю как "гуманитарный стеб" , не более Начало вы положили сами Glory 14688594 Вы 14690193 |
||||
13 авг 13, 15:52 [14703135] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Вы перестали пь вотку по утрам? ©
А как вы, Maxx, поняли мой пост? Серьёзно. Объясните мне пожалуйста. Может научусь выражаться яснее. |
||||||||
13 авг 13, 21:03 [14704539] Ответить | Цитировать Сообщить модератору |
rergregre
Guest |
короче |
||
13 авг 13, 22:40 [14704857] Ответить | Цитировать Сообщить модератору |
Maxx Member [скрыт] Откуда: Сообщений: 24290 |
Честно понял по другому ,и начал сие только исходя из вот етого 14690193
Потому как Glory сразу предлдожил нормальный вариант, вы опровергли. Вот я и подумал,что и простой group by вам не по вкусу. Посему попросил написать чето другое и по вашему мнениею не гуманитарное :) Вообщем проехали Да ,иногда, за вашей любовью "разлиться мыслею по древу" и академическим выкладкам - просто теряеш смысл вашей фразы ,в данном случае так и вышло. Надеюсь недоразумение улажено ? |
||||||
14 авг 13, 09:52 [14705995] Ответить | Цитировать Сообщить модератору |
Mnior Member Откуда: Кишинёв Сообщений: 6723 |
Просто вот думаю вы расскажите/поможете выяснить как писать правильно, чтобы меньше недоразумений было. Мне нужно виденье вашего мировоззрения (+ постоянно его осознавать и учитывать). Постоянно подстёгивать к сложному мышлению полезно. Не к запутанному, противоречивому, а к сложному, где нужно подумать. Тренировать надо мышцы, чтобы они были сильными. :) А отношение из этого иногда складываются такое - "Все вокруг очень умные и смогут сами всё понять". ![]() Мой учитель по физике вообще стебался - вводил ненужную, сбивающую с толку информацию. Тренировал хорошо. "скажи спасибо Glory" повелительное наклонение + сослагательное. 3 участника: кто сказал, действие от одного к другому. А вот если было написано так "скажи ему спасибо" без явного "Glory"? |
||
14 авг 13, 11:14 [14706464] Ответить | Цитировать Сообщить модератору |
Все форумы / Microsoft SQL Server | ![]() |