1 В избранное 0 Ответвления 0

OSCHINA-MIRROR/guanguans-soar-php

Присоединиться к Gitlife
Откройте для себя и примите участие в публичных проектах с открытым исходным кодом с участием более 10 миллионов разработчиков. Приватные репозитории также полностью бесплатны :)
Присоединиться бесплатно
Клонировать/Скачать
Внести вклад в разработку кода
Синхронизировать код
Отмена
Подсказка: Поскольку Git не поддерживает пустые директории, создание директории приведёт к созданию пустого файла .keep.
Loading...
README.md

soar-php

[!NOTE] Разработан оптимизатор и перезаписывающий модуль SQL (ассистированная настройка SQL) на основе soar от Xiaomi.

简体中文 | ENGLISH

tests check & fix styling codecov Total Downloads Latest Stable Version License

Требования

  • PHP >= 7.3
  • ext-json
  • ext-mbstring

Используется в фреймворке

Установка

composer require guanguans/soar-php -v

Использование

Быстрый старт
<?php

require __DIR__.'/vendor/autoload.php';

use Guanguans\SoarPHP\Soar;

// Быстро создаём экземпляр soar
$soar = Soar::create();

/**
 * Создаём пользовательский экземпляр soar
 * Опции @see examples/soar.options.example.php
 */
$soar = Soar::create(
    [
        // 测试环境数据库配置.
        '-test-dsn'    => [
            'host'     => '127.0.0.1',
            'port'     => '3306',
            'dbname'   => 'laravel',
            'username' => 'root',
            'password' => 'root',
            'disable'  => false,
        ],
        // 日志输出位置 (default "soar.log").
        '-log-output'  => __DIR__.'/logs/soar.log',
        // 优化建议输出格式,目前支持: json, text, markdown, html等 (default "markdown").
        '-report-type' => 'json',
    ],
    '自定义的 soar 路径'
);

// Final run: /Users/yaozm/Documents/develop/soar-php/bin/soar.darwin-amd64 '-version=true'
$soar->clone() // Клонируем soar и избегаем возможности манипулировать исходным soar.
    ->addVersion(true) // Добавляем значение -version опции `true`
    ->addVerbose(true) // Добавляем значение -verbose опции `true`
    ->removeVersion()  // Удаляем опцию -version
    ->setVersion(true) // Устанавливаем значение -version опции `true`
    ->mergeVersion(true) // Объединяем значение -version опции `true`
    ->onlyVersion() // Сохраняем только опцию -version
    ->dump() // Выводим отладочную информацию
    ->run(); // Запускаем
