Этот баннер — требование Роскомнадзора для исполнения 152 ФЗ.
«На сайте осуществляется обработка файлов cookie, необходимых для работы сайта, а также для анализа использования сайта и улучшения предоставляемых сервисов с использованием метрической программы Яндекс.Метрика. Продолжая использовать сайт, вы даёте согласие с использованием данных технологий».
Политика конфиденциальности
|
|
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
У меня есть Dbf файл из которого я выбираю значение даты DECLARE @Dat DateTime SELECT @Dat = Date FROM MyDbfs...MyTable SELECT @Dat AS 'Dat' этот код дает значение первой записи в файле а мне нужна последняя (не знаю как сделать). Файл простая таблица не индексированная, поля дат физически расположены по возрастанию. В общем нужна замена Fox-ской команды GO BOTTOM. Если делать SELECT Max(Date) то SQL перебирает все записи в таблице, а зачем это если я точно знаю что максимальная расположена в конце файла. Кто знает как черкните пару строчек pls. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 05:26 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
Попробуй так: SELECT TOP 1 @Date = Date FROM MyDbfs...MyTable ORDER BY Date DESC где ORDER BY Date DESC сортирует поубыванию, а TOP 1 выбирает 1 строку Удачи ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 05:42 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
И в том, и в другом случае получим полное сканирование таблицы. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 16:10 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
2Nikolay >В общем нужна замена Fox-ской команды GO BOTTOM. IMHO Вам нужно избавляться от Fox-ских методов работы и представлений о таблицах, а то так вы вместо запросов начнете курсоры везде использовать. > Если делать SELECT Max(Date) то SQL перебирает все записи в таблице, >а зачем это если я точно знаю что максимальная расположена в конце файла Понятно, что вы сами про таблицу знаете очень много, но SQL-то откуда что знает про "неродную" для него таблицу. Для "своих" таблиц он по краней мере может попытаться использовать индексы, статистику, или можно ему непосредственно указать хинты. А как вы себе представляете подобное для источника данных, в котором этого всего нет. Вот если бы это был другой SQL сервер, который имеет свой планировщик запросов и поэтому может оптимизировать запросы, а то все-таки Jet. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 16:42 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
Избавлятся от Fox-совских методов? Знаете очень трудно потому как они в некоторых случаях удобнее SQL. В общем я понимаю, что SQL это "язык" для пакетной обработки данных но что делать если нужно одно конкретное значение? Должны быть методы. Мне не хочется делать так как советует Replicant так как переиндексация это по времени то же что перебор, а этот индекс больше не пригодится. Я получаю таблицу (таблица не моя изменить в принципе ничего не могу), выбираю последнюю дату (это и время отправки), и в зависимости от даты запихиваю в SQL и все, после таблица удаляется. Сразу хочу предупредить очевидное решение ставить индекс в SQL и читать оттуда после записи, так не получится потому, что отправленные раньше могут прийти позже и тогда дата будет неправильной. Насколько я понимаю, случайно ткнул в больное место SQL, уже видел много подобных вопросов (лазил в поисках по интернету) но решений нет. Везде советуют изменить подход, использовать более прогрессивные метода SQL и т.д. Но! (мое личное мнение) Если есть связь со старым, и работа с устаревшими Dbf таблицами то должны остатся и старые методы. Может недокументированные. Кстати Glory может я и не прав но курсор в этом случае тоже будет перебирать таблицу сначала до конца. может и неявным образом. сужу об этом по анологии как Delphi эмулирует двунаправленный курсор из одиночного - он закрывается и передвигается количество раз - 1. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 23.01.2002, 21:51 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
Nikolay. Вы пишите: -Если есть связь со старым, и работа с устаревшими Dbf таблицами то должны остатся и старые методы. Так что-же мешает Вам? Напишите свою маленькую программку на том-же фоксе или на клиппере и извлекайте нужные Вам данные из файла. А те средства, что есть у SQL сервера, не предназначены для полноценной работы с различными форматами данных. Вы должны понимать, что не стоит ожидать от текстового редактора таких-же возможностей по работе с таблицами, как у табличного процессора, и наоборот. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 11:21 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
А что так нельзя? select * from TAB where ID=(SELECT max(ID) FROM TAB) где, ID уникальный ключ в таблице TAB Если что, можно чуть изменить синтаксис: select * from TAB where ID in (SELECT max(ID) FROM TAB) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 12:22 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
Владимир Смирнов -Так что-же мешает Вам? Мне ничего не мешает кроме того что весь смысл моей программы в сборе старый данных (Dbf) и передаче их в SQL для хранения и обработки. И именно изза этих новых возможностей. Сейчас я получаю значение даты через BDE на Delhpi а потом через ADO кладу в SQL. А хотелось бы все сделать через SQL и не зависеть от BDE. Mishgan то что вы предлагаете тоже будет индексировать таблицу изза Max хотя и без этого будет, я тут эксперементировал вот что получилось Процедурка для подсчета времени на обработку DECLARE @Time DateTime DECLARE @Time1 DateTime SET @Time = GETDATE() SELECT @Dat = Max(Date) FROM MyDBFs...MyTable SET @Time1 = GETDATE() SELECT @Dat AS 'Dat', DatePart(millisecond, @Time1-@Time) AS 'MilSek' естественно получаются разные значения но последние если ставить SELECT @Dat = Max(Date) FROM MyDBFs...MyTable : время работы 160 мсек для SELECT @Dat = Min(Date) FROM MyDBFs...MyTable : 160 мсек для SELECT @Dat = Date FROM MyDBFs...MyTable : 363 мсек кстати то с чего я начал оказалось неверным (третий запрос дает последнее значение! а не первое как я думал вначале, хотя может это зависит от каких либо настроек) но я уже увидел время обработки. 363 мсек на моей машине и тестовом файле это время полного перебора таблицы! 160 это похоже индексирование и выборка. А в фоксе GO BOTTOM и mDat=DATE по времени дают 0 мсек. А вот со временем которое дают команды обрабатывающие много записей ситуация обратная. Ну ладно я похоже немного отвлекся. Думаю буду просто использовать команду быстрее выполняющуюся хотя хочется свести время к 0 как в фоксе. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 24.01.2002, 17:22 |
|
||
|
Присоветуйте как можно в SQL выбрать последнюю запись
|
|||
|---|---|---|---|
|
#18+
Понятно возмущение. Но нужно просто взглянуть на проблему с другой стороны. SQL Server не работает со строками. Он работает с данными, размещенными страницами по 2кб, и для того чтоб по ним перемещаться, он использует B-Trees на уровне ядра. DBF файл - это всегда 1 таблица. База же SQL (не BLOB) - это непрерывная (в пределах устройства/файла) цепочка 2кб страниц данных, на каждой из которых может начинаться или заканчиваться та или иная таблица. В свою очередь информацию об этих границах сервер хранит в других структурах, которые образуют так называемые страницы распределения, или страницы индекса, если они есть. Чтоб попасть на эти страницы, ядром опрашиваются другие - системные страницы. В общем "дерево". И выбор осуществляется путем перемещения "вверх по дереву". Индексы определяют по каким веткам нам лезть, чтоб потом не возвращаться. При желании, можно считать это недостатком SQL, но на сегодняшний день - это самый прогрессивный подход к реализации поиска записей в РЕЛЯЦИОННЫХ СУБД. Хотя и не кажется мне, что бы MS написали ядро способное одинаково эффективно работать со своими и DBF-овскими таблицами, есть конечно надежда напороться на желаемую недокументированную возможность. Основываться она может на следующем факте: При выборе значений отвечающих определенному условию, SQL Server заполняет массив смещений, по которому затем перемещается (ВНИМАНИЕ с помощью ISAM подобных операторов вроде GetNext и GetPrev! P.S. Значит не все потеряно? Ищем, а? Ключевые моменты: Database Manager, Page Manager, Search Manager, Access Methods Manager, Buffer Manager, процедура qualpage, B-Tree. Дополнительно: DBCC SHOWCONTIG (тоже кстати НЕ для DBF) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 25.01.2002, 19:36 |
|
||
|
|

start [/forum/topic.php?fid=46&fpage=3511&tid=1824183]: |
0ms |
get settings: |
7ms |
get forum list: |
16ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
31ms |
get topic data: |
10ms |
get forum data: |
2ms |
get page messages: |
43ms |
get tp. blocked users: |
2ms |
| others: | 215ms |
| total: | 332ms |

| 0 / 0 |
