Гость
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как настроить простой запрос / 5 сообщений из 5, страница 1 из 1
14.09.2020, 01:10
    #39998165
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как настроить простой запрос
Есть пара таблиц
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
/* Disable foreign keys */
PRAGMA foreign_keys = 'off';

/* Begin transaction */
BEGIN;

/* Database properties */
PRAGMA auto_vacuum = 0;
PRAGMA encoding = 'UTF-8';
PRAGMA page_size = 4096;

/* Drop table [something] */
DROP TABLE IF EXISTS [main].[something];

/* Table structure [something] */
CREATE TABLE [main].[something](
  [id] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [x] TEXT);

/* Drop table [used] */
DROP TABLE IF EXISTS [main].[used];

/* Table structure [used] */
CREATE TABLE [main].[used](
  [id] INTEGER PRIMARY KEY AUTOINCREMENT, 
  [id_something] INTEGER CONSTRAINT [fk] REFERENCES [something]([id]));

/* Table data [something] Record count: 5 */
INSERT INTO [something]([rowid], [id], [x]) VALUES(1, 1, 'a');
INSERT INTO [something]([rowid], [id], [x]) VALUES(2, 2, 'b');
INSERT INTO [something]([rowid], [id], [x]) VALUES(3, 3, 'c');
INSERT INTO [something]([rowid], [id], [x]) VALUES(4, 4, 'd');
INSERT INTO [something]([rowid], [id], [x]) VALUES(5, 5, 'e');

/* Table data [used] Record count: 3 */
INSERT INTO [used]([rowid], [id], [id_something]) VALUES(1, 1, 1);
INSERT INTO [used]([rowid], [id], [id_something]) VALUES(2, 2, 3);
INSERT INTO [used]([rowid], [id], [id_something]) VALUES(3, 3, 5);

/* Commit transaction */
COMMIT;

/* Enable foreign keys */
PRAGMA foreign_keys = 'on';



одна табличка id(AUTOINCREMENT),чтото
вторая Used это "использованные" что-то : id(AUTOINCREMENT), id_чтото

Закономерно хочу получить не поюзанное, запросом:

Код: sql
1.
2.
3.
4.
SELECT *
FROM   [main].[something]
       LEFT JOIN [main].[used] ON [main].[something].[id] = [main].[used].[id_something]
WHERE  [main].[used].[id_something] IS NULL;



но EXPLAIN QUERY PLAN постоянно выдает, что хочет полностью сканировать первую таблицу, что ИМХО зря ибо она априори больше таблицы заюзанных.

"id""parent""notused""detail""3""0""0""SCAN TABLE something""13""0""0""SEARCH TABLE used USING AUTOMATIC COVERING INDEX (id_something=?)"

Индексами как только не играл... мож запрос как-то по-другому, хотя и этот весьма прост... Или так и должно...

Зы. сорь, использовал SQLite, он все названия таблиц обернул и mаin еще зачем-то добавил.
...
Рейтинг: 0 / 0
14.09.2020, 01:15
    #39998166
iskatelsql
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как настроить простой запрос
Для наглядности переписал запрос

Код: sql
1.
2.
3.
4.
SELECT *
FROM   something
       LEFT JOIN used ON something.id = used.id_something
WHERE  used.id_something IS NULL
...
Рейтинг: 0 / 0
14.09.2020, 08:27
    #39998190
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как настроить простой запрос
Как ты себе представляешь алгоритм выполнения этого запроса без полного скана таблицы?

Тут только перебор всех записей и проверка каждой на наличие в used, о чем пишет план выполнения.
...
Рейтинг: 0 / 0
14.09.2020, 09:39
    #39998205
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как настроить простой запрос
Если индекс построить по полю used, возможно будет использоваться INDEX RANGE SCAN. Но нужно проверить на практике, насколько это будет лучше
...
Рейтинг: 0 / 0
14.09.2020, 11:15
    #39998233
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как настроить простой запрос
не так прочитал) предыдущее можно игнорировать
...
Рейтинг: 0 / 0
Форумы / SQLite [игнор отключен] [закрыт для гостей] / Как настроить простой запрос / 5 сообщений из 5, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]