{}const=>[]async()letfn</>var
開発1C

1C で重いクエリを高速化する方法:一般的なエラーの分析

1Cの遅いクエリを高速に変換しましょう!最適化の実践ガイド:インデックス、仮想テーブル、接続の正しい使い方を学びます。理論はありません。今すぐ適用できるコード例を使用した実用的なテクニックのみです。

К

Kodik

著者

1分で読める

1Cで大量のデータを扱うことは、遅かれ早かれすべての開発者が直面する試練です。テスト データベースで即座に実行されるクエリは、本番環境では数分間実行される可能性があります。典型的なミスを見て、それらを避ける方法を学びましょう。

ミス #1:正確な条件の代わりに「同様の」を使用する。

多くの初心者開発者は、特に文字列内で何かを見つける必要がある場合に、LIKE演算子を乱用します。

悪い点:

Номенклатура.Наименование ПОДОБНО "%Bolt%"

良い:

Номенклатура.Артикул = "12345"

LIKE演算子は、インデックスを無視して、DBMSにテーブル全体をスキャンさせます。完全一致または行の先頭を使用できる場合は、それを行います。サブストリング検索が避けられない場合は、少なくとも最初にパーセントを持つマスクを避けてください。

🔥 10万人以上の学生が参加中

理論を読むのに疲れた?
コーディングの時間だ!

Kodik — 実践でプログラミングを学ぶアプリ。AIメンター、インタラクティブなレッスン、実際のプロジェクト。

🤖 AI 24時間
🎓 修了証
💰 無料
🚀 始める
今日参加

ミス2:不要なフィールドを取得する。

初心者がよく犯す間違いは、必要なフィールドが 2 つか 3 つしかない場合でも、すべてのフィールドを選択してしまうことです。

悪い点:

ВЫБРАТЬ
    *
ИЗ
    Справочник.Контрагенты

良い:

ВЫБРАТЬ
    Контрагенты.Ссылка,
    Контрагенты.Наименование,
    Контрагенты.ИНН
ИЗ
    Справочник.Контрагенты

余分なデータを選択すると、ネットワークとメモリへの負荷が増加します。これは、値の保存タイプのフィールドにとって特に重要です。これらのフィールドには、メガバイト単位のデータが含まれる可能性があります。

ミス No. 3:選択条件にインデックスがない。

特定のフィールドでデータを頻繁にフィルタリングするものの、そのフィールドのインデックスを作成するのを忘れた場合は、動作が遅くなることを覚悟してください。

WHERE条件と接続で使用しているフィールドを確認してください。これらのフィールドにはインデックスを作成する必要があります。コンフィギュレータでは、[インデックス]フラグを設定して、プロパティを介してこれを行います。

重要: クエリで実際に使用されているもののみをインデックス化します。インデックスが多すぎると、書き込み操作が遅くなります。

ミス #4:接続の代わりにネストされたクエリ。

開発者は、SELECT 内のサブクエリを介して関連データを取得しようとすることがあります。

悪い点:

ВЫБРАТЬ
    Документы.Номер,
    (ВЫБРАТЬ Контрагенты.Наименование 
     ИЗ Справочник.Контрагенты КАК Контрагенты
     ГДЕ Контрагенты.Ссылка = Документы.Контрагент)

良い:

ВЫБРАТЬ
    Документы.Номер,
    Контрагенты.Наименование
ИЗ
    Документ.РеализацияТоваров КАК Документы
    ЛЕВОЕ СОЕДИНЕНИЕ Справочник.Контрагенты КАК Контрагенты
    ПО Документы.Контрагент = Контрагенты.Ссылка

ネストされたクエリは、結果の各行に対して実行されます。接続は、DBMSオプティマイザによってはるかに効率的に処理されます。

ミス 5: 仮想テーブルを無視する。

1Cは、残高、売上高、その他のデータスライスを処理するための強力な仮想テーブルを提供します。多くの初心者はこれを手動で計算しようとします。

