SQL Anywhere Select Query Acts по-разному в зависимости от max_query_tasks - PullRequest
0 голосов
/ 15 апреля 2020

Я думаю, что у меня есть sql запрос, который должен быть детерминирован c. Я продолжал получать недетерминированные c результаты. Я проверил план и заметил, что оптимизатор собирается на несколько процессоров. Если я установлю max_query_tasks = 2 или меньше, то он становится детерминированным c. Ниже приведен фрагмент кода для создания тестовых таблиц и тестовый запрос для демонстрации проблемы. Да, я знаю, что эти таблицы не самые лучшие. Я нарисовал это, чтобы помочь продемонстрировать проблему.

DROP TABLE IF EXISTS my_build_ids;
DROP TABLE IF EXISTS mod_dates;

--create the tables
CREATE TABLE my_build_ids (
    "build_id" INTEGER NOT NULL DEFAULT AUTOINCREMENT UNIQUE,
    "build_customer" VARCHAR(30) NOT NULL,
    "build_bom_id" VARCHAR(30) NULL,
    PRIMARY KEY ( "build_id" ASC )
);

CREATE TABLE mod_dates( 
build_id INTEGER, 
mod_date DATETIME
);

--add the data
INSERT INTO my_build_ids (build_id, build_customer, build_bom_id) VALUES 
(1, 'customer a', 'bom #1b'),(2, 'customer a', 'bom #1a'),
(4, 'customer b', 'bom #2b'),(5, 'customer b', 'bom #2a')
;

BEGIN
    DECLARE currentIdx INT; 
    SET currentIdx = 1;

    PRINT(currentIdx);

    WHILE currentIdx <= 10000 LOOP
        INSERT INTO mod_dates (build_id, mod_date) VALUES (currentIdx % 10, DATEADD(day, (ABS(RAND()) * 500), '2015-01-01'));
        SET currentIdx = currentIdx + 1
    END LOOP
END;

INSERT INTO mod_dates (build_id, mod_date) VALUES (1, '2999-01-01'); --this should be returned as the max


--now get the max mod date
SELECT max_mod_date FROM
(SELECT DISTINCT
FIRST_VALUE(build_id ) OVER (PARTITION BY build_customer ORDER BY build_bom_id DESC ) AS build_id
FROM my_build_ids
) build_ids

LEFT JOIN

(SELECT build_id, MAX(mod_date) As max_mod_date
FROM mod_dates
GROUP BY build_id
) TimeInPhase
ON build_ids.build_id = TimeInPhase.build_id
WHERE build_ids.build_id = 1
OPTION (max_query_tasks=2) --setting this to 2 or less makes this a deterministic query
;

...