:warning: При запуске в ОС unix не в среде cli может возникнуть ошибка `Fatal error: ...Exit Code: 2(Misuse of shell builtins)...`
// Fatal error: Uncaught Guanguans\SoarPHP\Exceptions\ProcessFailedException: The command "'/Users/yaozm/Documents/develop/soar-php/bin/soar.darwin-amd64' '-report-type=json' '-query=select * from users;'" failed. Exit Code: 2(Misuse of shell builtins) Working directory: /Users/yaozm/Documents/develop/soar-php Output: ================ Error Output: ================ panic: runtime error: invalid memory address or nil pointer dereference [signal SIGSEGV: segmentation violation code=0x1 addr=0x0 pc=0x1938665] goroutine 1 [running]: github.com/pingcap/tidb/util/memory.MemTotalNormal() pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210601085537-5d7c852770eb/util/memory/meminfo.go:41 +0x65 github.com/pingcap/tidb/util/memory.init.0() pkg/mod/github.com/pingcap/tidb@v1.1.0-beta.0.20210601085537-5d7c852770eb/util/memory/meminfo.go:134 +0x175 in
``` ```
/Users/yaozm/Documents/develop/soar-php/src/Concerns/WithRunable.php:36 Stack trace: #0 /Users/yaozm/Documents/develop/soar-php/test.php(163): Guanguans\SoarPHP\Soar->run() #1 /User in /Users/yaozm/Documents/develop/soар-php/src/Concerns/WithRunable.php on line 36
$soar->setSudoPassword('your sudo password'); // Set a sudo password to run the soar command with sudo to avoid the above errors.
</details>
<details>
    <summary><b>SQL Scores (SQL fingerprint, Score, Explain interpretation, Heuristic rule suggestions, Index rule suggestions)</b></summary>

    ```php
    $sqls = <<<'sql'
    SELECT * FROM users;
    SELECT DATE_FORMAT (t.last_update,'%Y-%m-%d'),COUNT (DISTINCT (t.city)) FROM city t WHERE t.last_update> '2018-10-22 00:00:00' AND t.city LIKE '%Chrome%' AND t.city='eip' GROUP BY DATE_FORMAT(t.last_update,'%Y-%m-%d') ORDER BY DATE_FORMAT(t.last_update,'%Y-%m-%d');
    DELETE city FROM city LEFT JOIN country ON city.country_id=country.country_id WHERE country.country IS NULL;
    UPDATE city INNER JOIN country ON city.country_id=country.country_id INNER JOIN address ON city.city_id=address.city_id SET city.city='Abha',city.last_update='2006-02-15 04:45:25',country.country='Afghanistan' WHERE city.city_id=10;
    INSERT INTO city (country_id) SELECT country_id FROM country;
    REPLACE INTO city (country_id) SELECT country_id FROM country;
    ALTER TABLE inventory ADD INDEX `idx_store_film` (`store_id`,`film_id`),ADD INDEX `idx_store_film` (`store_id`,`film_id`),ADD INDEX `idx_store_film` (`store_id`,`film_id`);
    DROP TABLE `users`;
    CREATE TABLE `users` (
      `id` bigint unsigned NOT NULL AUTO_INCREMENT,
      `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `email_verified_at` timestamp NULL DEFAULT NULL,
      `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
      `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
      `created_at` timestamp NULL DEFAULT NULL,
      `updated_at` timestamp NULL DEFAULT NULL,
      PRIMARY KEY (`id`),
      UNIQUE KEY `users_email_unique` (`email`)
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
    sql;

    $soar->scores($sqls);
    $soar->htmlScores($sqls);
    $soar->markdownScores($sqls);
    $soar->arrayScores($sqls);
    $soar->jsonScores($sqls);
