0

多くのレコードを含むフォームがあります。レコードをクリックすると、その前のレコードの詳細を含む別のフォームが表示されます。2 番目のフォームには、これらの長いクエリから入力する多くのテキストフィールドがあります。

  SELECT tb_bauteile.*, tb_bauteile.CDT AS CdtNr, tb_Fahrzeug.ID, tb_Pinnummern.Pin,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS KS_Plus,

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CDT_Plus, 

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS Pfad_Plus, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS UPfad_Plus,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS KS_Minus, 

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS CDT_Minus,

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS Pfad_Minus,

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Minus] ) AS UPfad_Minus,

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS Unterbr,

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS CDT_Unterbr,

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS Pfad_Unterbr, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Unterbrechung] ) AS UPfad_Unterbr, 

    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 

    (SELECT Fehlercodes_akt_Liste.CDT from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS CDT_Aderschl, 

    (SELECT Fehlercodes_akt_Liste.Fehlerpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Pfad_Aderschl, 

    (SELECT Fehlercodes_akt_Liste.Fehlerunterpfad from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS UPfad_Aderschl,

    (SELECT Fehlercodes_akt_Liste.F_Klasse_EU from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CLA_EU,

    (SELECT Fehlercodes_akt_Liste.F_Klasse_US from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus] ) AS CLA_US

    FROM (tb_Pinnummern INNER JOIN tb_Fahrzeug ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG) INNER JOIN tb_bauteile ON tb_Pinnummern.Bauteil = tb_bauteile.ID
    WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id]));

このフォームは非常に遅いので、改善したいのですが、必要なフィールドにインデックスを付けました。以前よりも時間が短縮されましたが、遅くなりました

各クエリを各テキストフィールド(controlelementcontent内)に配置できると思いました。

SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste Where Fehlercodes_akt_Liste.ID=[FC_Plus]

しかし、それは機能せず、データが表示されません.どういう意味ですか? それは可能ですか?私はどこで間違いを犯しましたか?

ご回答ありがとうございました

ババク

4

4 に答える 4

3

次のように、3 つの結合と 18 のサブクエリではなく、7 つの結合として元のクエリを書き直すことで、元のクエリを改善できます。

SELECT bau.*, bau.CDT AS CdtNr, fze.ID, tpi.Pin
, fpl.F_Klasse_EU AS CLA_EU , fpl.F_Klasse_US AS CLA_US
, fpl.OBD_Code AS KS_Plus, fpl.CDT AS CDT_Plus
, fpl.Fehlerpfad AS Pfad_Plus, fpl.Fehlerunterpfad AS UPfad_Plus
, fmi.OBD_Code AS KS_Minus, fmi.CDT AS CDT_Minus
, fmi.Fehlerpfad AS Pfad_Minus, fmi.Fehlerunterpfad AS UPfad_Minus
, fub.OBD_Code AS Unterbr, fub.CDT AS CDT_Unterbr
, fub.Fehlerpfad AS Pfad_Unterbr, fub.Fehlerunterpfad AS UPfad_Unterbr
, fad.OBD_Code AS Aderschl, fad.CDT AS CDT_Aderschl
, fad.Fehlerpfad AS Pfad_Aderschl, fad.Fehlerunterpfad AS UPfad_Aderschl
FROM tb_Fahrzeug                AS fze
JOIN tb_Pinnummern              AS tpi ON tpi.SG = fze.Motor_SG
JOIN tb_bauteile                AS bau ON bau.ID = tpi.Bauteil
LEFT JOIN Fehlercodes_akt_Liste AS fpl ON fpl.ID = bau.[FC_Plus]
LEFT JOIN Fehlercodes_akt_Liste AS fmi ON fmi.ID = bau.[FC_Minus]
LEFT JOIN Fehlercodes_akt_Liste AS fub ON fub.ID = bau.[FC_Unterbrechung]
LEFT JOIN Fehlercodes_akt_Liste AS fad ON fad.ID = bau.[FC_Aderschl]
WHERE fze.ID = [forms]![frm_fahrzeug]![id];

このクエリにのみ関連するインデックスの問題については、ID 列のクラスター化インデックスと tb_bauteile.SG の通常のインデックスを作成できます (MSSQL 構文と他のクラスター化インデックスがないことを前提としています)。

CREATE UNIQUE CLUSTERED INDEX idx0 ON tb_Fahrzeug (id);
CREATE INDEX idx0 ON tb_Pinnummern (SG);
CREATE UNIQUE CLUSTERED INDEX idx0 ON tb_bauteile (ID);
CREATE UNIQUE CLUSTERED INDEX idx0 ON Fehlercodes_akt_Liste (ID);

最後の考慮事項として、tb_bauteile.*ドキュメントと IO の目的で (オリジナルの) アスタリスク セレクターを使用しないことを検討してください。RDBMS のパフォーマンスの問題は、実際の環境設定に大きく依存することに注意してください。

