データベース管理者

データベースのスキルを向上させ、コミュニティの他の人から学びたいデータベースの専門家向けのQ&A

3
クエリパフォーマンスチューニング
クエリ/ストアドプロシージャ/関数の作成が完了したら、パフォーマンスパラメータをすばやく取得する最も有益な方法は何ですか?クエリを実行し、実際の実行計画を表示しますか?もしそうなら、あなたが探しているものは何ですか?明らかにテーブル/インデックススキャンはビットヒットですが、他には何がありますか?

2
ユーザーイベントデータを保存するための適切なテクニック
データベース設計に関しては、ほとんど独学です。私はこの共通の構造に落ち着いているので、この質問を提起していますが、それが最も効率的または「業界標準」の方法であるかどうか疑問に思っています。 私が設計するほとんどのデータベースにはユーザーテーブルがあり、その後、個人の活動は別のテーブルで追跡されます。データベースの美しさはこの種の効率を備えていることを理解していますが、アクティビティテーブルは、定期的に使用するすべてのユーザーから多くのイベントをかなり迅速に収集するため、中程度のユーザー使用量で非常に迅速に巨大なテーブルになります。このように成長させるのはこのベストプラクティスですか?または、テーブルの階層、日付に基づいて、またはユーザーの量ごとに、または他の何かに基づいて異なるテーブルに分割しますか? +--------------------+ +------------------------+ | UserData | | Activity | +-=------------------+ +------------------------+ | ID (auto uint) | <--1-to-many-+ | ID (auto uint) | | UserName (text) | +--> | UserID (uint) | | Email (text) | | Timestamp (time) | | additional info... | | Type (ID to elsewhere) | …

2
インデックスに関連するNOTロジックの使用
Microsoftのデータベース開発試験70-433に関する本:Microsoft SQL Server 2008 Database Developmentによると: NOTロジックではなく先頭のワイルドカード文字のいずれも、クエリオプティマイザーがインデックスを使用して検索を最適化することを許可しません。最適なパフォーマンスを得るには、NOTキーワードと先頭のワイルドカード記号を使用しないでください。 することを取った私はそうNOT IN、NOT EXISTSなど さて、このSOの質問に関して、@ GBNが選んだ解決策は上記の声明に違反すると考えました。 どうやら、そうではありません。 だから私の質問は:なぜですか?


3
ビューのORDER BY句の代替手段は何ですか?
この質問はこのサイトにある必要がありました:) このビューを使用する場合、複数のorder byが存在する可能性があるため、ORDER BYはビューでの使用を禁止されています。 たとえばTOP 99.999999 PERCENT、この制限を回避する方法があることは知っていますが、ハッキングの方法ではなく、ベストプラクティスを知りたいと思います。 したがって、個人使用のためにデータベースにビューを作成する場合、つまりデータベースに接続し、固定およびソートされたデータのみを表示する場合、ビューを注文できない場合はどうすればよいですか? 現在、SQL Server DBには、TOPハックに関するビューがあり、よく使用していますが、間違っていると感じています。


1
PostgreSQL:TRUNCATE後にディスク領域が解放されない
私はTRUNCATEと呼ばれる巨大な(〜120Gb)テーブルを持っていますfiles: TRUNCATE files; VACUUM FULL files; テーブルサイズは0ですが、ディスク領域は解放されていません。失われたディスク容量を回収する方法はありますか? 更新: 12時間後にディスク領域が解放されましたが、何も操作しませんでした。Ubuntu 8.04サーバーを使用しています。

4
次の文字列を次の順序で並べ替える照合順序はありますか?1,2,3,6,10,10A、10B、11?
可変長の整数を含むVARCHAR列を持つデータベースがあります。私はそれらをソートして、10が1ではなく9の後に来るようにし、70Aが70の後に来るようにします。WHERE句のPATINDEX()、CTE、およびCASEステートメントでこれを行うことができました。 しかし、これが不必要な照合があるかどうか疑問に思っていました。