```php
array:9 [
    0 => array:8 [
        "ID" => "30AFCB1E1344BEBD",
        "Fingerprint" => "select * from users",
        "Score" => 80,
        "Sample" => "SELECT * FROM users",
        "Explain" => array:1 [
            0 => array:6 [
                "Item" => "EXP.000",
                "Severity" => "L0",
                "Summary" => "Объяснить информацию",
                "Content" => """
                    | id | select_type | table | partitions | type | possible_keys | key | key_len | ref | rows | filtered | scalability | Extra |
                    |---|---|---|---|---|---|---|---|---|---|---|---|---|
                    | 1  | SIMPLE | *users* | NULL | ALL | NULL | NULL | NULL | NULL | 1 | ☠️ **100.00%** | ☠️ **O(n)** | NULL |
                    \n
                    """,
                "Case" => """
                    ### Объяснить информацию для интерпретации\n
                    \n
                    #### SelectType информация для интерпретации\n
                    \n
                    * **SIMPLE**: простой SELECT (не используется UNION или подзапрос и т. д.).\n
                    \n
                    #### Type информация для интерпретации\n
                    \n
                    * ☠️ **ALL**: в худшем случае, полное сканирование таблицы.\n
                    """
                "Position" => 0
            ]
        ],
        "HeuristicRules" => array:1 [
            0 => array:6 [
                "Item" => "CLA.001",
                "Severity" => "L4",
                "Summary" => "Самый внешний слой SELECT не указывает условие WHERE",
                "Content" => "В запросе SELECT нет предложения WHERE, возможно, будет проверено больше строк (полное сканирование таблицы). Для запросов типа SELECT COUNT(*) если точность не требуется, рекомендуется использовать SHOW TABLE STATUS или EXPLAIN вместо.",
                "Case" => "выберите идентификатор из tbl",
                "Position" => 0
            ]
        ],
        "IndexRules" => null,
        "Tables" => array:1 ["`laravel`.`users`"]
    ]
    1 => array:8 [
        "ID" => "23D3498A40F9900D",
        "Fingerprint" => "select date_format (t.last_update,?),count (distinct (t.city)) from city t where t.last_update> ? and t.city like ? and t.city=? group by date_format(t.last_update,?) order by date_format(t.last_update,?)",
        "Score" => 0,
        "Sample" => "SELECT DATE_FORMAT (t.last_update,'%Y-%m-%d'),COUNT (DISTINCT (t.city)) FROM

В запросе присутствуют фрагменты кода на языке PHP. В переводе могут быть неточности, связанные с интерпретацией синтаксиса языка. **Запрос 1:**

SELECT * FROM city t WHERE t.last_update > '2018-10-22 00:00:00' AND t.city LIKE '%Chrome%' AND t.city='eip' GROUP BY DATE_FORMAT(t.last_update,'%Y-%m-%d') ORDER BY DATE_FORMAT(t.last_update, '%Y-%m-%d');

**Запрос 2:**

DELETE city FROM city LEFT JOIN country ON city.country_id=country.country_ID WHERE country.country IS NULL;

*Примечание: в запросе 2 не удалось перевести часть текста из-за отсутствия контекста.* ```
laravel.country
]
  ]
  3 => массив:8 [
    "ID" => "67B0C3CE9FA26F37"
    "Fingerprint" => "обновить город внутреннее соединение страна на город.страна_ид=страна.страна_ид внутреннее соединение адрес на город.город_ид=адрес.город_ид установить город.город=?,город.последнее_обновление=?,страна.страна=? где город.город_ид="
    "Score" => 80
    "Sample" => "ОБНОВИТЬ город ВНУТРЕННЕЕ СОЕДИНЕНИЕ страна НА город.страна_id=страна.страна_id ВНУТРЕННЕЕ СОЕДИНЕНИЕ адрес НА город.город_id=адрес.город_id УСТАНОВИТЬ город.город='Абха',город.последнее_обновление='2006-02-15 04:45:25',страна.страна='Афганистан' ГДЕ город.город_id="
    "Explain" => null
    "HeuristicRules" => массив:1 [
      0 => массив:6 [
        "Item" => "JOI.007"
        "Severity" => "L4"
        "Summary" => "Не рекомендуется использовать многотабличное удаление или обновление"
        "Content" => "Когда необходимо удалить или обновить несколько таблиц одновременно, рекомендуется использовать простые операторы. В одном операторе SQL можно удалять или обновлять только одну таблицу. Старайтесь избегать использования нескольких операций в одном операторе."
        "Case" => "UPDATE users u LEFT JOIN hobby h ON u.id = h.uid SET u.name = 'pianoboy' WHERE h.hobby = 'piano';"
        "Position" => 0
      ]
    ]
    "IndexRules" => null
    "Tables" => массив:3 [
      0 => "`laravel`.`address`"
      1 => "`laravel`.`city`"
      2 => "`laravel`.`country`"
    ]
  ]
  4 => массив:8 [
    "ID" => "3656B13CC4F888E2"
    "Fingerprint" => "вставить в город (страна_ид) выбрать страна_ид из страны"
    "Score" => 65
    "Sample" => "ВСТАВИТЬ В город (страна_ид) ВЫБРАТЬ страна_ид ИЗ страны"
    "Explain" => null
    "HeuristicRules" => массив:2 [
      0 => массив:6 [
        "Item" => "CLA.001"
        "Severity" => "L4"
        "Summary" => "Во внешнем SELECT не указано условие WHERE"
        "Content" => "SELECT не имеет условия WHERE, возможно, будет проверено больше строк, чем ожидалось (полное сканирование таблицы). Для запросов типа SELECT COUNT(*) рекомендуется использовать SHOW TABLE STATUS или EXPLAIN вместо этого, если точность не требуется."
        "Case" => "select id from tbl"
        "Position" => 0
      ]
      1 => массив:6 [
        "Item" => "LCK.001"
        "Severity" => "L3"
        "Summary" => "INSERT INTO xx SELECT с блокировкой на слишком высоком уровне, будьте осторожны"
        "Content" => "INSERT INTO xx SELECT с блокировкой на слишком высоком уровне, будьте осторожны"
        "Case" => "INSERT INTO tbl SELECT * FROM tbl2;"
        "Position" => 0
      ]
    ]
    "IndexRules" => null
    "Tables" => массив:2 [
      0 => "`laravel`.`city`"
      1 => "`laravel`.`country`"
    ]
  ]
  5 => массив:8 [
    "ID" => "E3DDA1A929236E72"
    "Fingerprint" => "заменить на город (страна_ид) выбрать страна_ид из страны"
    "Score" => 65
    "Sample" => "ЗАМЕНИТЬ НА город (страна_ид) ВЫБЕРИТЕ страна_ид ИЗ страны"
    "Explain" => null
    "HeuristicRules" => массив:2 [
      0 => массив:6 [
        "Item" => "CLA.001"
        "Severity" => "L4"
        "Summary" => "Во внешнем SELECT не указано условие WHERE"
        "Content" => "SELECT не имеет условия WHERE, возможно, будет проверено больше строк, чем ожидалось (полное сканирование таблицы). Для запросов типа SELECT COUNT(*) рекомендуется использовать SHOW TABLE STATUS или EXPLAIN вместо этого, если точность не требуется."
        "Case" => "select id from tbl"
        "Position" => 0
      ]
      1 => массив:6 [
        "Item" => "LCK.001"
        "Severity" => "L3"
        "Summary" => "INSERT INTO xx SELECT с блокировкой на слишком высоком уровне, будьте осторожны"
        "Content" => "INSERT INTO xx SELECT с блокировкой на слишком высоком уровне, будьте осторожны"
        "Case" => "INSERT INTO tbl SELECT * FROM tbl2;"
        "Position" => 0
      ]
    ]
    "IndexRules" => null
    "Tables" => массив:2 [
      0 => "`laravel`.`city`"
      1 => "`laravel`.`country`"
    ]
  ]
  6 => массив:8 [
    "ID" => "9BB74D074BA0727C"
    "Fingerprint" => "изменить таблицу инвентарь добавить индекс `idx_store_film` (`store_id`,`film_id`),добавить индекс `idx_store_film` (`store_id`,`film_id`),добавить индекс `idx_store_film` (`store_id`,`film_id`)"
    "Score" => 100
    "Sample" => "ИЗМЕНИТЬ ТАБЛИЦУ инвентарь ДОБАВИТЬ ИНДЕКС `idx_store_film` (`store_id`,`film_id`),ДОБАВИТЬ ИНДЕКС `idx_store_film` (`store_id`,`film_id`),ДОБАВИТЬ ИНДЕКС `idx_store_film` (`store_id`,`film_id`)"
    "Explain" => null
    "HeuristicRules" => массив:1 [
      0 => массив:6 [
        "Item" => "KEY.004"
        "Severity" => "L0"
        "Summary" => "Напоминание: пожалуйста, сопоставьте порядок свойств индекса с запросом"
        "Content" => "Если вы создаёте составной индекс для столбца, убедитесь, что порядок атрибутов совпадает с порядком запроса, чтобы СУБД могла использовать индекс при обработке запроса. Если порядок атрибутов запроса и индекса не совпадает, СУБД может не использовать индекс во время обработки запроса."
        "Case" => "create index idx1 on tbl (last_name,first_name)"
        "Position" => 0
      ]
    ]
    "IndexRules" => null
    "Tables" => массив:1 [
      0 => "`laravel`.`inventory`"
    ]
  ]
  7
