MSSQL LIMIT How?

12 отговора 388 прегледа
#1

MSSQL LIMIT How?

имам следния проблем

MS SQL Server трябва да му направа горе-долу следната заявка (MySQL SELECT Statement):
SELECT * FROM table1 LIMIT 0,100

идеята е че MS SQL Server не поддържа LIMIT ами има някакъв тъп TOP който въобще не върши работа. някой да може да ми обади трикче как да го направа това. трябва ми за JAVA приложение.

Отговор
в отговор на DrmR #2

Re: MSSQL LIMIT How?

Кое му е тъпото на TOP-а и защо не върши работа?

Отговор
в отговор на umnik #3

Re: MSSQL LIMIT How?

ами щото ми трябва отделен "прозорец" от един SELECT statement. т.е. трябва ми да кажем от 100-ния рекорд до 200-тния. с MS SQL не знам как ще стане това. има само TOP не знам как да му кажа от кой запис да почне да брои. нещо такова:) ако пак не разберете не се страхувайте да кажете, в момента съм на компютър без фонетична и ми е малко гадно да опиша хубаво проблема. утре може да го напиша колкото мога точно.

Отговор
в отговор на DrmR #4

Re: MSSQL LIMIT How?

Това ще ти свърши ли работа:

SELECT TOP 100 FROM (SELECT TOP 100 FROM MyTable ORDER By MySortField ASC) ORDER BY MySortField DESC

?

Life has lots of twists and turns. Don't get too comfortable.
Отговор
в отговор на Пepин Aйбapa #5

Re: MSSQL LIMIT How?

В 1вия момент си помислих "Тази пък глупост каква е?", обаче всъщност май си доста прав!
SELECT TOP 100 FROM (SELECT TOP 100 FROM MyTable ORDER By MySortField ASC) ORDER BY MySortField DESC ще ти хване 1вия "page" от 100 записа;
SELECT TOP 100 FROM (SELECT TOP 200 FROM MyTable ORDER By MySortField ASC) ORDER BY MySortField DESC ще ти хване 2рия "page" от 100 записа и т.н.
Само трябва да се внимава, защото ще ти обърне резултата - връща DESC.
Е, трябва да се пробва и реално, във ФМИ ни тренират да сме живи интерпретатори, обаче няма гаранция:P
А иначе това с limit е адски удобно.

Отговор
в отговор на DrmR #6

Re: MSSQL LIMIT How?

пробвай и с динамичен курсор (server side)... не знам какъв перформанс гониш...

Сигнатура!
Отговор
в отговор на devnul #7

Re: MSSQL LIMIT How?

Не съм сигурен за производителността обаче. Имам чуството че вътрешно SQL Server-а ако му кажеш по този начин да изсимулира LIMIT 1000, 1100 той ще създаде роусет с 1000 реда, и после ще отреже 100 от тях. което пак е по-бързо от това да се влачат до ASP-то или каквото там се ползва с АДО.
Що се отнася до решението с курсора то е по дефиниция по-бавно защото всеки курсор води до временна таблица, т.е. не само че ще се изкопитат всички 1100 реда от горния пример, ами и ще се обхождат с не особенно ефективен TSQL цикъл.

Life has lots of twists and turns. Don't get too comfortable.
Отговор
в отговор на Пepин Aйбapa #8

Re: MSSQL LIMIT How?

Абе не е много ясно - временната таблица може да е само от PK-тата на въпросните записи, пък и иначе онзи роусет пак си е копиране на 1000 реда....

Сигнатура!
Отговор
в отговор на Questor #9

Re: MSSQL LIMIT How?

Роусета си е 1100 реда и няма мърдане. Ако има достатъчно място в паметта никога няма да стигне до диска, докато временната таблица си е обременена с диск, транзакции, синхронизция, лог ...
Ама не разбрах - как ще направиш временната таблица да е само от тези редове? Поясни по-подробно?

Life has lots of twists and turns. Don't get too comfortable.
Отговор
в отговор на DrmR #10

Re: MSSQL LIMIT How?

Да, да....

това на което се дължи разпространението на MySQL. Салле мое да ги разправя квито си иска, стандарти, мандарти, добра база данни - кур. Цялата история е че има limit клауза (и това на е по никви стандарти). Ако не се бяха сетили за това шефчетата на MySQL в момента щяха да се снимат в евтини немски порно филми с фистинг at best.

Иначе това дето го каза Перин е интересно, но в момента съм не особено трезвен и не мога да го анализирам. По принцип зависи какъв ти е клиента на заявката - АСП или АСП.НЕТ. Ако си с .НЕТ по-добре е да ги правиш тези неща на клиент-а с DataSet и да си пейджваш с DataGrid. При много големи заявки рано или късно ще се стигне до temp tables (предполагам и MySQL така го прави, просто е доста по-удобно за ползване щото не ти се налага ти да се занимаваш с това).

--
Sometimes the sole purpose of your life is to serve as a warning to others.
Отговор
в отговор на Пepин Aйбapa #11

Re: MSSQL LIMIT How?

>>мам чуството че вътрешно SQL Server-а ако му кажеш по този начин да >>симулира LIMIT 1000, 1100 той ще създаде роусет с 1000 реда, и после ще >>отреже 100 от тях

Аха - аз съм си играл да тествам.

Select Something from SomeTable Limit 0,100

е (доста) по-бързо от:

Select Something from SomeTable Limit 1000,1100

макар че и двете връщат по 100 реда.

--
Sometimes the sole purpose of your life is to serve as a warning to others.
Отговор
в отговор на Пepин Aйбapa #12

Re: MSSQL LIMIT How?

Имам предвид тип курсори

Keyset (adOpenKeyset) - в tempdb слага само key-ovetet
Dynamic (adOpenDynamic) - според док. излиза, че не слага нищо в tempdb, щото връща винаги актуални данни.

Сигнатура!
Отговор
в отговор на Questor #13

Re: MSSQL LIMIT How?

Хммм да верно, аз препрочетох как е и верно може би така по-става.
Аз пък съм си свикнал да пиша куирита които орязват данните максимално и после дисконектед рекордсет ...

Life has lots of twists and turns. Don't get too comfortable.
Отговор