5つのテーブルのデータが必要なクエリを作成しています。 過去のDBAから、列のリストの指定とすべての列(*)を指定することは、パフォーマンス/メモリーの観点から優先されると言われました。 私はまた、データベースがFROM句にテーブルのリストがあるときに、1つのテーブル(またはビュー)を作成するためにシーンの背後でJOIN操作を実行すると言われました。FROM句のネストされたselect文?内部結合ステートメントまたは単にテーブル名ですか?
私たちは非常に初期の段階であるため、既存のデータベースのデータはほとんどありません。実際にパフォーマンスヒットを測定できるかどうかは分かりません。 私はデータベースプロではありません。私は必要なデータを得ることができます。ディレマは、どんな価格である。
追加:現時点では、私はMS SQL Server 2008 R2を使用しています。
私の質問は以下のとおりです。 :
は、以下の間、パフォーマンスの違いとその理由あります。 SELECT ...簡単にするためにtbl1、tbl2、tbl3などから? (何とか私はこれがパフォーマンスヒットかもしれないと感じている) b。 SELECT ... FROM tbl1 inner join tbl2 on ... inner join tbl3 on ...など(これはサーバーに明示的になり、パフォーマンス/メモリに保存されますか?) c。 SELECT ... FROM(tbl1からx、y、zを選択)をt1 inner join ...などとします(これはanythigを保存しますか?それとも、サーバーと私たちにとってより多くの作業を作成する余分なselect文ですか)。
もっと良い方法がありますか?
以下は、必要なデータスライスを取得する2つのクエリです。 1つはネストされたselect文を含んでいます。
標準的な書式で書かれていないか、無謀に複雑すぎると謝っています。うまくいけば解読できます。私はそれらを可能な限り整理しておくようにしています。
洞察が最も高く評価されます。 これをチェックしていただきありがとうございます。
5テーブル:のDevicePool、ユーザー、旅行、TripTracker、注文
クエリ1(もっとSELECT文):
SELECT
username,
base.devid devid,
tripstatus,
stops,
stopnumber,
[time],
[orderstatus],
[destaddress]
FROM
((
( SELECT
username,
devicepool.devid devid,
groupid
FROM
devicepool INNER JOIN users
ON devicepool.userid = users.userid
WHERE devicepool.groupid = 1
)
AS [base]
INNER JOIN
(
SELECT
tripid,
[status] tripstatus,
stops,
devid,
groupid
FROM
trips
)
AS [base2]
ON base.devid = base2.devid AND base2.groupid = base.groupid
INNER JOIN
(
SELECT
stopnumber,
devid,
[time],
MAX([time]) OVER (PARTITION BY devid) latesttime
FROM
TripTracker
)
AS [tracker]
ON tracker.devid = base.devid AND [time] = latesttime)
INNER JOIN
(
SELECT
[status] [orderstatus],
[address] [destaddress],
[tripid],
stopnumber orderstopnumber
FROM [order]
)
AS [orders]
ON orders.orderstopnumber = tracker.stopnumber)
クエリ2:
SELECT
username,
base.devid devid,
tripstatus,
stops,
stopnumber,
[time],
[orderstatus],
[destaddress]
FROM
((
( SELECT
username,
devicepool.devid devid,
groupid
FROM
devicepool INNER JOIN users
ON devicepool.userid = users.userid
WHERE devicepool.groupid = 1
)
AS [base]
INNER JOIN
trips
ON base.devid = trips.devid AND trips.groupid = base.groupid
INNER JOIN
(
SELECT
stopnumber,
devid,
[time],
MAX([time]) OVER (PARTITION BY devid) latesttime
FROM
TripTracker
)
AS [tracker]
ON tracker.devid = base.devid AND [time] = latesttime)
INNER JOIN
[order]
ON [order].stopnumber = tracker.stopnumber)
**適切なJOIN **構文 - INNER JOIN'、 'LEFT OUTER JOIN'などを使用することをお勧めします。これはa)ANSI標準であり、b)あなたがしたいことをSQLコードを読んでいる誰かにはっきりと明白であり、c)関与するテーブル間のJOIN条件を忘れて誤ってデカルト製品を導入しないでください。 –
これはSQLEXPRESSとコードから実行されます。私は現在、SQLEXPRESSをデータベースサーバーとして使用しています。それがその質問にどのように関連しているのかを教えてください。 – RoyM
私はちょうど確認しました - SQL Server 2008 R2のように見えます。もう一度更新します。 – RoyM