2
これらの2つのクエリを順番に実行すると、デッドロックが発生しますか?
これはほぼ間違いなく他の質問の原因ですが、改ざんまたは検証したい次のログに基づいて仮説があるので、2つを分ける価値があると思いました。 私の仮説では、他のデッドロックは実際には次のクエリの結果であり、innodbステータスが最新のトランザクションのみを表示するという理解に基づいて元のクエリが非表示になっています(これは正しいですか?)。 ログに基づいて、コードをチェックしたところ、次の2つのクエリが順番に実行されていることがわかりました。 db.Execute("UPDATE people SET iphone_device_id=NULL WHERE iphone_device_id=@0 AND people_id<>@1", DeviceID, m_User.people_id); // I have hard coded this query in this snippet to simplify things db.Execute("UPDATE people SET company_id = 444, name = 'Dad', password = '<pass>', temp_password = NULL, reset_password_hash = NULL, email = '<redacted>@gmail.com', phone = NULL, …


2
LNNVL正当化
LNNVLは、Oracleの組み込み関数であり、FALSEまたはUNKNOWNと評価される条件に対してTRUEを返し、TRUEと評価される条件に対してFALSEを返します。私の質問は、単にNULL値を処理するのではなく、真理条件の反対を返すことの利点は何でしょうか? たとえば、ヌルを含む可能性のあるStartCommission列とCurrentCommission列を持つEmpテーブルがあるとします。次の例では、値がnullでない行のみが返されます。 SELECT * FROM Emp WHERE StartCommission = CurrentCommission; いずれかのコミッションがnullである行を含めたい場合、次のようなことができます。 SELECT * FROM Emp WHERE StartCommission = CurrentCommission OR StartCommission IS NULL OR CurrentCommission IS NULL; この構文を短縮する関数が存在するように思われますが、LNNVLを使用すると、すべての等しくないレコードとNULLを持つすべてのレコードが返されます。 SELECT * FROM Emp WHERE LNNVL(StartCommission = CurrentCommission); これにNOTを追加すると、nullのない行のみが返されます。この場合に望ましい機能は、真の条件を真、偽の条件を偽に保ち、未知の条件を真と評価することです。ここで低ユースケースを実際に作成しましたか?不明をtrueに、trueをfalseに、falseをtrueにしたいというのは本当ですか? create table emp (StartCommission Number(3,2), CurrentCommission Number(3,2)); insert into emp values (null,null); insert …

4
列の制約(インデックス)の削除
インデックスがあるテーブルのタイプを変更するにはどうすればよいですか?空のテーブルで列を変更して型を日付時刻からvarchar(15)に変更しようとしましたが、列(インデックスであることが判明)に依存しているというエラーが表示されました。 インデックスを右クリックしてドロップをスクリプト化することで、これをローカルで簡単に回避できましたが、インデックス名にアクセスできない他のサーバーでこれを展開する必要があります。 インデックスを削除するスクリプトを作成する方法はありますか?列でそのデータ型を変更してからインデックスを読み取ることができますか?ありがとう!


5
大規模なデータセットでの時間ごとのグループ化
MS SQL 2008を使用して、250万件のレコードから平均フィールドを選択しています。各レコードは1秒を表します。MyFieldは、これらの1秒のレコードの1時間ごとの平均です。もちろん、サーバーのCPUが100%に達し、選択に時間がかかりすぎます。SQLが各リクエストでこれらのレコードをすべて選択する必要がないように、これらの平均値を保存する必要があります。何ができますか? SELECT DISTINCT CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) AS TimeStampHour, MIN([timestamp]) as TimeStamp, AVG(MyField) As AvgField FROM MyData WHERE TimeStamp > '4/10/2011' GROUP BY CONVERT(VARCHAR, [timestamp], 1)+' '+ CAST(DATEPART(Hh,[timestamp]) as VARCHAR) ORDER BY TimeStamp
12 sql-server  query 


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.