データベース管理者

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

2
MAXテキストまたはより具体的で小さいタイプの使用
彼らが見たとき、誰かが私が使用して見て、提案されたテーブルを作成するための私のDDLコードをレビューしてたVARCHAR(256)私がすべきことを、私は最初の名前または何のような、かなり小さいことが予想されるテキストのフィールドを常にだけ使用VARCHAR(MAX)し、リンクを使用する理由は何もなく、varchar型(最大)。私はそれを読みましたが、2005年に焦点を当てていたため、日付があり、すべてのテキストフィールドで1行あたり最大2GBを割り当てる可能性を実際に正当化するようには思われませんでした。 パフォーマンス、ストレージなどの観点から、VARCHAR(MAX)最新バージョンのSQL Serverで使用するか、より小さな特定のタイプを使用するかを決定するにはどうすればよいですか?(例:2008、2012、2014)

2
SQLの最初の標準化であるSQL-86はどこにありますか?
この質問は異なりますが、SQL-89を探すこのリクエストに似ています。 SQLの最初のドラフトには、SQL-86というラベルが付いています。多数の参照が作成されています。これはダウンロードできますか?ウィキペディアには、そのためのページすらありません。歴史的な理由で興味があります。 とも呼ばれるようです ANSI X3.135-1986 CAN / CSA Z243.47-88 ISO 9075:1987 SQL / 1 NBS FIPS 127 仕様は、ANSI技術委員会X3H2から来た期間の文書で引用されています。 webstore.ansi.orgがあることは知っていますが、X3.135-1986ドキュメントが見つかりません。ただし、Searching for でX3.168-1989利用可能な仕様をX3.135-1992見つけることはできますが、1986年の仕様を購入することはできません。both X3.168X3.135

1
インデックスを再構築するときにsort_in_tempdbを使用する場合
DWテーブルにSORT_IN_TEMPDBオプションを使用するかどうかを議論しています。私の理解では、このオプションを使用した場合、書き込みはより多くなりますが、それらはよりシーケンシャルです。SANがあります(これは時々悪名高くなっています)。この場合、書き込みの数を可能な限り制限したいと思います。tempdbは別のLUN(ディスクのセット)上にあると思います。 データファイルとtempdbファイルに十分なディスク領域があります。この場合、SORT_IN_TEMPDBを使用するメリットはありますか? 私を驚かせたのは、この回答に対するこのコメントです インデックスを再構築する場合、ソートにインデックスの2倍のスペース+ 20%が必要になります。したがって、一般に、データベース内のすべてのインデックスを再構築するには、データベース内の最大インデックスの120%のみが必要です。SORT_IN_TEMPDBを使用する場合、20%しか勝ちませんが、データファイルにはさらに100%が必要です。さらに、tempdbでsortを使用すると、データファイルに1回インデックスを書き込む代わりに、tempdbに1回書き込み、データファイルに書き込むため、IO負荷が大幅に増加します。だから、それは常に理想的ではありません。 SANの構成が遅い/構成が間違っている可能性があるため、IO負荷を絶対に増やしたくありません。 これをテストする最良の方法は何でしょうか?オプションを使用して、または使用せずにテーブルを再構築し、時間を記録するだけですか? 編集:8つのtempdbファイルがあり、それぞれ15GBです。TF 1117/1118フラグが設定されており、IFIが有効になっています。現在、sort_in_tempdbオプションを使用する場合と使用しない場合の再構築を混合しています。 ありがとう! SQL Server 2012エンタープライズ

1
シークし、パーティションテーブルでスキャンします…
Itzik Ben-Ganの PCMagでこれらの記事を読みました。 シークし、スキャンしますパートI:オプティマイザがシークを最適化しない場合、 スキャンしますパートII:昇順キー 現在、すべてのパーティションテーブルで「グループ化された最大」問題が発生しています。Itzik Ben-Ganが提供するトリックを使用して max(ID)を取得しますが、実行されない場合があります。 DECLARE @MaxIDPartitionTable BIGINT SELECT @MaxIDPartitionTable = ISNULL(MAX(IDPartitionedTable), 0) FROM ( SELECT * FROM ( SELECT partition_number PartitionNumber FROM sys.partitions WHERE object_id = OBJECT_ID('fct.MyTable') AND index_id = 1 ) T1 CROSS APPLY ( SELECT ISNULL(MAX(UpdatedID), 0) AS IDPartitionedTable FROM fct.MyTable s WHERE $PARTITION.PF_MyTable(s.PCTimeStamp) …

4
SSMSで改行を削除する方法は?
私は次のように見えるSQLを扱っています create procedure as begin asとの間の大きなギャップに注意してくださいbegin。 これらを削除するにはどうすればよいですか?SQLフォーマッターを使用しましたが、これは機能しません。
22 sql-server  ssms 

1
SQL Server Unicode / NVARCHAR文字列を絵文字または補助文字に設定するにはどうすればよいですか?
Unicodeコードポイントに基づいて特定の文字にUnicode文字列変数を設定します。 65535を超えるコードポイントを使用したいのですが、SQL Server 2008 R2データベースにはの照合順序がありSQL_Latin1_General_CP1_CI_ASます。 MicrosoftのNCHARドキュメントによると、NCHAR関数は次のように整数を取ります。 integer_expression データベースの照合に補助文字(SC)フラグが含まれていない場合、これは0〜65535(0〜0xFFFF)の正の整数です。この範囲外の値を指定すると、NULLが返されます。補助文字の詳細については、照合とUnicodeサポートを参照してください。 データベースの照合が補助文字(SC)フラグをサポートしている場合、これは0〜1114111(0〜0x10FFFF)の正の整数です。この範囲外の値を指定すると、NULLが返されます。 したがって、このコード: SELECT NCHAR(128512); NULLこのデータベースに戻ります。 これと同じものを返したい: SELECT N'😀'; 照合に「補助文字(SC)フラグが含まれていない」データベースで、コードを使用して(実際の絵文字を使用せずに)Unicode文字列変数(nvarcharなど)を絵文字に設定するにはどうすればよいですか? 絵文字Unicodeコードポイントの全リスト (最終的には、すべてのキャラクターが機能するようにします。参照しやすいように絵文字を選択しました。) (サーバーはSQL Server 2008 R2ですが、それ以降のバージョンのソリューションについても興味があります。) 方法がないと仮定して、適切な照合を備えた別のデータベースのインラインユーザー定義関数を参照できますか? 「補足文字」フラグを持つ照合を見つけるにはどうすればよいですか? これにより、サーバー上のレコードは返されません。 SELECT * FROM sys.fn_helpcollations() WHERE name LIKE 'SQL%[_]SC'; 動作するSQL Server 2012が導入されLatin1_General_100_CI_AS_SCたようです。古いインスタンスに照合をインストールできますか? 照合参照: SQL Serverのchar、nchar、varchar、nvarcharの違いは何ですか? マイクロソフトの補助文字照合情報 MicrosoftのSQL Server 2008 R2照合リスト 照合に関係なく、SQL Serverが拡張文字を理解して処理できる理由についての説明はありNCHARますか?


2
このパーティションビューで無関係なテーブルをオプティマイザに強制的に削除させることはできますか?
私は大きなテーブルのさまざまなアーキテクチャをテストしていますが、私が見た提案の1つは、大きなテーブルを一連の小さな「パーティション」テーブルに分割するパーティションビューを使用することです。 1、2、3、4 このアプローチをテストする中で、あまり意味をなさない何かを発見しました。ファクトビューの「パーティション列」でフィルタリングすると、オプティマイザーは関連するテーブルのみを検索します。さらに、ディメンションテーブルのその列でフィルタリングすると、オプティマイザーは不要なテーブルを削除します。 ただし、ディメンションの他の側面でフィルタリングすると、オプティマイザーは各ベーステーブルのPK / CIを検索します。 問題のクエリは次のとおりです。 select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where o.ObservationDateKey >= 20000101 and o.ObservationDateKey <= 20051231 group by od.[Year]; select od.[Year], AvgValue = avg(ObservationValue) from dbo.v_Observation o join dbo.ObservationDates od on o.ObservationDateKey = od.DateKey where od.DateKey …

2
時系列データを保存する方法
一連の関連する値を持つ時系列データセット(間違っている場合は修正してください)と思われるものがあります。 例としては、旅行中に車をモデル化し、そのさまざまな属性を追跡します。例えば: タイムスタンプ| スピード| 走行距離| 温度| 等 Webアプリケーションがフィールドを効率的に照会して、最大、最小、および各データセットを経時的にプロットできるように、このデータを保存する最良の方法は何でしょうか? データダンプを解析し、結果をキャッシュして、保存する必要がないようにする単純なアプローチを開始しました。ただし、少し試してみたところ、このソリューションはメモリの制約のために長期的に拡張できず、キャッシュをクリアする場合は、すべてのデータを再解析および再キャッシュする必要があります。 また、データが10時間以上のデータセットというまれな可能性で毎秒追跡されると仮定すると、N秒ごとにサンプリングしてデータセットを切り捨てることが一般的に推奨されますか?

6
30,000,000行のテーブルでDELETEコマンドが完了しない
私はデータベースを継承しており、クリーンアップと高速化を目指しています。私は、30,000,000行を含むテーブルを持っています。その多くは、プログラマーに代わってエラーが原因で挿入されたジャンクデータです。最適化された新しいインデックスを追加する前に、テーブルをMyISAMからInnoDBに変換し、ジャンクデータを含む多くの行を削除しようとしています。 データベースはMySQL 5.0であり、サーバーへのルートアクセス権があります。最初にこれらのコマンドをAdminerで実行し、次にphpMyAdminで実行しましたが、どちらも同じ結果になりました。 私が実行しているコマンドは、 DELETE FROM `tablename` WHERE `columnname` LIKE '-%' 基本的に、ダッシュで始まるこの列のすべてを削除します-。 約3〜5分間実行され、プロセスリストを表示すると消えます。 それから走ります SELECT * FROM `tablename` WHERE `columnname` LIKE '-%' そして何百万もの行を返します。 削除ステートメントが完了しないのはなぜですか? PS、MySQL 5.0が古くなっていることに気付いています。私は、DBをMySQL 5.6 w InnoDB(おそらくMariaDB 10 w XtraDB)に移行する作業を行っていますが、それが起こるまでは、DBをそのまま使用して答えを探しています。 - 編集が削除されました。回答を参照してください。

2
ネットワーク上でダウンタイムの少ない巨大なSQL Serverデータベースを移行する最良の方法
問題定義 データベースサーバーを他のデータセンターに転送する必要があります。Microsoft SQL Server 2012 Enterprise(64ビット)で実行され、約2TBと1TBの2つのデータベースが含まれています。 ダウンタイムがほとんどないか、まったくないことが理想的です。 仕事量 これらのデータベースは.NET Webサイトに使用され、常に更新されています。 ただし、週末に利用できなくても問題ありません。現在使用中のDBは、新しいDBに切り替えるまで使用中の唯一のDBのままです。 この切り替えは、理想的には、DBが更新されていないことを確認しながら、新しいDBサーバーを指すようにDNSエントリを変更するだけで行われます。 また、1つのサーバーから別のサーバーへの切り替え(ダウンタイム)が低く抑えられている限り、この操作にかかる時間は実際には重要ではありません。 考慮されるアプローチ バックアップと復元 これは過去に行われたことがありますが、内部ネットワークを介して行われたにもかかわらず、インターネットよりも効率的にダウンタイムが長くなりました ログ配布 私の知る限り、このアプローチは、マスター/スレーブを構成し、マスターDBの正確なコピーを読み取り専用のスレーブに転送することにより、ダウンタイムを最小限に抑えます。上記のように、スレーブへのアクセスは不要であり、データ破損なしでマスターDBのレプリカを保持する方法が必要です。 また、リソース使用率の面でも非常に効率的であるようで、マスターのパフォーマンスにはほとんど影響しません。 私はこのアプローチについて間違っているかもしれませんので、私を修正してください。 データベースミラーリング 私はそのアプローチをあまり認識していませんが、有効なオプションのようです。リアルタイムで同期する必要はなく、マスターのパフォーマンスは非常に重要であるため、このアプローチを選択する場合は非同期が最適です。 別のオプション? このサーバーはベアメタルハードウェア上で直接実行されるため、残念ながら低レベルのソリューションはオプションではありません。たぶんこれを達成するためのより良い方法がありますか? 制約 説明したように、これらのデータベースは維持するのが難しいほど大きなものですが、それは別の問題です。 SQL Serverのバージョンは同じです(Microsoft SQL Server 2012 Enterprise 64ビット)。 2つのデータセンター間のネットワーク経由で転送する必要があるため、おそらくインターネット経由で転送する必要があります。最初の同期のために、あるサイトから別のサイトにディスクを送信することは、残念ながらオプションではありません。転送に何らかのセキュリティを持たせることが理想的ですが、この状況を最大限に活用します。 これにより、このタスクに対する私たちのニーズの非常に良い概要が得られるはずです。

1
サブクエリテーブルに関連付けられたOUTPUTで挿入
データベースの構造を変更しています。テーブルFinancialInstitutionのいくつかの列の内容は、テーブルPersonに転送する必要があります。FinancialInstitutionは、外部キーを持つPersonにリンクされています。各金融機関には、対応する個人のIDが必要です。そのため、Personに挿入された新しい行ごとに、この新しい行のID(IDENTITY)をFinancialInstitutionの対応する行にコピーする必要があります。 これを実行する明白な方法は、反復T-SQLコードです。しかし、セットベースの操作でのみ可能かどうかを知りたいと思っています。 そのようなリクエストの内部レベルは次のようなものになると想像しました。 INSERT INTO Person (Street1, Number1, City1, State1, PostCode1, CountryId1, WorkDirectPhone1, Fax1, Email1) OUTPUT inserted.Id, FinancialInstitution.Id SELECT Id, Street, Number, City, [State], PostCode, CountryId, PhoneNumber, Fax, Email FROM FinancialInstitution; 残念ながら、OUTPUTはそのように相関できないようです...

2
PostgreSQLチェックポイントで何が起こりますか?
チェックポイントログの一部を次に示します。 2014-03-26 11:51:29.341 CDT,,,18682,,532854fc.48fa,4985,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 15047 buffers (1.4%); 0 transaction log file(s) added, 0 removed, 30 recycled; write=68.980 s, sync=1.542 s, total=70.548 s; sync files=925, longest=0.216 s, average=0.001 s",,,,,,,,,"" 2014-03-26 11:56:05.430 CDT,,,18682,,532854fc.48fa,4987,,2014-03-18 09:15:24 CDT,,0,LOG,00000,"checkpoint complete: wrote 16774 buffers (1.6%); 0 transaction log file(s) added, 0 removed, 31 …
22 postgresql 

2
LIKEはインデックスを使用しますが、CHARINDEXは使用しませんか?
この質問は私の古い質問に関連しています。以下のクエリの実行には10〜15秒かかりました。 SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE (Charindex('123456789',CAST([company].dbo.[customer].[Phone no] AS VARCHAR(MAX)))>0) 一部の記事では、インデックスを使用CASTしてCHARINDEXもメリットが得られないことがわかりました。またLIKE '%abc%'、インデックスを使用してもメリットはありませんが、インデックスを使用してもメリットがないという記事もありますLIKE 'abc%'。 http://bytes.com/topic/sql-server/answers/81467-using-charindex-vs-like-where /programming/803783/sql-server-index-any-improvement-for -like-queries http://www.sqlservercentral.com/Forums/Topic186262-8-1.aspx#bm186568 私の場合、クエリを次のように書き換えることができます。 SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [company].dbo.[customer] WHERE [company].dbo.[customer].[Phone no] LIKE '%123456789%' このクエリは、前のクエリと同じ出力を提供します。columnの非クラスター化インデックスを作成しましたPhone no。このクエリを実行すると、わずか1秒で実行されます。これは、以前の14秒と比較して大きな変化です。 どのようにLIKE '%123456789%'インデックスからの利点は? リストされた記事にパフォーマンスが改善されないと記載されているのはなぜですか? 使用するクエリを書き直そうとしましたCHARINDEXが、パフォーマンスはまだ遅いです。クエリのCHARINDEXように表示されるのに、なぜインデックス付けのメリットがないのLIKEですか? を使用したクエリCHARINDEX: SELECT [customer].[Customer name],[customer].[Sl_No],[customer].[Id] FROM [Company].dbo.[customer] WHERE ( Charindex('9000413237',[Company].dbo.[customer].[Phone no])>0 ) 実行計画: を使用したクエリLIKE: SELECT [customer].[Customer …

5
PostgreSQL:データベースから1つのスキーマのみをバックアップし、別のサーバーに復元する方法
2つのスキーマ「B」と「C」を持つ「A」という名前のデータベースがあります。別のサーバーでスキーマ「B」をバックアップおよび復元したいですか?私はPostgresが初めてなので、これを行う方法がわかりません。「A」という名前の新しいサーバーに新しいDBを作成し、その上にスキーマ「B」を復元する必要がありますか。plsはコマンドを支援します。 --- ピーターの答えに対するコメントからの情報: スキーマ「B」+データをバックアップおよび復元したい。第二に、Ubuntu 12.04で実行されているPostgresql 9.1について言及するのを忘れました

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