2016-08-22 10 views
0

私は一度に任意のデータベースから1000レコードを読み込もうとしています。私は列の名前と列の型がわからないと仮定しているので、テーブル内の最初の列を選択してORDER BYを実行します。 ORDER BYを使用してテーブルのどのテーブルを選択するかは重要ですか?私はデータベースの内容があまりよくなく、今は学んでいます。良い列を選択するとクエリの実行がスピードアップされ、結果セットが返される場合は、どのタイプを探してください。データソースの任意の列でSQL ORDER BY句を使用できますか?

マイコード:

if (SQLServerDatabase) { 

    String query = "SELECT * FROM "+tablename+" ORDER BY "+columnnames.get(0)+" OFFSET "+offset+" ROWS FETCH NEXT "+size+" ROWS ONLY;"; 

    rs = stmt.executeQuery(query); 

} else if (MySQLDatabase) { 

    String query = "SELECT * FROM "+tablename+" LIMIT "+offset+", "+size+";"; 

    rs = stmt.executeQuery(query); 

} 

注:れる列名リスト

+1

BY ORDERが他人に遅い、インデックス付きの列に高速です。最初の列は、常にそうとは限りませんが、多くの場合、プライマリキーです。 – jarlh

+6

注文に任意の未知の列を使用した場合のパフォーマンスの問題は別として、これはまったく意味がありますか?なぜそれを知っていないのですか? –

+2

質問は、あなたが何を注文しているのかわからないときは、結果をすべて注文すると便利ですか? –

答えて

2

は、私が最初にプライマリキーの名前を取得し、その上でORDER BYを行うことをお勧めです。

この回答は適切な方向に指摘する必要があります。 SQL Server: Get table primary key using sql query

ただし、あなたが行っていることは、重複するレコードを取得しないことを保証するものではありません。たとえば、レコードを1から1,000、任意のオーダーに基づいて要求し、その間に別のレコードがテーブルに挿入されている場合は、最初の1,000になります。レコード1,001〜2,000を要求すると、レコード1,001はレコード1000と同じです。

+0

ちなみに、私はこのソリューションではここでsetAutoCommit(false)を使用します。それが良い考えであるかどうかは分かりません。 –

0

ORDER BY句で有効な式を使用できると思います。

あなたは、たとえば、ORDER BYでの表現として(SELECT NULL)を使用することができ、注文を気にしない場合:

SELECT * FROM mytable ORDER BY (SELECT NULL) OFFSET 20 ROWS FETCH NEXT 20 ROWS ONLY 

クエリが同じで行を返すという保証はありませんその実行ごとに注文する。 "ページング"を実装するためにこれを行っている場合は、いくつかの行を見逃す(スキップする)可能性があり、後続の実行で同じ行を返す可能性もあります。

0

事前に特定できない列による並べ替えの有用性については、誰もが疑問に思います。これは、最初の列が重複を許可する可能性があるため、結果はその最初の列の各別個の値内でまだソートされていないので、特に当てはまります。

これらのことは誰も言及していません。クエリの最初の列で並べ替える場合は、実際に最初の列の名前を特定する必要はありません。あなたはORDER BY 1と書いてください。

例えば、

CREATE TABLE test_sort (a number, b date, c varchar2(30)); 

INSERT INTO test_sort VALUES (1, SYSDATE - 1, 'GGGG'); 
INSERT INTO test_sort VALUES (2, SYSDATE + 4, 'QQQQ'); 
INSERT INTO test_sort VALUES (3, SYSDATE - 7, 'ZZZZ'); 
INSERT INTO test_sort VALUES (4, SYSDATE - 12, 'BBBB'); 

SELECT a, b, c FROM test_sort 
ORDER BY 1; 

SELECT b, c, a FROM test_sort 
ORDER BY 1; 

SELECT c, a, b FROM test_sort 
ORDER BY 1; 
関連する問題