于 2012-05-08T09:46:40.803 に答える
2

サブクエリをLEFT JOINs に変更してください。このような:

SELECT tb_bauteile.*, tb_bauteile.CDT AS CdtNr, tb_Fahrzeug.ID, tb_Pinnummern.Pin,
    Fehlercodes_akt_Liste_FC_Plus.OBD_Code AS KS_Plus,
    Fehlercodes_akt_Liste_FC_Plus.CDT AS CDT_Plus, 
    Fehlercodes_akt_Liste_FC_Plus.Fehlerpfad AS Pfad_Plus, 
    Fehlercodes_akt_Liste_FC_Plus.Fehlerunterpfad AS UPfad_Plus,
    Fehlercodes_akt_Liste_FC_Minus.OBD_Code AS KS_Minus, 
    Fehlercodes_akt_Liste_FC_Minus.CDT AS CDT_Minus,
    Fehlercodes_akt_Liste_FC_Minus.Fehlerpfad AS Pfad_Minus,
    Fehlercodes_akt_Liste_FC_Minus.Fehlerunterpfad AS UPfad_Minus,
    Fehlercodes_akt_Liste_FC_Unterbrechung.OBD_Code AS Unterbr,
    Fehlercodes_akt_Liste_FC_Unterbrechung.CDT AS CDT_Unterbr,
    Fehlercodes_akt_Liste_FC_Unterbrechung.Fehlerpfad AS Pfad_Unterbr, 
    Fehlercodes_akt_Liste_FC_Unterbrechung.Fehlerunterpfad AS UPfad_Unterbr, 
    Fehlercodes_akt_Liste_FC_Aderschl.OBD_Code AS Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.CDT AS CDT_Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.Fehlerpfad AS Pfad_Aderschl, 
    Fehlercodes_akt_Liste_FC_Aderschl.Fehlerunterpfad AS UPfad_Aderschl,
    Fehlercodes_akt_Liste_FC_Plus.F_Klasse_EU AS CLA_EU,
    Fehlercodes_akt_Liste_FC_Plus.F_Klasse_US AS CLA_US
    FROM tb_Pinnummern 
    INNER JOIN tb_Fahrzeug 
        ON tb_Pinnummern.SG = tb_Fahrzeug.Motor_SG
    INNER JOIN tb_bauteile 
        ON tb_Pinnummern.Bauteil = tb_bauteile.ID
    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Plus
        ON Fehlercodes_akt_Liste_FC_Plus.ID=tb_bauteile.[FC_Plus]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Minus
        ON Fehlercodes_akt_Liste_FC_Minus.ID=tb_bauteile.[FC_Minus]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Unterbrechung
        ON Fehlercodes_akt_Liste_FC_Unterbrechung.ID=tb_bauteile.[FC_Unterbrechung]

    LEFT JOIN Fehlercodes_akt_Liste AS Fehlercodes_akt_Liste_FC_Aderschl
        ON Fehlercodes_akt_Liste_FC_Aderschl.ID=tb_bauteile.[FC_Aderschl]


    WHERE (((tb_Fahrzeug.ID)=[forms]![frm_fahrzeug]![id]));

すべての列がどこから来ているのかわかりません。しかし、この提案が機能するようになると、本当に奇妙なサブクエリよりも速く実行されます。次のようなサブクエリを実行すると、潜在的な問題が発生する可能性があります。

SELECT
    (SELECT Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste 
     Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 
.....

そのうちの 1 つが複数の値を返すとどうなりますか? おそらく、サブクエリが複数の値を返すことはできないという例外が発生するでしょう。したがって、将来そのようなサブクエリを実行する予定がある場合。少なくともTOP 1それらの上に置きます。このような:

SELECT
    (SELECT TOP 1 Fehlercodes_akt_Liste.OBD_Code from Fehlercodes_akt_Liste 
     Where Fehlercodes_akt_Liste.ID=[FC_Aderschl] ) AS Aderschl, 
    .....

しかし、解決策としてはまだお勧めしません。それは最適化された方法ではないからです。

于 2012-05-08T08:42:57.873 に答える
1

from 句にテーブル Fehlercodes_akt_Liste を追加してみてください。

あなたはそれを4回追加する必要がありますが、現在のクエリの行ごとに18回の選択を実行するよりも優れていると思います

于 2012-05-08T08:33:11.327 に答える
0

FC_PLUS、FC_MINUS、FC_Unterbrechung などはテーブル (bauteile、Fahrzeug、Pinnummer) に表示されません。したがって、これらがサブフォームに与える単なる値である場合は、データソースでそれらを使用する必要はありません。その 1 つの SELECT ステートメントを使用するだけですデータが必要なフィールド。

于 2012-05-08T08:40:55.343 に答える