|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
Есть таблица с индексом по полю типа "Date" EXPLAIN QUERY PLAN показывает, что: 1.Индекс срабатывает: Код: sql 1.
2.Индекс НЕ срабатывает: Код: sql 1.
Корректно отображает данные именно второй вариант. Если в таблице "лимоны" записей, то бегать переборам СЛИШКОМ долго, так что второй вариант исключается, а первый отображает не правильно. Что же делать ... (((((((((((((((((( Кто что подскажет ??? ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2013, 21:13 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
Второй вариант - функция на поле. А индекс создается на поле. А почему у тебя DocDate некорректно отображает? Что мешает писать туда дату в корректном виде? Сделай вторичное поле в котором пиши результат от date(DocDate). И поиски-сортировки делай по нему. ... |
|||
:
Нравится:
Не нравится:
|
|||
14.12.2013, 22:31 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
авторА почему у тебя DocDate некорректно отображает? Что мешает писать туда дату в корректном виде? Юзаю ASP.NET Пишу корректно: Код: c# 1. 2. 3.
Если не указать функцию date() . То выборка данных с использованием BETWEEN или <= and >=, будет аналогична < and >, то есть теряется знак "=". Пример: BETWEEN 2013-12-01 and 2013-12-10 войдут только даты [2013-12-02, 2013-12-09] и потеряются аж 2-е даты 2013-12-01 и 2013-12-10 П.С.1 Тестил в разных менеджерах, например SQLiteExpert ( http://www.sqliteexpert.com/) - теряются 2-е даты. П.С.2 Можно конечно извращаться и брать дату AddDay(-1) and AddDay(+1) ... ))) ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2013, 16:37 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
potkinавторА почему у тебя DocDate некорректно отображает? Что мешает писать туда дату в корректном виде? Юзаю ASP.NETЭто не важно. У тебя не работает BETWEEN, а это сам sqlite. Поэтому показывай как у тебя хранятся даты в базе. potkinТо выборка данных с использованием BETWEEN или <= and >=, будет аналогична < and >, то есть теряется знак "=". Пример: BETWEEN 2013-12-01 and 2013-12-10 войдут только даты [2013-12-02, 2013-12-09] и потеряются аж 2-е даты 2013-12-01 и 2013-12-10 П.С.1 Тестил в разных менеджерах, например SQLiteExpert ( http://www.sqliteexpert.com/) - теряются 2-е даты. Этого не может быть. В случае если у тебя даты в базе записаны как строки 2013-12-01, 2013-12-02 и так далее, то описанное поведение невозможно. Значит у тебя в базе лежит нечто, а аргументами в between ты отдаешь нечто другое. Так как в sqlite нету типа "дата" и он соответственно не делает автоматическую конвертацию из того "нечто" что записано в базе в то "нечто" что ты используешь в качестве аргументов - то оба "нечто" приводятся в строки и сравниваются как строки. Вывод: приведи аргументы для between в тот же формат что и даты записанные в базе и проблема исчезнет. ... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2013, 18:02 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
White OwlПоэтому показывай как у тебя хранятся даты в базе. Код: sql 1. 2. 3. 4. 5. 6. 7.
Создавал таблицу с индексами и сам (с помощью .NET провайдера скаченного с сайта СкуЛайта) и в разных менеджерах пробовал. В Менеджерах показывает дату так: "2013-08-03" Выборку делаю так (точный кусок запроса): Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
15.12.2013, 21:58 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
potkin, В таком случае дата хранится у вас как текст в формате 'yyyy-mm-dd hh:MM:ss.000'. Соответственно нужно и формировать фильтр Код: sql 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2013, 05:05 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
potkinWhite OwlПоэтому показывай как у тебя хранятся даты в базе. Код: sql 1. 2. 3. 4. 5. 6. 7.
Создавал таблицу с индексами и сам (с помощью .NET провайдера скаченного с сайта СкуЛайта) и в разных менеджерах пробовал. Это не важно. Во первых, типа DATE в SQLite не существует. Во вторых, collate имеет смысл только для текстовых данных (и только для случая SQLite+ICU). potkinВ Менеджерах показывает дату так: "2013-08-03"Это уже ближе к истине. А как эту дату показывает стандартный консольный sqlite3? Менеджеры они "все для удобства" и прячут многие частности. Некоторые из этих частностей - важны, поэтому менеджеры в целом не удобны. Хочешь добраться до истины - бери самые примитивные, но и самые честные утилиты. А еще лучше, бери C и пиши сам. potkinВыборку делаю так (точный кусок запроса): Код: sql 1. 2. 3. 4. 5.
COLLATE и NOCASE тут бессмысленны. Если бы ты работал с текстом в национальных алфавитах, то тогда бы они дали эффект. А для строки цифр - это бессмысленная трата ресурсов. ... |
|||
:
Нравится:
Не нравится:
|
|||
16.12.2013, 07:35 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
anvg White Owl Спасибо. Сегодня попробую и отпишусь. ... |
|||
:
Нравится:
Не нравится:
|
|||
17.12.2013, 11:07 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
sqlite3.exe показал такой формат даты: 2013-12-27 00:00:00 Индекс для даты: Код: sql 1.
Запрос: Код: sql 1. 2. 3. 4. 5.
... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2013, 22:17 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
potkin sqlite3.exe показал такой формат даты: 2013-12-27 00:00:00 Ну значит и искать ты должен по этому полю с учетом времени. Задавай для своих @DateS = "2013-12-27 00:00:00" и @DatePo = "2013-12-29 23:59:59" ... |
|||
:
Нравится:
Не нравится:
|
|||
18.12.2013, 22:57 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
Ещё вопросик. Тестирую Запросы. Иногда индексы не задействуются. А задействуются только после пересоздания Индекса (удаления и повторного создания)! Таблица: Код: sql 1. 2. 3. 4. 5.
Запрос: Код: sql 1. 2. 3. 4. 5.
Результат: selectid order from detail0 0 0 SCAN TABLE Doc (~72 rows)0 0 0 USE TEMP B-TREE FOR ORDER BY Пересоздание индекса (удаление и повторное создание) и результат selectid order from detail0 0 0 SEARCH TABLE Doc USING COVERING INDEX IDX_Doc_DocDate (DocDate>? AND DocDate<?) (~4 rows) Забил таблицу Doc несколькими лимонами записей, результат на лицо! ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2014, 16:44 |
|
SQLite, поле Date и индекс по этому полю
|
|||
---|---|---|---|
#18+
Это происходит после команды Vacuum . Все индексы перестают "работать". Надо делать удаление и создание всех индексов в Базе. И команда Reindex не помогает. П.С. Может быть я что-то не дочитал ... ... |
|||
:
Нравится:
Не нравится:
|
|||
01.01.2014, 16:59 |
|
|
start [/forum/topic.php?fid=54&msg=38516823&tid=2008835]: |
0ms |
get settings: |
9ms |
get forum list: |
13ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
15ms |
get forum data: |
2ms |
get page messages: |
46ms |
get tp. blocked users: |
1ms |
others: | 276ms |
total: | 404ms |
0 / 0 |