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

ミス #1:正確な条件の代わりに「同様の」を使用する。
多くの初心者開発者は、特に文字列内で何かを見つける必要がある場合に、LIKE演算子を乱用します。
悪い点:
Номенклатура.Наименование ПОДОБНО "%Bolt%"良い:
Номенклатура.Артикул = "12345"LIKE演算子は、インデックスを無視して、DBMSにテーブル全体をスキャンさせます。完全一致または行の先頭を使用できる場合は、それを行います。サブストリング検索が避けられない場合は、少なくとも最初にパーセントを持つマスクを避けてください。
ミス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、その他の人気テクノロジーのコースを初心者向けにご用意しています。自分のペースで学び、実際のプロジェクトを作成しましょう!
そして、私たちは素晴らしい テレグラムチャンネル プログラミングについて話し合い、経験を共有し、お互いの成長を助け合うフレンドリーなコミュニティです! 参加しよう! 🚀