悪い点: 伝票の回転を通じた残高の自己計算

良い:

ВЫБРАТЬ
    Остатки.Номенклатура,
    Остатки.КоличествоОстаток
ИЗ
    РегистрНакопления.ТоварыНаСкладах.Остатки КАК Остатки

仮想テーブルはプラットフォーム開発者によってすでに最適化されており、特別なキャッシュメカニズムを使用しています。

ミス 6: 記録数に制限がない。

フォームにデータを表示するときは、常にレコードの数を制限してください。

ВЫБРАТЬ ПЕРВЫЕ 1000
    // クエリフィールド

これは、レポートやリストの場合に特に重要です。ユーザーが一度に10万行を見る必要があることはめったにありませんが、パフォーマンスは大きく低下します。

ミス 7: 条件に複雑な表現を使用する。

WHERE条件のフィールドに関数を適用する場合、インデックスは使用されません。

悪い点:

ГДЕ ГОД(Документ.Дата) = 2024

良い:

ГДЕ Документ.Дата МЕЖДУ &НачалоПериода И &КонецПериода

期間のパラメータはクライアント側で一度計算され、クエリ自体は日付インデックスを使用できます。

ミス 8: ループ内でデータベースに複数回アクセスする。

これは、最初に要素のリストを取得し、次に各要素のループで追加のクエリを実行する場合の古典的な N+1 問題です。

悪い点:

// 書類のリストを取得しています
Для Каждого Документ Из Выборка Цикл
    // ドキュメントごとに、データベースへの新しいリクエスト
    Контрагент = ПолучитьКонтрагента(Документ);
КонецЦикла;

良い: 接続を使用してすべてを1つのクエリに結合するか、一時テーブルを使用します。

最適化のための実用的なヒント。

一時テーブルを使用する.

クエリが複雑で中間データが複数回使用される場合、一時テーブルを使用すると実行が大幅に高速化されます。

クエリプランを分析する.

エンタープライズモードで、クエリコンソールを有効にして、どのインデックスが使用され、どのインデックスが使用されていないかを調べます。

キャッシュを忘れないでください.

データによっては、毎回データベースを呼び出す必要がないように、クライアント側でキャッシュできるものもあります。

バッチ操作を使用する.

多くの小さな記録の代わりに、1つの大きなトランザクションを行います。

パフォーマンスを測定する方法は?

実際のデータ量で、実戦のような状況でクエリの実行時間を測定します。100 レコードでは高速で動作するものでも、10 万レコードでは低速になる可能性があります。

1Cテクノロジーログを使用して、遅いクエリを検索します。特定の時間(たとえば 1 秒)より長く実行されるクエリを記録するように設定します。

結論

1C でのクエリの最適化は、1 回限りのタスクではなく、継続的な実践です。まずは簡単なことから始めましょう。必要なフィールドを明示的に指定し、インデックスを使用し、類似したクエリやネストされたクエリを避けます。これらの基本的なルールは、すでに生産性を大幅に向上させます。

万能なレシピはないことを忘れないでください。それぞれのケースで、クエリがどのように機能し、何を改善できるかを分析し、理解する必要があります。

プログラミングのスキルを磨きたいですか?

B コディケ Python、JavaScript、HTML、CSS、その他の人気テクノロジーのコースを初心者向けにご用意しています。自分のペースで学び、実際のプロジェクトを作成しましょう!

そして、私たちは素晴らしい テレグラムチャンネル プログラミングについて話し合い、経験を共有し、お互いの成長を助け合うフレンドリーなコミュニティです! 参加しよう! 🚀

🎯先延ばしをやめよう

記事は気に入った?
実践の時間だ!

Kodikでは読むだけでなく、すぐにコードを書く。理論 + 実践 = 本当のスキル。

即座に実践
🧠AIがコードを説明
🏆修了証

登録不要 • カード不要