``` => array:8 [
    "ID" => "C77607894B4EFCC6"
    "Fingerprint" => "drop table `users`"
    "Score" => 100
    "Sample" => "DROP TABLE `users`"
    "Explain" => null
    "HeuristicRules" => array:1 [
      0 => array:6 [
        "Item" => "SEC.003"
        "Severity" => "L0"
        "Summary" => "При использовании DELETE/DROP/TRUNCATE и других подобных операций рекомендуется делать резервную копию данных"
        "Content" => "Перед выполнением опасных операций необходимо сделать резервную копию данных."
        "Case" => "delete from table where col = 'condition'"
        "Position" => 0
      ]
    ]
    "IndexRules" => null
    "Tables" => array:1 [
      0 => "`laravel`.`users`"
    ]
  ]
  8 => array:8 [
    "ID" => "D0870E395F2CA834"
    "Fingerprint" => "create table `users` ( `id` bigint unsigned not null auto_increment, `name` varchar(?) collate utf8mb4_unicode_ci not ?, `email` varchar(?) collate utf8mb4_unicode_ci not ?, `email_verified_at` timestamp ? default ?, `password` varchar(?) collate utf8mb4_unicode_ci not ?, `remember_token` varchar(?) collate utf8mb4_unicode_ci default ?, `created_at` timestamp ? default ?, `updated_at` timestamp ? default ?, primary key (`id`), unique key `users_email_unique` (`email`) ) engine=innodb default charset=utf8mb4 collate=utf8mb4_unicode_ci"
    "Score" => 75
    "Sample" => """
      CREATE TABLE `users` (\n
        `id` bigint unsigned NOT NULL AUTO_INCREMENT,\n
        `name` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n
        `email` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n
        `email_verified_at` timestamp NULL DEFAULT NULL,\n
        `password` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,\n
        `remember_token` varchar(100) COLLATE utf8mb4_unicode_ci DEFAULT NULL,\n
        `created_at` timestamp NULL DEFAULT NULL,\n
        `updated_at` timestamp NULL DEFAULT NULL,\n
        PRIMARY KEY (`id`),\n
        UNIQUE KEY `users_email_unique` (`email`)\n
      ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
      """
    "Explain" => null
    "HeuristicRules" => array:7 [
      0 => array:6 [
        "Item" => "CLA.011"
        "Severity" => "L1"
        "Summary" => "Рекомендуется добавлять комментарии к таблицам"
        "Content" => "Добавление комментариев к таблицам делает их более понятными и облегчает дальнейшее обслуживание."
        "Case" => "CREATE TABLE `test1` (`ID` bigint(20) NOT NULL AUTO_INCREMENT,`c1` varchar(128) DEFAULT NULL,PRIMARY KEY (`ID`)) ENGINE=InnoDB DEFAULT CHARSET=utf8"
        "Position" => 0
      ],
      1 => array:6 [
        "Item" => "COL.004"
        "Severity" => "L1"
        "Summary" => "Следует добавить значения по умолчанию для столбцов"
        "Content" => "Добавьте значения по умолчанию для столбцов. Если вы изменяете таблицу с помощью команды ALTER, не забудьте указать старые значения по умолчанию."
        "Case" => "CREATE TABLE tbl (col int) ENGINE=InnoDB;"
        "Position" => 0
      ],
      2 => array:6 [
        "Item" => "COL.005"
        "Severity" => "L1"
        "Summary" => "Столбцы не имеют комментариев"
        "Content" => "Рекомендуется добавить комментарии для каждого столбца в таблице, чтобы объяснить его назначение и роль."
        "Case" => "CREATE TABLE tbl (col int) ENGINE=InnoDB;"
        "Position" => 0
      ],
      3 => array:6 [
        "Item" => "COL.011"
        "Severity" => "L0"
        "Summary" => "Используйте NULL только при необходимости уникальных значений, используйте NOT NULL только если столбец не может быть пустым"
        "Content" => "NULL и 0 — это разные вещи. 10 * NULL также равно NULL. NULL и пустая строка — это тоже разные вещи. Объединение строки с NULL в стандартном SQL также приводит к NULL. NULL и FALSE также различны. Операции AND, OR и NOT с участием NULL могут вызвать путаницу у многих людей. Когда вы объявляете столбец как NOT NULL, это означает, что каждое значение в этом столбце должно существовать и иметь смысл."
        "Use NULL to represent a missing value of any type. When you declare a column as NOT NULL, it means that every value in that column must exist and be meaningful."
        "Case" => "select c1,c2,c3 from tbl where c4 is null or c4 <> 1"
        "Position" => 49
      ],
      4 => array:6 [
        "Item" => "KWR.003"
        "Severity" => "L1"
        "Summary" => "Не рекомендуется использовать множественное число для имен столбцов или таблиц"
        "Content" => "Имя таблицы должно отражать содержание таблицы, а не количество элементов. Это соответствует практике именования классов DO, которые также используются в единственном числе."
        "Case" => "CREATE TABLE tbl ( `books` int )"
        "Position" => 0
      ],
      5 => array:6 [
        "Item" => "SEC.002"
        "Severity" => "L0"
        "Summary" => "Избегайте хранения паролей в открытом виде"
        "Content" => "Хранение паролей или передача их в открытом виде по сети небезопасны. Если злоумышленник сможет перехватить ваш SQL-запрос, который вставляет пароль, он сможет получить доступ к нему напрямую. Кроме того, вставка пользовательского ввода в виде строки в чистый SQL-запрос также может раскрыть его злоумышленнику. Если вы можете прочитать пароль, то и злоумышленник может. Решение состоит в использовании односторонней хэш-функции для шифрования исходного пароля. Хеширование — это процесс преобразования входной строки в другую, нечитаемую строку. Добавьте случайную строку к хешу пароля, чтобы предотвратить атаки по словарю."
        "Do not insert plaintext passwords into SQL queries. Calculate the hash in your application code and use the hash in SQL queries."
        "Case" => "create table test(id" ```
int name varchar(20) not null, password varchar(200)not null)
Position => 0
]
6 => array:6 [
Item => "STA.003"
Severity => "L1"
Summary => "Индекс не соответствует стандартам именования"
Content => "Рекомендуется использовать префикс idx_ для обычных вторичных индексов и префикс uk_ для уникальных индексов."
Case => "select col from now where type!=0"
Position => 0
]
]
IndexRules => null
Tables => array:1 [
0 => "`laravel`.`users`"
]

soar help

$soar->help()

Использование /Users/yaozm/Documents/develop/soar-php/bin/soar.darwin-amd64:

Параметр Описание
-allow-charsets string Разрешённые наборы символов (по умолчанию «utf8, utf8mb4»)
-allow-collates string Разрешённые параметры сортировки
-allow-drop-index Разрешить вывод рекомендаций по удалению повторяющихся индексов
-allow-engines string Разрешённые механизмы хранения данных (по умолчанию innodb)
-allow-online-as-test Разрешить использование онлайн-среды в качестве тестовой
-blacklist string Указать расположение файла конфигурации чёрного списка, SQL в котором не будет проверяться. В файле каждая строка представляет собой один SQL-запрос, который может быть отпечатком пальца или регулярным выражением
-check-config Проверить конфигурацию
-cleanup-test-database Очистить тестовую базу данных за последний час после однократного запуска
-column-not-allow-type string Тип столбца, который не разрешён (по умолчанию boolean)
-config string Путь к файлу конфигурации
-delimiter string Разделитель SQL (по умолчанию ";")
-drop-test-temporary Удалить временные таблицы в тестовой среде (по умолчанию true)
-dry-run Выполнить в предэксплуатационной среде (по умолчанию true)
-explain Включить анализ плана выполнения Explain (по умолчанию true)
-explain-format string Формат объяснения [json, традиционный] (по умолчанию традиционный)
-explain-max-filtered float Предупреждение при превышении filtered (по умолчанию 100)
-explain-max-keys int Максимальное значение key_len (по умолчанию 3)
-explain-max-rows int Максимальное количество строк предупреждения (по умолчанию 10 000)
-explain-min-keys int Минимальное значение possible_keys предупреждения
-explain-sql-report-type string Тип отчёта Explain [pretty, sample, fingerprint] (по умолчанию pretty)
-explain-type string Тип объяснения [расширенный, разделы, традиционный] (по умолчанию расширенный)
-explain-warn-access-type string Типы доступа, которые не рекомендуется использовать (по умолчанию ALL)
-explain-warn-extra string Дополнительная информация, которая вызовет предупреждение (по умолчанию Using temporary, Using filesort)
-explain-warn-scalability string Список предупреждений о сложности, поддерживающий O(n), O(log n), O(1), O(?) (по умолчанию O(n))
-explain-warn-select-type string Не рекомендуемые типы select_type
-ignore-rules string Игнорируемые правила оптимизации (по умолчанию COL.011)
-index-prefix string Префикс индекса (по умолчанию idx_)
-list-heuristic-rules Вывести список поддерживаемых правил проверки
-list-report-types Вывести поддерживаемые типы отчётов
-list-rewrite-rules Вывести список поддерживаемых правил перезаписи
-list-test-sqls Вывести тестовые случаи для тестирования
-log-level int Уровень журнала, уровень журнала [0: Emergency, 1: Alert, 2: Critical, 3: Error, 4: Warning, 5: Notice, 6: Informational, 7: Debug] (по умолчанию 3)
-log-output string Расположение вывода журнала (по умолчанию soar.log)
-log_err_stacks Регистрировать трассировки стека ошибок
-log_rotate_max_size uint Размер в байтах, при котором журналы поворачиваются (glog.MaxSize) (по умолчанию 188 743 6800)
-markdown-extensions int MarkdownExtensions, поддержка расширений пакета markdown, см. blackfriday (по умолчанию 94)
-markdown-html-flags int MarkdownHTMLFlags, поддержка флага markdown для преобразования в html, см. blackfriday
-max-column-count int Максимально допустимое количество столбцов в одной таблице (по умолчанию 40)
-max-distinct-count int Максимальное количество Distinct в одном SQL (по умолчанию 5)
-max-group-by-cols-count int Максимальное количество столбцов GroupBy в одном SQL (по умолчанию 5)
-max-in-count int Максимальное количество IN() (по умолчанию 10)
-max-index-bytes int Общий предел длины индекса (по умолчанию 3072)
-max-index-bytes-percolumn int Максимальный размер индекса в байтах на столбец (по умолчанию 767)
-max-index-cols-count int Максимальное количество столбцов в составном индексе (по умолчанию 5)
-max-index-count int Максимальное количество индексов в одной таблице (по умолчанию 10). Этот проект соответствует спецификации all-contributors. Приветствуются любые вклады!

Лицензия

Лицензия MIT. Дополнительную информацию смотрите в файле лицензии.

Комментарии ( 0 )

Вы можете оставить комментарий после Вход в систему

Введение

Оптимизатор и рерайтер SQL. — Оптимизатор, рерайтер SQL (вспомогательный инструмент для оптимизации SQL). Развернуть Свернуть
MIT
Отмена

Обновления

Пока нет обновлений

Участники

все

Недавние действия

Загрузить больше
Больше нет результатов для загрузки
1
https://api.gitlife.ru/oschina-mirror/guanguans-soar-php.git
git@api.gitlife.ru:oschina-mirror/guanguans-soar-php.git
oschina-mirror
guanguans-soar-php
guanguans-soar-php
master