簡體   English   中英

如果查詢對550萬條記錄的表進行全表掃描,那么數據庫的性能將如何受到影響

[英]How is the performance of the database affected if a query does a full table scan on a table of 5.5 million records

有人可以幫我一些有關數據庫性能的建議嗎?

這是場景:

我們在工作中使用SQL Server數據庫,並且在一個表(分子生物學的東西)中存儲了超過550萬個配置文件。 年平均增長率約為50萬。 概要文件本身包含21個varchar字段,每個字段的平均長度約為5個字符。 它們是字符字段,因為它們也可以存儲文字值:“ mix / mix”,“ nr”,“ nd”,“ del / del”。 一組醫學科學家要求我實施搜索實用程序,使他們能夠動態構建查詢以搜索具有這些字段的各種排列的配置文件。 我現在面臨的難題是如何最大程度地減少對數據庫性能的影響,因為我設想這樣的查詢通常會進行全表掃描。 我無法預測科學家將使用哪些領域排列。 他們可以使用如下形式:

WHERE field2 = "18/11"
  AND field7 = "12.7/15"
  AND field8 LIKE "%12%"
  AND field12 = "12/8.3"

或類似這樣的東西:

WHERE field1 = "X/Y"
  AND field5 IN ("12/12","12/13","12/14","13/13","13/14","14/14")
  AND field10 = "12.7/15"
  AND field12 IN ("11/11","11/12","11/13","11/14","11/15","12/12")
  ...
  AND field21 = "9/11.8"

和許多其他可能的組合...

各種排列的查詢似乎始終需要約1.5分鍾的時間來執行。 這本身是科學家可以接受的,但是讓我擔心的是,這將如何影響數據庫的性能。 它會占用CPU,並且在實用程序執行查詢時它將對其他醫務人員無響應嗎?

任何意見是極大的贊賞。 非常感謝!

您可能想要實現索引以加快查詢速度。 哪些索引取決於檢查可能會生成的所有查詢。

例如,第一個索引建議在(field2, field7, field12)上建立索引。

索引確實會導致數據修改( insertupdatedelete )的額外費用。 但是,您的更新量似乎很少,因此這可能不是一個大問題。

另一種可能性是以可以使用全文本搜索的方式轉換查詢條件。 這將需要將查詢中的值修改為全文索引更好的索引-例如,不要以數字開頭的值,而不能用其他斜杠代替。 但是,如果您確實需要性能,則您的查詢將非常適合此類索引。

最后,投資更多的內存可能也值得。 聽起來您的表可以容納幾GB的內存,並且在內存中對該表進行全表掃描應該比您現在看到的要快。

  1. 您有很多列,並且顯然不使用它們中的大多數,這可能表明您能夠執行表規范化,因為可能會有很多冗余數據。 這可以允許您將某些選擇限制為僅歸一化表的一部分。 如果操作不當,標准化會使性能變差,如果您沒有足夠的冗余,則標准化可能不適用於您的情況。

  2. 在這里創建大型復合索引沒有任何意義,只需查看數據庫統計信息並確定使用最多的列並分別對其進行索引。 目的是使索引可重用,而復合索引在您的情況下無法實現。 由於這主要是一個參考表(如果我收集正確,您只是在插入數據)具有多個索引不會造成問題。

  3. 根據用戶的使用習慣,您需要確定按非常常用的列進行分區是否比索引更好。 當選擇返回的行數超過10%時,分區通常是有效的。

  4. 長時間運行的查詢當然不會占用數據庫,因為它是多線程的,但是由於需要不斷進行線程上下文切換,因此它們會減慢其他查詢的速度。 一個解決方案是確保您的數據庫正在使用CPU的所有內核(在這方面不熟悉SQL Server)。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM