データベース管理者

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

2
SQL Serverのキャッシュからテーブルをクリアするにはどうすればよいですか?
キャッシュすべきではないテーブルがデータベースにいくつかあります。 SQL Serverにテーブルのページをキャッシュしないように指示する方法、またはキャッシュから単一のテーブルをフラッシュする方法 すべてのキャッシュをフラッシュすることはオプションではありません。 SQL Server 2008とSQL Server 2008 R2を使用しています。

4
SQL Serverのパーティション分割-パーティションキーに何を使用するか
私はSQL Serverのパーティション分割を扱ったことがありませんが、現在、ボリュームがおそらくそれを保証するデータベースの設計に直面しています。システムはクーポン用です。クーポンは定期的に発行され、通常は6週間ごとに発行されますが、特別イベントなどの臨時の発行も行われます。1,500万人の顧客がおり、各発行イベントに対して、すべての顧客が6種類の異なるクーポンタイプを受け取り、合計9000万のクーポンインスタンスを提供します。通常、クーポンの有効期間は6週間ですが、クーポンインスタンスの償還データを追跡して6か月間維持する必要があります。無効なクーポンの引き換えリクエストは、POSによって検証されるため、データベースに到達しません。 6か月間で、クーポンインスタンステーブルには最大3億6,000万行、リデンプションテーブルには最大7,200万行(最大20%の償還率を想定)を格納する必要があります。これらの数値は単一のパーティションには大きすぎると感じますか? 私の質問は-パーティションキーとして何を使うのですか?明らかな候補の1つは、発行イベントによるもので、約6つのパーティションを提供します。しかし、それでも、パーティションサイズが大きすぎて最適なパフォーマンスを実現できないと思いますか?たとえば、発行イベント+カスタマーIDの最後の桁など、2つのキーでパーティション化することはできますか?したがって、ロジックは次のようになります。 If issuance event = 1 and last digit of customer id < 5 then Store in partition 1 Else if issuance event = 1 and last digit of customer id >4 then Store in partition 2 Else if issuance event =2 and last digit of customer …

2
SELECTでパーティション化された列ストアのデッドロックを防ぐ方法
SQL Server 2016に3つのクラスター化列ストアインデックス(CCI)テーブルがあります。これらのCCIはすべて、テナントIDに基づいて同じパーティションスキームにあります。最近、一貫性のない方法で、結合からこれらのテーブルへの単純な選択ステートメントでデッドロックが発生しています。デッドロックするクエリの例: SELECT TOP 33 r.tenantid FROM Table_r r INNER JOIN Table_cm cm ON r.MyKey=cm.MyKey INNER JOIN Table_pe pe ON r.MyKey=pe.MyKey WHERE r.TenantId = 69 AND pe.TenantId = 69 AND cm.TenantId = 69 エラーメッセージ: トランザクション(プロセスID 56)は、別のプロセスで汎用の待機可能なオブジェクトリソースでデッドロックされ、デッドロックの犠牲者として選択されました。トランザクションを再実行します。 手がかり: クエリがCCI以外の別のインデックスを使用する場合、デッドロックは発生しません。 3つのテナントフィルターのうち2つを削除しても、デッドロックしません。 トップ32以下を選択しても、デッドロックは発生しません。 OPTION(MAXDOP 1)を追加しても、デッドロックは発生しません。 スクランブルされたPRODレプリカ、PROD読み取り専用セカンダリ、およびPROD自体でこれを再現できます。 この動作をDEVまたはINTで再現できません。 3つのテーブル結合すべてにWITH(NOLOCK)を追加すると、依然としてデッドロックが発生します クエリ自体がデッドロックします。他にアクティブなプロセスがない場合はデッドロックします。 並列処理のないクエリプランはデッドロックしない デッドロックxmlはこちら PRODバージョン: …

1
スパース列、CPU時間、フィルターされたインデックス
スパース スパース列でいくつかのテストを行うとき、あなたがそうであるように、直接的な原因を知りたいパフォーマンスの低下がありました。 DDL 2つの同一のテーブルを作成しました。1つはスパース列が4つあり、もう1つはスパース列がないものです。 --Non Sparse columns table & NC index CREATE TABLE dbo.nonsparse( ID INT IDENTITY(1,1) PRIMARY KEY NOT NULL, charval char(20) NULL, varcharval varchar(20) NULL, intval int NULL, bigintval bigint NULL ); CREATE INDEX IX_Nonsparse_intval_varcharval ON dbo.nonsparse(intval,varcharval) INCLUDE(bigintval,charval); -- sparse columns table & NC index CREATE TABLE dbo.sparse( …

1
なぜ列型にNULLをキャストする必要があるのですか?
大量の更新を行うためのコードを生成し、次のようなSQLを生成するヘルパーがあります。 (アクティブフィールドとコアフィールドの両方がタイプですboolean) UPDATE fields as t set "active" = new_values."active","core" = new_values."core" FROM (values (true,NULL,3419), (false,NULL,3420) ) as new_values("active","core","id") WHERE new_values.id = t.id; しかしそれは失敗します: ERROR: column "core" is of type boolean but expression is of type text ::booleannullに追加することで機能させることができますが、奇妙に思えますが、なぜNULLは型と見なされますTEXTか? また、どの型にNULLをキャストするかを知るためにコードを再調整する必要があるため、キャストするのは少し難しいです(現在、列と値のリストは、JSONオブジェクトの単純な配列から自動生成されています)。 。 なぜこれが必要なのですか?NULLのタイプを知るために生成コードを必要としない、よりエレガントなソリューションがありますか? それが適切であれば、Node.JSでsequelizeを使用してこれを行いますが、Postgresコマンドラインクライアントでも同じ結果が得られます。
10 postgresql  null  cast 

1
他のデータベースのアカウントなしで、他のデータベースのテーブルに基づいてビューにアクセスする
database2のテーブルに基づいて、database1にビューを作成しました。SELECTdatabase1にのみアクセスできるユーザーに許可を与えました。データベース2にアカウントがないため、ユーザーはこのビューを機能させることができません。この問題を解決するにはどうすればよいですか?database2にアカウントを作成したくありません。

1
リンクサーバーに対するOPENQUERYの8000文字の制限
OPENQUERYSSRS / SQL Server 2014で実行しようとしているクエリがありますが、次のエラーが発生し続けます。 [...]で始まる文字列が長すぎます。最大長は8000です。 この制限を回避する方法はありますか? 参考までに、リンクされたMySQLサーバーを介してSSRSからクエリを実行しようとしています。

2
「LIKE OR LIKE、OR LIKE、OR LIKE、OR LIKE」のより良いアプローチ
この質問では、彼は私と同じ問題を抱えています。私は次のようなものが必要です: select * from blablabla where product like '%rock%' or like '%paper%' or like '%scisor%' or like '%car%' or like '%pasta%' これは醜く、インデックスを使用していません。この場合、これは実際にこれを行う唯一の方法です(文字列内の複数の単語を選択するため)、またはFULLTEXTを使用する必要がありますか? 私が理解しているように、フルテキストでは、文字列内の複数の単語を選択できます。 この質問は全文についても話します

1
ゴーストクリーンアップの設定
高トランザクションデータベースを実行しています(平均で17.5万トランザクション/分、1時間あたり約900万レコードが追加および削除されます)。 750万件のレコードが追加および削除されたため、最近までこれはそれほど問題ではありませんでしたが、最新の大量のデータにより、ゴーストクリーンアップはクリーンアップに追いつくことができないようです。テーブル/インデックスの未使用スペース。 数日前に、16テーブル(主に2つ)全体で53 GBの「未使用スペース」に達したため、ゴーストクリーンアッププロセスの調査が始まり、5秒ごとに実行され、10ページ以上実行されることがわかりました。 私の現在の解決策は、早朝、次のコマンドの3つのスレッドを実行していることです。 DECLARE @2hours datetime = dateadd(hour,2,getutcdate()) WHILE getutcdate() < @2hours BEGIN DBCC FORCEGHOSTCLEANUP ('DBNAME') WITH NO_INFOMSGS END 前日の夜のバックログに追いつくため(ほとんどの削除が行われるとき) デフォルトの設定を5秒と10ページから毎秒と言って変更したり、20ページを超えるようにしたりする方法はあるのでしょうか。それを行う方法はありますか。それとも、複数のクリーンアップ手順をスピンアップして、データ、またはこれを支援できる他のアクションがある場合 インデックスの再作成は、影響を受けるほとんどのインデックスに対して少なくとも週1回実行されます(ほとんどは隔日です) AlwaysOn高可用性クラスター上のSQL Server 2012 Enterprise SP3_CU8(明日はCU9にアップグレード)もレプリケーション(別のサーバーに配布)あり

4
SSISでスクリプトタスクのバージョンを変更する方法
VS2015のSSISプロジェクトにスクリプトタスクを追加しました。SQL Server 2016に展開すると、version 15.0スクリプトがサポートされていないというエラーメッセージが表示されました。 これはどこにありますversion 15 come fromか?スタックオーバーフローに関する他の同様の質問を読むと、プロジェクトのターゲットバージョンをSQL Server 2012に設定できることがわかります(私が行った(最終的な展開ターゲットはSQL Server 2012))。 また、スクリプトタスクを削除して再作成してみました。スクリプトの情報では、C#のV10を使用していると記載されています。 どうすればこれを解決できますか? スクリプトタスク:エラー: XMLからスクリプトタスクを読み込むときに例外が発生しました:System.Exception:スクリプトタスク "" ST_a1ad9dc5972c42b68c12a13155f10b6d ""は、このリリースのIntegration Servicesでサポートされていないバージョン15.0スクリプトを使用しています。パッケージを実行するには、スクリプトタスクを使用して新しいVSTAスクリプトを作成します。ほとんどの場合、%SQL_PRODUCT_SHORT_NAME%Integration ServicesでSQL Server Integration Servicesパッケージを開くと、サポートされているバージョンを使用するようにスクリプトが自動的に変換されます。Microsoft.SqlServer.Dts.Tasks.ScriptTask.ScriptTask.LoadFromXML(XmlElement elemProj、IDTSInfoEvents events)で」 SSDT 2012でもプロジェクトを開き、別の名前で再構築しました。同じエラー。削除されていない参照などがあるはずです。 この質問の解決策(/programming/34893267/ssis-script-task-vs15-not-work-when-deploy-on-sql-server-2014)はどれも機能しませんでした。 スクリプトが含まれているパッケージのXMLを見ると、そのタスクを簡単に見つけることができます。バージョン15への参照はどこにもありません。 ===========編集 データベースをホストするマシンにプロジェクトをコピーし、VS2015を開いてそこからデプロイすると、パッケージが実行されます。 そして、私のマシンに戻ってそこでビルドするときは、そうではありません。 これはバグですか?または、ビルドがVSからのウィザードを使用するのと同じ展開ウィザードを生成することを期待して、私は何か愚かなことをしていますか? SQL Server 2016(13.0.4411.0)がssisdbあり、スキーマバージョン(13.0.1601.5)があります。 Visual Studio 2015で作成された統合サービスパッケージを使用しています。スクリプトコンポーネントにはパスがあります。C:\Program Files (x86)\Microsoft SQL Server\130\DTS\Binn\VSTA14_IS_ST_CS_Template.vstax統合サービスカタログからパッケージを実行することはできません(Zachのメッセージが原因です)。ただし、ファイルシステムから(SQLエージェントを使用して)実行できるようです。これが機能しているかどうかは不明ですが、パッケージが完了すると更新されます。
10 ssis 

1
PostgreSQL:SSL SYSCALLエラー:EOFが検出されました
最初に、このエラーに関連するいくつかの投稿を検索して見つけましたが、それらのほとんどはRAMの問題かSSLの問題のどちらかを指しているため、コマンドラインにsslmode = disabledを追加してSSLの可能性を克服しようとしました: psql -U waypoint -d waypoint -W -c "alter table telemetria_data.historico alter clase type smallint, alter valor type real[], alter power type smallint, alter voltaje type real;" -h localhost -v sslmode=disable しかし、同じメッセージが表示されました: SSL SYSCALL error: EOF detected connection to server was lost 考えられるメモリの問題について、トラブルシューティングの方法がわかりません。 データ構造はこの質問で説明されているものであり、継承されたすべてのテーブルに対して完全な変更テーブルを完成させるには、非常に長時間実行されるクエリになる可能性があります。 OS: Linux ip-10-1-0-9 3.16.0-4-amd64 …

5
自己結合の代替
私はここで質問をしました:https: //stackoverflow.com/questions/43807566/how-to-divide-two-values-from-the-same-column-but-at-different-rows 同じ列の異なる行にある同じテーブルの値の分割について。今、私はより多くの分子と分母(異なるuns)を持っているという問題を抱えています。self joinPostgresでこの問題を解決する良い方法はまだありますか、それともより良い解決策がありますか? 例: | postcode | value | uns | |----------|-------|-----| | AA | 40 | 53 | | BB | 20 | 53 | | AA | 10 | 54 | | AA | 20 | 55 | | AA | 10 | 56 | | AA …

1
ページ圧縮を使用する場合の行オーバーヘッドは何ですか?
650 Numeric(19,4)列のテーブルを作成しました。実行してページ圧縮をオンにすると ALTER TABLE fct.MyTable REBUILD WITH (DATA_COMPRESSION = PAGE); 私は得る メッセージ1975、レベル16、状態1のインデックス「PK_Mytable」の行の長さが、許容される最大長の「8060」バイトを超えています。 しかし、9バイトの650倍は5850バイトにすぎず、これは指定された制限の8060バイトからはかなりかけ離れています。 サーバーは、SQL Server 2016 SP1 CU2でWindows 2012 r2を実​​行しています ページ圧縮を使用する場合の行オーバーヘッドは何ですか? ここに私が何を意味するかを示すいくつかのコードがあります: /* test script to demo MSG 1975 */ DECLARE @sql NVARCHAR(max)='', @i INT =0 drop table if exists dbo.mytable; SET @sql = 'Create table dbo.Mytable (MyTableID bigint not …

2
フラグとテーブルの分割
私は(潜在的に)数千万のレコードを含むアイテムのテーブルを設計しています。一部のアイテムは、管理者によって「承認」されるまで使用できません。「使用」とは、そのような項目が「承認」されるまで他のテーブルで参照されないことを意味します。アイテムの最大50%は、いつでも「承認されない」可能性があります。レコードは「承認」される可能性がありますが、その逆はできません。 2つの設計オプションを検討します。 ビットフラグ 「未承認」アイテムの個別のテーブル-アイテムが承認されると、「通常」テーブルに移動されます(アイテムのIDの更新は問題ではありません) 2番目のオプションの方がはるかに良いと思います。ビットフラグは行ごとに1バイトしかとらないため、問題はありません。ただし、同じテーブルに100万件の承認済みレコードと100万件の未承認レコードがある場合、承認済みレコードを使用した操作のスキャン時間は増加します。 質問は、代わりに最初の(ビットフラグ)オプションを検討する必要がありますか?説明されている状況で何かメリットがありますか?

2
複合外部キーに別の一意制約が必要なのはなぜですか?
以下は、レコードが同じテーブル内の親レコードを参照できる単純なテーブルです。 CREATE TABLE foo ( id SERIAL PRIMARY KEY, parent_id INT NULL, num INT NOT NULL, txt TEXT NULL, FOREIGN KEY (parent_id) REFERENCES foo(id) ); 他のフィールド値(num)の1つが親レコードと子レコードの間で同一でなければならないという追加の要件により、複合外部キーでうまくいくと思いました。最後の行を FOREIGN KEY (parent_id, num) REFERENCES foo(id, num) となったエラー:参照された表「foo」というのキーを与えられた一意の制約マッチングはありません。 この制約は簡単に追加できますが、参照される列(id)の1つが既に一意であることが保証されているのに、なぜ必要なのかわかりません。私の見たところ、新しい制約は冗長になります。

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